1. 程式人生 > >View事件體系之--View的滑動

View事件體系之--View的滑動

        我們在安卓開發中會碰到各種各樣的滑動,比如ListView的滑動,Viewpager的滑動,scrollview的滑動,滑動讓我們的app看起來更加的生動,使用者體驗也大大增強,如果我們想基於View或者ViewGroup來自定義View的話,那麼對View的滑動更加要有所瞭解。

     總體來說一般使View產生滑動可以通過以下幾種辦法:

    一.View自帶的scrollTo/scrollBy方法

        View自帶了使自己滑動的方法,我們來看看這兩個方法內部是如何實現讓View移動的。

        首先是scrollTo():

  public void scrollTo(int x, int y) { //引數是要移動到的位置x,y
    if (mScrollX != x || mScrollY != y) {//判斷要移到的位置是否與現在的位置重複
      int oldX = mScrollX;
      int oldY = mScrollY;
      mScrollX = x;
      mScrollY = y;
      <span style="font-family: Arial, Helvetica, sans-serif;">//流暢的移動view到指定位置,並重新整理檢視</span>
      invalidateParentCaches();
      onScrollChanged(mScrollX, mScrollY, oldX, oldY);
      if (!awakenScrollBars()) {
        postInvalidateOnAnimation();
      }
    }
  }

      再看看scrollBy():

 public void scrollBy(int x, int y) {
     scrollTo(mScrollX + x, mScrollY + y);
    }
可以看出scrollBy()裡面只是呼叫了scrollTo(),只是他的滑動增加了一個累加減的過程。

      二.改變LayoutParams的方法(改變佈局引數)

         一個view的佈局引數決定了這個view的位置,所以我們想要移動view,當然可以通過改變佈局引數然後要求重繪的方式來達到移動view的效果。

MarginLayoutParams params=(MarginLayoutParams)mButton.getLayoutParams();//首先獲得view的原始佈局引數
params.width+=10;//改變佈局引數
params.leftMargin+=10;
mButton.requestLayout();

         三.利用動畫

            動畫可以輕鬆實現view的移動,這裡不多說了。

        三種view的滑動方式的對比:

       scrollTo/scrollBy:可以方便的實現滑動並且不影響內部元素的單擊事件,但是它只能滑動View的內容,而不能滑動View的本身。

      改變佈局引數的方法:基本沒有什麼缺點,實現起來相對麻煩而已,它很適合一些具有互動性的View.

      動畫方式:主要適用於沒有互動的view和實現複雜的動畫效果。

       上面說的幾種view的滑動方式只是實現了View的生硬滑動,為了達到更加好的使用者體驗,我們還必須讓滑動更加的富有彈性,更加的生動,所以下一篇記錄一下“彈性滑動Scroller”的實現原理。