onTouchevent() 与 onTouch()

Posted

技术标签:

【中文标题】onTouchevent() 与 onTouch()【英文标题】:onTouchevent() vs onTouch() 【发布时间】:2011-06-27 11:40:58 【问题描述】:

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

【问题讨论】:

@***foe & stelios:谢谢大家的问题和答案。但我有点困惑。原因是 - “我有一个实现 OnClickListener 和相关 onClick(View v) 事件处理程序的活动。我没有实现 onTouchListener。但我有 onTouchEvent(MotionEvent e) 来处理滑动事件。代码运行良好,没有问题。 "所以我的疑问是 onTouchEvent() 在这里(在活动中)如何工作,因为它只在视图上工作?另外我还没有实现 OnTouchLister 或调用 setOnTouchListener() 那么它的工作原理是什么? 在 onTouch() 上返回 true 不会触发 onTouchEvent。 【参考方案1】:

是的,你是对的 - View用户 使用 onTouch() 来获取触摸事件,而 @ 的 派生类 使用 onTouchEvent() 987654324@获取触摸事件。

【讨论】:

不清楚派生类在这里是什么意思,如果我在活动中,我只在这个活动中工作【参考方案2】:

onTouchEvent() 实际上在没有视图消耗触摸事件的情况下被 Activity 调用。

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

    该类(即 Foo)实现了 OnTouchListener 接口和 该类是使用view.setOnTouchListener(foo); 注册的侦听器

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

我对 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() 中定义的触摸行为。

我认为,这些选项是 android 更灵活的开发理念的一部分,尽管它有时会让学习者感到困惑。

【讨论】:

【参考方案5】:

在创建自定义视图时,您可以

@override onTouchEvent(MotionEvent e)

而您可以将 onTouch 添加到任何 View、ViewGroup 或 Activity。

onTouch(View v, MotionEvent e) //you can filter any View's touch

onTouch 是通用的,onTouchEvent 是特定于 View 的。您还可以使用 onTouch 过滤您的视图。

【讨论】:

【参考方案6】:

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

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

这是在 Android 5.1 api 22 中。

【讨论】:

【参考方案7】:

onTouchEventViewActivity 和其他基类如 LinearLayout 实现的方法>等等..

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

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

onTouch() 由接口 OnTouchListener

定义

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

所以在设置这个接口为类的时候只需要实现一个

【讨论】:

以上是关于onTouchevent() 与 onTouch()的主要内容,如果未能解决你的问题,请参考以下文章

Android onTouch()和onTouchEvent()区别

Android中View的onTouchEvent和OnTouch区别

Android问题:自定义的布局类,一次Touch,两次调用onTouchEvent()方法,为啥?

“onTouch”与“on Touch Event”的区别是啥?

View的事件处理流程

如何在onTouch中实现双击事件?要求代码尽可能简单