在使用onTouchEvent和onTouch进行多次实验后,我发现onTouch可以在任何地方工作(无论是在活动中还是在视图中),只要您声明了接口并将Listener放在正确的位置即可!另一方面,onTouchEvent仅适用于View! 我的假设是否正确?这是真正的区别吗?
答案 0 :(得分:41)
是的,您是正确的,onTouch()
被View
的用户用于获取触摸事件,而派生类<{1}} / strong> onTouchEvent()
获取触摸事件。
答案 1 :(得分:29)
我对onTouchEvent()和onTouch()的工作方式有些困惑(你可以看看我对这个问题的评论)。经过以下一些研究后,我发现了它。这可能对初学者有所帮助。
1)实施:
如果你想使用onTouch(),你必须做三件事。
1-实现OnTouchListener
在要设置的视图上调用setOnTouchListener()捕获事件
3-覆盖onTouch()来处理事件
但如果您想使用onTouchEvent(),则无需执行步骤1&amp; 2以上。只需要覆盖onTouchEvent()。
2)工作:
onTouch()适用于view,viewgroup,activity。这意味着您可以在view,viewgroup或activity中使用onTouch()。这个方法有两个参数[onTouch(View v,MotionEvent e)]。这允许您过滤活动或视图组中不同视图的事件。或者活动本身可以处理它。
onTouchEvent()接受一个参数[onTouchEvent(MotionEvent e)
]。因此,这只能在实现它的视图内部或派生视图中使用。派生的View可以扩展onTouchEvent()中定义的触摸行为。
我认为,这些选项是Android更灵活的开发理念的一部分,虽然它有时会给学习者带来困惑。
答案 2 :(得分:5)
我使用了ontouch()和ontouchevent(),因为当我想在单个视图(例如Linearlayout)上处理单个视图的元素(如按钮,图像按钮等)时使用ontouch,而当我想在区域上工作时其余的我的元素(例如按钮)我使用ontouchevent。
答案 3 :(得分:4)
如果没有任何视图消耗touch事件,onTouchEvent()实际将将被调用。
正如你所说,onTouch()可以在任何类中使用,只要:
view.setOnTouchListener(foo);
答案 4 :(得分:4)
创建自定义视图时,您可以
@override
onTouchEvent(MotionEvent e){}
,您可以将onTouch添加到任何View,ViewGroup或Activity。
onTouch(View v, MotionEvent e)
{
//you can filter any View's touch
}
onTouch是通用的,onTouchEvent特定于View。您还可以使用onTouch过滤视图。
答案 5 :(得分:0)
我发现了另一个区别。 onTouchEvent似乎没有得到已弃用的事件MotionEvent.ACTION_POINTER_2_DOWN和MotionEvent.ACTION_POINTER_2_UP。
当然它们已经很老了,我们不应该使用它们。
这是在Android 5.1 api 22中。
答案 6 :(得分:0)
onTouchEvent 是由查看,活动和其他基类(如 LinearLayout ,等强> ..
public boolean onTouchEvent(MotionEvent event) {
throw new RuntimeException("Stub!");
}
您可以通过任何派生类重写此方法
<强>而强>
onTouch()由界面 OnTouchListener {}
定义 public interface OnTouchListener {
boolean onTouch(View var1, MotionEvent var2);
}
所以你只需要在将这个接口设置为类
时实现一个