Android-实现View滑动的6种方式
1.View的滑動簡介
View的滑動是Android實現自定義控件的基礎,同時在開發中我們也難免會遇到View的滑動的處理。其實不管是那種滑動的方式基本思想都是類似的:當觸摸事件傳到View時,系統記下觸摸點的坐標,手指移動時系統記下移動后的觸摸的坐標并算出偏移量,并通過偏移量來修改View的坐標。?
實現View滑動有很多種方法,這篇文章主要講解六種滑動的方法,分別是:layout()、offsetLeftAndRight()與offsetTopAndBottom()、LayoutParams、動畫、scollTo與scollBy和Scroller;在下一篇文章我們會詳細介紹屬性動畫。
2.實現View滑動的六種方法
1.layout()
view進行繪制的時候會調用onLayout()方法來設置顯示的位置,因此我們同樣也可以通過修改View的left、top、right、bottom這四種屬性來控制View的坐標。首先我們要自定義一個View,在onTouchEvent()方法中獲取觸摸點的坐標:
public boolean onTouchEvent(MotionEvent event) {//獲取到手指處的橫坐標和縱坐標 int X = 0, newX = 0; int Y = 0, newY = 0; switch (event.getAction()) {case MotionEvent.ACTION_DOWN:Log.d("hahahhaha", "屏幕位置被按下"); X = (int) event.getX(); Y = (int) event.getY(); break; 接下來我們在ACTION_MOVE事件中計算偏移量,再調用layout()方法重新放置這個自定義View的位置就好了:
public boolean onTouchEvent(MotionEvent event) {//獲取到手指處的橫坐標和縱坐標 int X = 0, newX = 0; int Y = 0, newY = 0; switch (event.getAction()) {case MotionEvent.ACTION_DOWN:Log.d("hahahhaha", "屏幕位置被按下"); X = (int) event.getX(); Y = (int) event.getY(); break; case MotionEvent.ACTION_MOVE:Log.d("hahahhaha", "屏幕位置在移動"); newX = (int) event.getX(); newY = (int) event.getY(); int offsetX = newX - X; int offsetY = newY - Y; Log.d("hahaha", "offsetX=" + offsetX + ",offsetY=" + offsetY); //1.調用layout方法來重新放置它的位置 layout(getLeft()+offsetX, getTop()+offsetY, getRight()+offsetX , getBottom()+offsetY); 當我們每次移動時都會調用layout()方法來對自己重新布局,從而達到移動View的效果。
2.offsetLeftAndRight()與offsetTopAndBottom()
這兩種方法和layout()方法效果方法差不多,使用也差不多,我們將ACTION_MOVE中的代碼替換成如下代碼:
case MotionEvent.ACTION_MOVE://計算移動的距離int offsetX = x - lastX;int offsetY = y - lastY;//對left和right進行偏移offsetLeftAndRight(offsetX);//對top和bottom進行偏移offsetTopAndBottom(offsetY);break;3.LayoutParams(改變布局參數)
LayoutParams主要保存了一個View的布局參數,因此我們可以通過LayoutParams來改變View的布局的參數從而達到了改變View的位置的效果。同樣的我們將ACTION_MOVE中的代碼替換成如下代碼:
LinearLayout.LayoutParams layoutParams= (LinearLayout.LayoutParams) getLayoutParams();layoutParams.leftMargin = getLeft() + offsetX;layoutParams.topMargin = getTop() + offsetY;setLayoutParams(layoutParams);- 1
- 2
- 3
- 4
因為父控件是LinearLayout,所以我們用了LinearLayout.LayoutParams,如果父控件是RelativeLayout則要使用RelativeLayout.LayoutParams。除了使用布局的LayoutParams外,我們還可以用ViewGroup.MarginLayoutParams來實現:
ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) getLayoutParams();layoutParams.leftMargin = getLeft() + offsetX;layoutParams.topMargin = getTop() + offsetY;setLayoutParams(layoutParams);4.scollTo與scollBy
scollTo(x,y)表示移動到一個具體的坐標點,而scollBy(dx,dy)則表示移動的增量為dx、dy。其中scollBy最終也是要調用scollTo的。scollTo、scollBy移動的是View的內容,如果在ViewGroup中使用則是移動他所有的子View。我們將ACTION_MOVE中的代碼替換成如下代碼:
((View)getParent()).scrollBy(-offsetX,-offsetY);- 1
- 1
這里要實現CustomView隨著我們手指移動的效果的話,我們就需要將偏移量設置為負值。
5.Scroller
我們用scollTo/scollBy方法來進行滑動時,這個過程是瞬間完成的,所以用戶體驗不大好。這里我們可以使用Scroller來實現有過度效果的滑動,這個過程不是瞬間完成的,而是在一定的時間間隔完成的。Scroller本身是不能實現View的滑動的,它需要配合View的computeScroll()方法才能彈性滑動的效果。?
在這里我們實現CustomView平滑的向右移動。
- 首先我們要初始化Scroller:
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
- 接下來重寫computeScroll()方法,系統會在繪制View的時候在draw()方法中調用該方法,這個方法中我們調用父類的scrollTo()方法并通過Scroller來不斷獲取當前的滾動值,每滑動一小段距離我們就調用invalidate()方法不斷的進行重繪,重繪就會調用computeScroll()方法,這樣我們就通過不斷的移動一個小的距離并連貫起來就實現了平滑移動的效果:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 調用Scroller.startScroll()方法。我們在CustomView中寫一個smoothScrollTo()方法,調用Scroller.startScroll()方法,在2000毫秒內沿X軸平移delta像素:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 最后我們在ViewSlideActivity.java中調用CustomView的smoothScrollTo()方法:
- 1
- 2
- 1
- 2
這里我們是設定CustomView沿著X軸向右平移400像素。
6.動畫
可以采用View動畫來移動,在res目錄新建anim文件夾并創建translate.xml:
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"><translate android:fromXDelta="0" android:toXDelta="300" android:duration="1000"/> </set>- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
在Java代碼中引用:
mCustomView.setAnimation(AnimationUtils.loadAnimation(this, R.anim.translate));- 1
- 1
當然使用屬性動畫移動那就更簡單了,我們讓CustomView在1000毫秒內沿著X軸像右平移300像素:
ObjectAnimator.ofFloat(mCustomView,"translationX",0,300).setDuration(1000).start();總結
以上是生活随笔為你收集整理的Android-实现View滑动的6种方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三个案例带你看懂LayoutInflat
- 下一篇: android sina oauth2.