【发布时间】:2012-12-27 15:41:23
【问题描述】:
在 iOS 世界中,有一个 touchUpInside 的概念,触摸在视图中开始,用户在视图范围内抬起手指。
我在 android 中看到 touch 与 click(事件侦听器),我想知道它们之间的区别。
【问题讨论】:
标签: android events click touch
在 iOS 世界中,有一个 touchUpInside 的概念,触摸在视图中开始,用户在视图范围内抬起手指。
我在 android 中看到 touch 与 click(事件侦听器),我想知道它们之间的区别。
【问题讨论】:
标签: android events click touch
触摸事件更为基本。有很多品种。最常见的是:
DOWN: 用户触摸项目
MOVE: 用户在触摸它后在项目周围移动
UP: 用户停止触摸项目
CANCEL:用户移开项目,但仍在触摸屏幕。
在 Android 中,click 事件是触摸事件的组合。对于click,它同时是DOWN 和UP 操作。还有其他可以在GestureDetector 中找到。例如,Fling 是 DOWN、MOVE 和 UP 的组合,表示用户快速滑动手指。
编辑:
说明 Android 如何处理 onTouchEvent() 中的true 和false。
它没有很好的文档记录,但是视图在 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 并且单击将被取消。
最后一个不是实现点击的最佳方式,但我认为它说明了我想说的。在现实生活中,即使是几个像素,移动事件也非常普遍。
【讨论】:
down 和up?如果真是这样,那么是以哪种方式?还是测试up就够了?
DOWN 并返回true,因为一旦视图返回false,它将停止接收触摸事件。当 View 返回 false 时,它意味着“我无法进行进一步的触摸处理,所以不要再问了”。所以在这种情况下,你会捕捉到有一个DOWN 事件,返回true,然后捕捉到有一个UP 事件。
false 和 true 的含义与您在 onTouch 中所说的不同。你能详细说明吗? onTouch() - 这将返回一个布尔值来指示您的侦听器是否使用此事件。重要的是这个事件可以有多个相互跟随的动作。因此,如果在接收到 down 操作事件时返回 false,则表明您尚未消费该事件,并且对该事件的后续操作也不感兴趣。因此,事件中的任何其他操作都不会调用您,例如手指手势或最终的向上操作事件。
onTouchEvent() 中进行了编辑,描述了 Android 如何处理真假。如果不清楚,请告诉我。
每当引发任何视图的单击事件时都会使用 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
【讨论】:
参考PH7
的回复哪个更好用?
这真的取决于您的要求。
onTouch 为您提供运动事件。因此,您可以做很多花哨的事情,因为它可以帮助您分离运动状态。仅举几例
ACTION_UPACTION_DOWNACTION_MOVE这些是我们通常实现的常用操作来获得期望的结果,例如在屏幕上拖动视图。
另一方面,onClick 并没有为您提供太多信息,除了用户交互的视图。 onClick是一个完整的事件,包括聚焦、按下和释放。因此,您几乎无法控制它。一方面是实现起来非常简单。
我们需要同时实现吗?
除非您想惹恼您的用户,否则没有必要。如果您只想要简单的点击事件,请选择onClick。如果您想要的不仅仅是点击,请转到onTouch。两者都做会使过程复杂化。
从用户的角度来看,如果你仔细实现onTouch 看起来像onClick 是不引人注意的。
【讨论】: