TouchEvent(7)startScroll与computeScroll实现左右滑动动画
1.构造Scroller
private Scroller mScroller;
mScroller = new Scroller(context, new DecelerateInterpolator());
2.开始滚动(红色部分)
@Override public boolean onTouchEvent(MotionEvent event) { int x = (int) event.getX(); int y = (int) event.getY(); int offsetX; switch (event.getActionMasked()) { case MotionEvent.ACTION_DOWN: point.x = x; point.y = y; break; case MotionEvent.ACTION_MOVE: // 滑动 offsetX = point.x - x; int leftX = (int) leftMenu.getX(); int rightX = (int) rightMenu.getX(); int scrollX = getScrollX(); if (scrollX + offsetX <= leftX) { offsetX = scrollX - leftX; } /* * 右边界是不能是rightX,因为屏幕的宽度(它的宽度就是middle的宽度)大于right的宽度, * 如果scrollX=rightX,那么后面将有空白显示. scrollX到右边界的距离必需是right的宽度. */ int rightEnd = rightX - (middleMenu.getMeasuredWidth() - rightMenu .getMeasuredWidth()); if (scrollX + offsetX >= rightEnd) {// scrollX不能超过rightEnd offsetX = rightEnd - scrollX; } scrollBy(offsetX, 0); point.x = x; point.y = y; break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: // 左右滑动动画 int curScrollX = getScrollX(); if (Math.abs(curScrollX) > leftMenu.getMeasuredWidth() >> 1) {// 当前的x超过一半, if (curScrollX < 0) { offsetX = -leftMenu.getMeasuredWidth() - curScrollX; mScroller.startScroll(curScrollX, 0, offsetX, 0, 200); } else { offsetX = leftMenu.getMeasuredWidth() - curScrollX; mScroller.startScroll(curScrollX, 0, offsetX, 0, 200); } } else {//当前的x小于一半 mScroller.startScroll(curScrollX, 0, -curScrollX, 0, 200); } invalidate();//注意这个函数不可少. break; default: break; } return true; }
3.注意
scroller所在的view要 invalidate();
4.view的滚动回调函数computeScroll
// 滑动回调函数 @Override public void computeScroll() { super.computeScroll(); if (!mScroller.computeScrollOffset()) { return; } int tempX = mScroller.getCurrX(); scrollTo(tempX, 0); }

浙公网安备 33010602011771号