android开发艺术探索第三章 移动到指定位置和内外两种情况拦截分析

来源:互联网 发布:苏州2017打车软件 编辑:程序博客网 时间:2024/05/18 00:48

移动到指定位置的动画 移动的是内容

ObjectAnimator.ofFloat(mButton1,"translationX",0,100).setDuration(1000).start();final int startX = 0;            final int deltaX = 100;            ValueAnimator animator = ValueAnimator.ofInt(0,                    1).setDuration(1000);            animator.addUpdateListener(new AnimatorUpdateListener() {                @Override                public void onAnimationUpdate(ValueAnimator animator) {                    float fraction = animator.getAnimatedFraction();                    mButton1.scrollTo(startX + (int) (deltaX * fraction), 0);                }            });            animator.start();

外部拦截

onInterceptTouchEvent 方法中 down事件需要返回false否则子View收不到事件。

 @Override    public boolean onInterceptTouchEvent(MotionEvent event) {        boolean intercepted = false;        int x = (int) event.getX();        int y = (int) event.getY();        switch (event.getAction()) {        case MotionEvent.ACTION_DOWN: {            intercepted = false;            if (!mScroller.isFinished()) {                mScroller.abortAnimation();                intercepted = true;            }            break;        }        case MotionEvent.ACTION_MOVE: {            int deltaX = x - mLastXIntercept;            int deltaY = y - mLastYIntercept;            if (Math.abs(deltaX) > Math.abs(deltaY)) {//核心                intercepted = true;            } else {                intercepted = false;            }            break;        }        case MotionEvent.ACTION_UP: {            intercepted = false;            break;        }        default:            break;        } @Override    public boolean onTouchEvent(MotionEvent event) {        mVelocityTracker.addMovement(event);        int x = (int) event.getX();        int y = (int) event.getY();        switch (event.getAction()) {        case MotionEvent.ACTION_DOWN: {            if (!mScroller.isFinished()) {                mScroller.abortAnimation();            }            break;        }        case MotionEvent.ACTION_MOVE: {            int deltaX = x - mLastX;            int deltaY = y - mLastY;            scrollBy(-deltaX, 0);            break;        }        //松手后,根据速度和位移来判断上一页还是下一页        case MotionEvent.ACTION_UP: {            int scrollX = getScrollX();            int scrollToChildIndex = scrollX / mChildWidth;            mVelocityTracker.computeCurrentVelocity(1000);            float xVelocity = mVelocityTracker.getXVelocity();            if (Math.abs(xVelocity) >= 50) {                mChildIndex = xVelocity > 0 ? mChildIndex - 1 : mChildIndex + 1;            } else {                mChildIndex = (scrollX + mChildWidth / 2) / mChildWidth;            }            mChildIndex = Math.max(0, Math.min(mChildIndex, mChildrenSize - 1));            int dx = mChildIndex * mChildWidth - scrollX;            smoothScrollBy(dx, 0);//松手后做动画            mVelocityTracker.clear();            break;        }        default:            break;        }        mLastX = x;        mLastY = y;        return true;    }

内部拦截法(不推荐)

除down事件外,其他都拦截,然后子View调用disallow方法来获取

@Override    public boolean onInterceptTouchEvent(MotionEvent event) {        int x = (int) event.getX();        int y = (int) event.getY();        int action = event.getAction();        if (action == MotionEvent.ACTION_DOWN) {            mLastX = x;            mLastY = y;            if (!mScroller.isFinished()) {                mScroller.abortAnimation();                return true;            }            return false;        } else {            return true;        }    }@Override    public boolean dispatchTouchEvent(MotionEvent event) {        int x = (int) event.getX();        int y = (int) event.getY();        switch (event.getAction()) {        case MotionEvent.ACTION_DOWN: {            mHorizontalScrollViewEx2.requestDisallowInterceptTouchEvent(true);            break;        }        case MotionEvent.ACTION_MOVE: {            int deltaX = x - mLastX;            int deltaY = y - mLastY;            Log.d(TAG, "dx:" + deltaX + " dy:" + deltaY);            if (Math.abs(deltaX) > Math.abs(deltaY)) {                mHorizontalScrollViewEx2.requestDisallowInterceptTouchEvent(false);            }            break;        }        case MotionEvent.ACTION_UP: {            break;        }        default:            break;        }        mLastX = x;        mLastY = y;        return super.dispatchTouchEvent(event);    }
0 0