在对 onTouchEvent 和 onTouch 进行了多次实验后,我发现只要你声明了接口并正确放置了 Listener,onTouch 就可以在任何你想要的地方工作(无论是在活动中还是在视图中)!另一方面,onTouchEvent 只在 View 内有效!我的假设正确吗?这是真正的区别吗?
7 回答
是的,您是正确的 -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)
]。因此,这只能在实现它的视图内部或派生视图上使用。派生的 View 可以扩展 onTouchEvent() 中定义的触摸行为。
我认为,这些选项是 Android 更灵活的开发理念的一部分,尽管它有时会给学习者带来困惑。
我使用过 ontouch() 和 ontouchevent(),因为当我想处理单个视图的元素时使用 ontouch,例如单个视图上的按钮、图像按钮等(比如 Linearlayout),而当我想处理其余区域时我的元素(例如按钮)我使用 ontouchevent。
如果没有视图消耗触摸事件,则onTouchEvent() 实际上会被 Activity 调用。
正如您所说, onTouch() 可以在任何类中使用,只要:
- 该类(即 Foo)实现了 OnTouchListener 接口和
- 该类是使用的注册侦听器
view.setOnTouchListener(foo);
在创建自定义视图时,您可以
@override
onTouchEvent(MotionEvent e){}
而您可以将 onTouch 添加到任何 View、ViewGroup 或 Activity。
onTouch(View v, MotionEvent e)
{
//you can filter any View's touch
}
onTouch 是通用的,而 onTouchEvent 是特定于 View 的。您还可以使用 onTouch 过滤视图。
我发现了另一个不同之处。onTouchEvent 似乎没有得到已弃用的事件 MotionEvent.ACTION_POINTER_2_DOWN 和 MotionEvent.ACTION_POINTER_2_UP。
当然,它们已经很老了,我们不应该使用它们。
这是在 Android 5.1 api 22 中。
onTouchEvent是View、Activity和其他基类如LinearLayout等实现的方法。
public boolean onTouchEvent(MotionEvent event) {
throw new RuntimeException("Stub!");
}
您可以通过任何派生类覆盖此方法
然而
onTouch()由接口OnTouchListener {}定义
public interface OnTouchListener {
boolean onTouch(View var1, MotionEvent var2);
}
所以在将此接口设置为类时只需要实现一个