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);
  }

 

posted @ 2015-06-26 18:05  f9q  阅读(223)  评论(0)    收藏  举报