View的移動(offsetTopAndBottom,scrollBy,scrollTo)

以下三種爲最基本設置控件瞬移的方法

1.通過直接更改view的left,top,right,bottom的方法(瞬間改變)

layout():改變了left,top,right,bottom,並在setFrame()中調用---invalidate()---onSizeChanged(newWidth, newHeight, oldWidth, oldHeight);---invalidate()---r.set--- p.invalidateChild(this, r);

offsetLeftAndRight():正數向右移動,負數向左移動

offsetTopAndBottom():正數向下移動,負數向上移動

5.offsetTopAndBottom(20)

正數向下移動,負數向上移動


2.scroll方法瞬間移動(是控制子view的移動,left,top,right,bottom不變)

tv.getScrollY()=20:相對於初始位置向上滑動了20px

1.tv.scrollBy(20, 0);

向左移動20px,tv.getScrollX()=20;

2.tv.scrollBy(-20, 0);

向右移動20px,tv.getScrollX()=-20;


3.tv.scrollBy(0, 20);

向上移動20px,tv.getScrollY()=20;

4.tv.scrollBy(0,-20);

向下移動20px,tv.getScrollY()=-20;


3.改變佈局的實際參數來達到瞬間移動(LayoutParams,view的上下左右的參數也發生了改變)


以下兩種爲最基本設置控件平滑移動的方法:

1.scroller配合scrollTo來控制內部view的平滑移動(scroller實際上只是賦予了計算效果,可配合上面三種任何一種的移動)

scroller設置距離的計算與時間,並在computeScroll中判斷計算是否結束,沒結束就通過scrollTo來實現位移

// 調用此方法設置滾動的相對偏移
	public void smoothScrollBy(int dx, int dy) {

		// 設置mScroller的滾動偏移量
		// mScroller.startScroll(mScroller.getFinalX(), mScroller.getFinalY(), dx, dy);
		mScroller.startScroll(0, 0, dx, dy);
		invalidate();// 這裏必須調用invalidate()才能保證computeScroll()會被調用,否則不一定會刷新界面,看不到滾動效果
	}

	@Override
	public void computeScroll() {

		// 先判斷mScroller滾動是否完成
		if (mScroller.computeScrollOffset()) {

			// 這裏調用View的scrollTo()完成實際的滾動
			scrollTo(mScroller.getCurrX(), mScroller.getCurrY());

			// 必須調用該方法,否則不一定能看到滾動效果
			postInvalidate();
		}
		super.computeScroll();
	}

2.通過ValueAnimator的計算效果,在回調方法onAnimationUpdate中配合上面三種的任何一種實現平滑移動


*通過ViewDragHelper來手指拖動,以及釋放後的平滑效果(這是一個功能非常強大的類):

用手 拖動的時候是通過offsetLeftAndRight來實現位移的,當手指釋放後是通過mScroller.startScroll來計算,並在computeScroll()中調用mDragHelper.continueSettling(true)來實現移動的,而continueSettling中也是通過offsetLeftAndRight來實現移動的


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章