61

在对 onTouchEvent 和 onTouch 进​​行了多次实验后,我发现只要你声明了接口并正确放置了 Listener,onTouch 就可以在任何你想要的地方工作(无论是在活动中还是在视图中)!另一方面,onTouchEvent 只在 View 内有效!我的假设正确吗?这是真正的区别吗?

4

7 回答 7

43

是的,您是正确的 -onTouch()用户使用它View来获取触摸事件,而onTouchEvent()派生类使用它View来获取触摸事件。

于 2011-02-15T09:51:27.720 回答
31

我对 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 更灵活的开发理念的一部分,尽管它有时会给学习者带来困惑。

于 2014-04-13T13:27:58.703 回答
5

我使用过 ontouch() 和 ontouchevent(),因为当我想处理单个视图的元素时使用 ontouch,例如单个视图上的按钮、图像按钮等(比如 Linearlayout),而当我想处理其余区域时我的元素(例如按钮)我使用 ontouchevent。

于 2013-03-02T11:02:18.283 回答
4

如果没有视图消耗触摸事件,则onTouchEvent() 实际上被 Activity 调用。

正如您所说, onTouch() 可以在任何类中使用,只要:

  1. 该类(即 Foo)实现了 OnTouchListener 接口和
  2. 该类是使用的注册侦听器view.setOnTouchListener(foo);
于 2011-02-18T07:29:13.123 回答
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 过滤视图。

于 2014-12-16T07:28:10.930 回答
0

我发现了另一个不同之处。onTouchEvent 似乎没有得到已弃用的事件 MotionEvent.ACTION_POINTER_2_DOWN 和 MotionEvent.ACTION_POINTER_2_UP。

当然,它们已经很老了,我们不应该使用它们。

这是在 Android 5.1 api 22 中。

于 2017-01-31T16:39:48.257 回答
0

onTouchEventViewActivity和其他基类如LinearLayout实现的方法。

public boolean onTouchEvent(MotionEvent event) {
    throw new RuntimeException("Stub!");
}

您可以通过任何派生类覆盖此方法

然而

onTouch()由接口OnTouchListener {}定义

public interface OnTouchListener { boolean onTouch(View var1, MotionEvent var2); }

所以在将此接口设置为类时只需要实现一个

于 2017-06-03T11:50:56.477 回答