扫码关注官方订阅号
如题,在监听触碰事件时,如果快速滑动,回调的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还有很多其他的状态,题主的代码编写习惯很不好.你应该在每个Case后break下,如果你的default里的代码是执行UP逻辑建议放在ACTION_UP中,你所说的脏数据应该是其他的MOVE状态引入的.你可以查看MotionEvent的其他状态所代表的含义,MotionEvent官方文档
ACTION_DOWN
ACTION_MOVE
ACTION_UP
Case
break
default
MOVE
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; }
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
这里是onTouchEvent代码,当发生move事件时,获取触碰坐标,并计算滑动距离,之后重绘,在onDraw()里计算一个currenttranslateY(整体偏移距离)。发生up事件时,根据currenttranslateY来启动一个属性动画。但是如果快速滑动,move里的重绘事件并没有执行到计算currenttranslateY就已经拦截到up事件,开始利用脏的currenttranslateY来开始属性动画。
请问这里我该如何才能正确的来做呢?
除了
ACTION_DOWN,ACTION_MOVE,ACTION_UP还有很多其他的状态,题主的代码编写习惯很不好.你应该在每个
Case后break下,如果你的default里的代码是执行UP逻辑建议放在ACTION_UP中,你所说的脏数据应该是其他的
MOVE状态引入的.你可以查看MotionEvent的其他状态所代表的含义,MotionEvent官方文档建议你的代码更改为: