Android 實現 View 滑動的七種方法
阿新 • • 發佈:2019-01-25
記錄下系統提供的 View 滑動的 API 方法。不管採用哪一種方式,本質的思想基本上都是一致的,當觸控 View 的時候,記錄下當前觸控點的座標,當手指移動的時候,記錄移動後的觸控點座標,從而獲取相對上一次座標點的偏移量,通過偏移量來修改 View 的座標,這樣不斷重複,從而實現滑動過程。
- layout 方法
@Override
public boolean onTouchEvent(MotionEvent event) {
int x = (int) event.getX();
int y = (int) event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
lastX = x;
lastY = y;
break;
case MotionEvent.ACTION_MOVE:
int offsetX = x - lastX;// x 方向偏移量
int offsetY = y - lastY;// y 方向偏移量
layout(getLeft() + offsetX,
getTop() + offsetY,
getRight() + offsetX,
getBottom() + offsetY);
break ;
}
return true;
}
offsetLeftAndRight() 和 offsetTopAndBottom()
這個方法相當於系統對左右,上下移動的 API 的封裝。LayoutParams
LayoutParams 儲存了一個 View 的佈局引數,比如 width 和 height 引數,我們在通過 getLayoutParams() 獲取 View 的 LayoutParams 時候要主要父容器的型別,比如父佈局是 LinearLayout ,那麼就用 LinearLayout.LayoutParams ,當然我們可以用他們的父類 ViewGroup.MarginLayoutParams 來處理,程式碼如下:
ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) getLayoutParams();
layoutParams.leftMargin = getLeft() + offsetX;
layoutParams.topMargin = getTop() + offsetY;
setLayoutParams(layoutParams);
- scrollTo 和 scrollBy
((View) getParent()).scrollBy(-offsetX, -offsetY);
Scroller
Scroller 是我們在實現彈性滑動中非常重要的角色,Scroller 在使用中需要注意下面幾點。- 初始化Scroller
重寫 computeScroll() 方法
@Override public void computeScroll() { super.computeScroll(); //判斷 Scroller 是否執行完畢 if (mScroller.computeScrollOffset()) { ((View) getParent()).scrollTo(mScroller.getCurrX(), mScroller.getCurrY()); //通過重繪來不斷呼叫 invalidate(); } }
startScroll 開始彈性滑動
public void startScroll(int startX, int startY, int dx, int dy)
引數分別是 x 方向和 y 方向起始點,和 偏移的距離。
屬性動畫
- ViewDragHelper
ViewDragHelper 的具體用法和講解請看另一篇文章