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

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

【问题讨论】:

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

标签: android ontouchlistener touch-event


【解决方案1】:

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

【讨论】:

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

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

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

  1. 该类(即 Foo)实现了 OnTouchListener 接口和
  2. 该类是使用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); }

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-03-04
              • 2011-06-01
              • 2011-09-05
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多