在 iOS 世界中,有一个概念touchUpInside
,触摸在视图中开始,用户在视图范围内抬起手指。
我在android中看到touch
vs click
(事件监听器),我想知道它们之间的区别。
触摸事件更为基本。有很多品种。最常见的是:
DOWN
:用户触摸项目
MOVE
:用户在触摸项目后围绕它移动
UP
:用户停止触摸项目
CANCEL
:用户移开项目,但仍在触摸屏幕。
在 Android 中,click
事件是触摸事件的组合。在click
它的两个DOWN
和UP
行动的情况下。还有其他可以在GestureDetector
. Fling
例如,是、 和的组合DOWN
,表示用户非常快速地滑动手指。MOVE
UP
编辑:
说明 Android 如何处理 onTouchEvent() 中的true
和false
。
它没有很好的文档记录,但是视图在 Android 中的工作方式是,当您触摸视图时,它会将触摸事件从父视图发送到所有子视图。然后每个孩子将事件发送给它的孩子。这是在dispatchTouchEvent()
方法中完成的。
当父级从子级的方法View
接收时,它将不再向该子级发送触摸事件。这意味着当您查看返回时,您的视图实际上是:false
onTouchEvent()
false
onTouchEvent()
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 并且单击将被取消。
最后一个不是实现点击的最佳方式,但我认为它说明了我想说的。在现实生活中,即使是几个像素,移动事件也非常普遍。
每当引发任何视图的单击事件时都会使用 onClickListener,例如:Button、ImageButton 的单击事件。
每当您想要实现 Touch 类型的功能时,都会使用 onTouchListener,例如,如果您想获得您触摸的屏幕坐标。
定义:
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_UP
ACTION_DOWN
ACTION_MOVE
这些是我们通常执行的常见操作,以获得期望的结果,例如在屏幕上拖动视图。
另一方面,onClick
除了用户交互的视图之外,并没有给你太多。onClick
是一个完整的事件,包括聚焦、按下和释放。因此,您几乎无法控制它。一方面是实现起来非常简单。
我们需要同时实施吗?
除非您想惹恼您的用户,否则没有必要。如果您只想要简单的点击事件,请选择onClick
. 如果您想要的不仅仅是点击,请选择onTouch
. 两者都做会使过程复杂化。
从用户的角度来看,如果你onTouch
仔细实现看起来像onClick
.