没错,onTouch()
被View
的用户用来获取触摸事件,而onTouchEvent()
被View
的派生类用来获取触摸事件。
我对onTouchEvent()和onTouch()的工作方式产生了一些疑惑(您可以看到我的评论),经过一些研究,以下是我所发现的内容。这对初学者可能有所帮助。
1)实现:
如果要使用onTouch(),你需要完成三件事情。
1- 实现OnTouchListener
2- 在你想设置捕获事件的视图上调用setOnTouchListener()
3- 重写onTouch()来处理事件
但是,如果你想使用onTouchEvent(),则无需执行上述步骤1和2。只需重写onTouchEvent()即可。
2)工作原理:
onTouch()可以在视图、视图组和活动中使用。这意味着你可以在视图、视图组或活动中使用onTouch()。此方法接受两个参数[onTouch(View v, MotionEvent e)]。这允许你为活动或视图组中的不同视图筛选事件。或者活动本身可以处理它。
onTouchEvent()只接受一个参数[onTouchEvent(MotionEvent e)
]。因此,它只能在实现它或派生视图上使用。派生视图可以扩展在onTouchEvent()中定义的触摸行为。
我认为,这样的选项是安卓更灵活的开发哲学的一部分,但有时会为学习者带来困惑。
我使用过ontouch()和ontouchevent(),ontouch用于处理单个视图(如LinearLayout)中的元素,例如按钮、图像按钮等,而当我想要处理其他区域的元素(例如按钮)时,我会使用ontouchevent。
@override
onTouchEvent(MotionEvent e){}
onTouch(View v, MotionEvent e)
{
//您可以过滤任何视图的触摸
}
如果没有任何视图消费触摸事件,Activity实际上会调用onTouchEvent()。
正如您所说,只要满足以下条件,onTouch()就可以在任何类中使用:
view.setOnTouchListener(foo);
注册为侦听器onTouchEvent 是由 View、Activity 和其他基类如 LinearLayout 等实现的方法。
public boolean onTouchEvent(MotionEvent event) {
throw new RuntimeException("Stub!");
}
你可以通过任何派生类覆盖这个方法
而
onTouch() 是由接口 OnTouchListener 定义的 { }
public interface OnTouchListener {
boolean onTouch(View var1,MotionEvent var2);
}
所以当将此接口设置为类时,您只需要实现其中一个。
我发现另一个区别。 onTouchEvent 似乎无法获取已弃用的事件 MotionEvent.ACTION_POINTER_2_DOWN 和 MotionEvent.ACTION_POINTER_2_UP。
当然,它们相当古老,我们不应该再使用它们了。
这是在 Android 5.1 api 22 中。
true
不会触发onTouchEvent。 - Johnny