1. 程式人生 > >Android 實現 View 滑動的七種方法

Android 實現 View 滑動的七種方法

記錄下系統提供的 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 的具體用法和講解請看另一篇文章