我有一个自定义的Android视图,它覆盖onTouchEvent(MotionEvent)来处理视图中内容的水平滚动.但是,当包含它的ScrollView垂直滚动时,自定义视图会停止接收触摸事件.理想情况下,我想要的是自定义视图继续接收事件,以便它可以处理自己的水平滚动,而包含视图层次结构处理垂直滚动.
有没有办法继续在滚动上接收这些动作事件?如果没有,有没有其他方法来获得我需要的触摸事件?
在子视图中使用requestDisallowInterceptTouchEvent(true)以防止垂直滚动(如果要继续进行水平滚动,并在完成后重置它).
private float downXpos = 0;
private float downYpos = 0;
private boolean touchcaptured = false;
@Override
public boolean onTouchEvent(MotionEvent event) {
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
downXpos = event.getX();
downYpos = event.getY();
touchcaptured = false;
break;
case MotionEvent.ACTION_UP:
requestDisallowInterceptTouchEvent(false);
break;
case MotionEvent.ACTION_MOVE:
float xdisplacement = Math.abs(event.getX() - downXpos);
float ydisplacement = Math.abs(event.getY() - downYpos);
if( !touchcaptured && xdisplacement > ydisplacement && xdisplacement > 10) {
requestDisallowInterceptTouchEvent(true);
touchcaptured = true;
}
break;
}
super.onTouchEvent(event);
return true;
}
Run Code Online (Sandbox Code Playgroud)
我正在回答我自己的问题,以防其他人像我一样不擅长谷歌搜索答案。:P
此问题的解决方法是扩展 ScrollView 并重写 onInterceptTouchEvent 方法,以便它仅拦截 Y 移动显着的触摸事件(根据一个建议,大于 X 移动)。
| 归档时间: |
|
| 查看次数: |
3874 次 |
| 最近记录: |