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 来理解就很简单了。