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来实现移动的


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