问题在于 Android 如何处理触摸事件的操作顺序。每个触摸事件都遵循以下模式(简化示例):
- Activity.dispatchTouchEvent()
- ViewGroup.dispatchTouchEvent()
- View.dispatchTouchEvent()
- View.onTouchEvent()
- ViewGroup.onTouchEvent()
- 活动.onTouchEvent()
但是事件只会跟随链直到它们被消耗onTouchEvent()
(意味着有人从或侦听器返回 true )。如果您只是触摸屏幕上的某个位置,则没有人对该事件感兴趣,因此它会一直流向您的代码。但是,对于按钮(或其他可点击View
),它会消耗触摸事件,因为它对它感兴趣,因此流程在第 4 行停止。
如果要监视进入 Activity 的所有触摸,则需要重写dispatchTouchEvent()
,因为始终首先onTouchEvent()
调用的内容是最后调用的,并且只有在没有其他人捕获该事件的情况下才调用。但是,请注意不要在此处使用事件,否则子视图将永远无法获取它们,并且您的按钮将无法单击。
public boolean dispatchTouchEvent(MotionEvent event) {
int eventaction=event.getAction();
switch(eventaction) {
case MotionEvent.ACTION_MOVE:
reg.setText("hey");
break;
default:
break;
}
return super.dispatchTouchEvent(event);
}
另一种选择是将您的触摸处理代码放入自定义ViewGroup
(如LinearLayout
)并使用其onInterceptTouchEvent()
方法允许父视图偷走并在必要时处理触摸事件。不过要小心,因为这种交互在新的触摸事件开始之前无法撤消(一旦你窃取了一个事件,你就窃取了它们全部)。
高温高压