【问题标题】:what is considered `click event` in android?什么是 android 中的“点击事件”?
【发布时间】:2012-12-27 15:41:23
【问题描述】:

在 iOS 世界中,有一个 touchUpInside 的概念,触摸在视图中开始,用户在视图范围内抬起手指。

我在 android 中看到 touchclick(事件侦听器),我想知道它们之间的区别。

【问题讨论】:

    标签: android events click touch


    【解决方案1】:

    触摸事件更为基本。有很多品种。最常见的是:

    DOWN: 用户触摸项目

    MOVE: 用户在触摸它后在项目周围移动

    UP: 用户停止触摸项目

    CANCEL:用户移开项目,但仍在触摸屏幕。

    在 Android 中,click 事件是触摸事件的组合。对于click,它同时是DOWNUP 操作。还有其他可以在GestureDetector 中找到。例如,FlingDOWNMOVEUP 的组合,表示用户快速滑动手指。

    编辑:

    说明 Android 如何处理 onTouchEvent() 中的truefalse

    它没有很好的文档记录,但是视图在 Android 中的工作方式是,当您触摸视图时,它会将触摸事件从父视图发送到所有子视图。然后每个孩子将事件发送给它的孩子。这是在dispatchTouchEvent() 方法中完成的。

    当父级 View 从子级的 onTouchEvent() 方法接收到 false 时,它将不再向该子级发送触摸事件。这意味着当您的视图在onTouchEvent() 中返回false 时,您的视图实际上是在说:

    I am done processing touch events and all of my children are done as well.

    90% 的时间,在 onTouchEvent() 中,您会执行 return super.onTouchEvent() 以返回 View 中所有子项的触摸值。

    让我们看看您的点击示例。这是一种方法,您在 DOWN 事件上返回 false,但在 UP 上返回 true。

      @Override
      public boolean onTouchEvent(MotionEvent event) {
    
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
          return false;
        case MotionEvent.ACTION_UP:
          return true;
          break;
        default:
          return false;
        }
    } 
    

    在这种情况下,View 的父级将立即收到 false。之后,它将停止向View 发送触摸事件,因为你说它已经完成了。

    这是另一种方式:

     boolean mPossibleClick = false;
    
     @Override
      public boolean onTouchEvent(MotionEvent event) {
    
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
          mPossibleClick = true;
          break;
        case MotionEvent.ACTION_UP:
          if(mPossibleClick) {
             // UP event immediately after DOWN. Perform click action
          }
        default:
          mPossibleClick = false;
        }
        return mPossibleClick;
    }
    

    这是相当粗略的,但基本上这就是将会发生的事情。当用户第一次触摸它时,您将收到DOWN,它将返回 true。如果用户抬起手指,它将执行click 操作,之后将返回 false,因为事件已完成。如果用户移动他的手指或执行任何其他操作,它将返回 false 并且单击将被取消。

    最后一个不是实现点击的最佳方式,但我认为它说明了我想说的。在现实生活中,即使是几个像素,移动事件也非常普遍。

    【讨论】:

    • 所以如果我想在 touchListener 中捕获“点击事件”,我应该测试downup?如果真是这样,那么是以哪种方式?还是测试up就够了?
    • 您必须在触摸事件中测试DOWN 并返回true,因为一旦视图返回false,它将停止接收触摸事件。当 View 返回 false 时,它意味着“我无法进行进一步的触摸处理,所以不要再问了”。所以在这种情况下,你会捕捉到有一个DOWN 事件,返回true,然后捕捉到有一个UP 事件。
    • falsetrue 的含义与您在 onTouch 中所说的不同。你能详细说明吗? onTouch() - 这将返回一个布尔值来指示您的侦听器是否使用此事件。重要的是这个事件可以有多个相互跟随的动作。因此,如果在接收到 down 操作事件时返回 false,则表明您尚未消费该事件,并且对该事件的后续操作也不感兴趣。因此,事件中的任何其他操作都不会调用您,例如手指手势或最终的向上操作事件。
    • 我在 View 的 onTouchEvent() 中进行了编辑,描述了 Android 如何处理真假。如果不清楚,请告诉我。
    • 感谢您的澄清。但是触摸的东西还是那么令人困惑。 stackoverflow.com/questions/7449799/…`最后绘制的小部件(在其他小部件之上)有机会首先在 View.onTouchEvent 中处理触摸。` 你的解释`它会将触摸事件从父视图发送到所有子视图`似乎是矛盾的彼此?`
    【解决方案2】:

    每当引发任何视图的单击事件时都会使用 onClickListener,例如:Button、ImageButton 的单击事件。

    onTouchListener 在你想要实现 Touch 类型的功能时使用,例如,如果你想获得你触摸的屏幕坐标。

    定义:

    onClickListner:点击视图时调用回调的接口定义。

    onTouchListener:当一个触摸事件被调度到这个视图时,回调的接口定义。回调将在触摸事件传递给视图之前被调用。

    详情:

    onClickListener:http://developer.android.com/reference/android/view/View.OnClickListener.html

    onTouchListener:http://developer.android.com/reference/android/view/View.OnTouchListener.html

    【讨论】:

      【解决方案3】:

      参考PH7

      的回复

      哪个更好用?

      这真的取决于您的要求。 onTouch 为您提供运动事件。因此,您可以做很多花哨的事情,因为它可以帮助您分离运动状态。仅举几例

      • ACTION_UP
      • ACTION_DOWN
      • ACTION_MOVE

      这些是我们通常实现的常用操作来获得期望的结果,例如在屏幕上拖动视图。

      另一方面,onClick 并没有为您提供太多信息,除了用户交互的视图。 onClick是一个完整的事件,包括聚焦、按下和释放。因此,您几乎无法控制它。一方面是实现起来非常简单。

      我们需要同时实现吗?

      除非您想惹恼您的用户,否则没有必要。如果您只想要简单的点击事件,请选择onClick。如果您想要的不仅仅是点击,请转到onTouch。两者都做会使过程复杂化。

      从用户的角度来看,如果你仔细实现onTouch 看起来像onClick 是不引人注意的。

      更多详情:参考thisthis

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多