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():
可以看出scrollBy()裡面只是呼叫了scrollTo(),只是他的滑動增加了一個累加減的過程。public void scrollBy(int x, int y) { scrollTo(mScrollX + x, mScrollY + y); }
二.改變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”的實現原理。