java - 自定义View中 当快速滑动时OntouchEvent action_up会抢占action_move中代码执行
天蓬老师
天蓬老师 2017-04-18 09:43:41
[Java讨论组]

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

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(2)
大家讲道理
@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;
    }
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号