首页 > 自定义View中 当快速滑动时OntouchEvent action_up会抢占action_move中代码执行

自定义View中 当快速滑动时OntouchEvent action_up会抢占action_move中代码执行

如题,在监听触碰事件时,如果快速滑动,回调的action_up会抢占action_move中的代码先执行,导致读取脏数据,这样应该如何解决呢?(如果滑动慢的话不会出现这个问题)


@Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
                Log.i("MotionEvent.ACTION_DOWN","MotionEvent.ACTION_DOWN");
                previousY = event.getRawY();
                invalidate();
                break;

            case MotionEvent.ACTION_MOVE:
                Log.i("MotionEvent.ACTION_MOVE","MotionEvent.ACTION_MOVE");
                scorllY = scorllY+previousY-event.getRawY();
                Log.i("scorllY",scorllY+"");
                previousY = event.getRawY();
                invalidate();
                break;

            case MotionEvent.ACTION_UP:
                Log.i("MotionEvent.ACTION_UP","MotionEvent.ACTION_UP");
            default:
                isAdjust = true;
                Log.i("action_UP", (358 - currenttranslateY) + "");
                adjustY = 358 - currenttranslateY;
                adjustAnimaor.setFloatValues(0, adjustY);
                adjustAnimaor.start();

                break;
        }
        return true;
    }

这里是onTouchEvent代码,当发生move事件时,获取触碰坐标,并计算滑动距离,之后重绘,在onDraw()里计算一个currenttranslateY(整体偏移距离)。发生up事件时,根据currenttranslateY来启动一个属性动画。但是如果快速滑动,move里的重绘事件并没有执行到计算currenttranslateY就已经拦截到up事件,开始利用脏的currenttranslateY来开始属性动画。
请问这里我该如何才能正确的来做呢?


除了ACTION_DOWN,ACTION_MOVE,ACTION_UP还有很多其他的状态,题主的代码编写习惯很不好.
你应该在每个Casebreak下,如果你的default里的代码是执行UP逻辑建议放在ACTION_UP中,
你所说的脏数据应该是其他的MOVE状态引入的.你可以查看MotionEvent的其他状态所代表的含义,MotionEvent官方文档

建议你的代码更改为:

@Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
                Log.i("MotionEvent.ACTION_DOWN","MotionEvent.ACTION_DOWN");
                previousY = event.getRawY();
                invalidate();
                break;

            case MotionEvent.ACTION_MOVE:
                Log.i("MotionEvent.ACTION_MOVE","MotionEvent.ACTION_MOVE");
                scorllY = scorllY+previousY-event.getRawY();
                Log.i("scorllY",scorllY+"");
                previousY = event.getRawY();
                invalidate();
                break;

            case MotionEvent.ACTION_UP:
                Log.i("MotionEvent.ACTION_UP","MotionEvent.ACTION_UP");
                isAdjust = true;
                Log.i("action_UP", (358 - currenttranslateY) + "");
                adjustY = 358 - currenttranslateY;
                adjustAnimaor.setFloatValues(0, adjustY);
                adjustAnimaor.start();

                break;
        }
        return true;
    }
【热门文章】
【热门文章】