Android Scroller分析

Scroller,这个对象里有startScroll方法的重载,提供的起始点和将要滑动的距离开始滚动。如下:

public void startScroll (int startX, int startY, int dx, int dy) 

public void startScroll(int startX, int startY, int dx, int dy, int duration)

参数:

startX 起始移动的x坐标值

dx 表示滑动的距离,正值向左滑,负值向右滑。

duration 滚动持续的时间,没有该参数时表示使用缺省时间250ms

startScroll()执行过程中即在duration时间内,computeScrollOffset ()方法会一直返回true,但当动画执行完成后会返回返加false。

在调用startScroll()方法时,我们通常还需使用到ViewGroup的computeScroll ()方法,而调用invalidate()或postInvalidate()都会导致这个方法执行。

/**
	 * 移动动画
	 */
	private void scrollAnimation() {
		Log.d(tag, "isOpenLeftMenu==" + isOpen);
		// 获取view在屏幕左边的开始坐标和结束坐标
		int startX = getScrollX();
		int endX = 0;
		if (isOpen) {
			endX = -mLeft_menu.getMeasuredWidth();
		} else {

		}
		int dx = endX - startX;
		int dy = 0;
		int duration = Math.abs(dx) * 2;
		mScroller.startScroll(startX, 0, dx, dy, duration);

		invalidate();// 刷新界面
	}

	@Override
	public void computeScroll() {
		// 判断动画是否结束
		if (mScroller.computeScrollOffset()) {// 返回true表示没有完成
			int currX = mScroller.getCurrX();
			scrollTo(currX, 0);

			invalidate();
		}
		super.computeScroll();
	}

以上代码摘自这篇博客自定义滑动菜单SlidingMenu,当startScroll()执行后,就回去执行invalidate(),该方法就会去调用computeScroll 方法,而这个方法里再去调invalidate(),使得computeScroll()不断执行,这样就可以不断地去调用scrollTo方法了,直到mScroller动画结束

 

 

 

 

 

View上面还一个叫ScrollBy的函数,跟ScrollTo的区别在于,ScrollTo 是 到那个位置,ScrollBy 是经过这段位置,这个从英文的To 跟 By 来理解就很简单了。

你可能感兴趣的:(Android Scroller分析)