Android中点击和触摸监听器的区别

Android中点击和触摸监听器的区别,android,Android,我有点怀疑。我正在使用图像按钮(例如,媒体播放器中的播放图标)。我想知道我应该使用哪个动作侦听器,onClickListener还是onTouchListener。这两个动作之间有什么区别,我应该在什么时候使用它们。 每当引发任何视图的单击事件时,都会使用onClickListener,例如:按钮的单击事件、图像按钮 onTouchListener在您想要实现触摸式功能时使用,例如,如果您想要获得您精确触摸的屏幕坐标 更新: 只需查看官方文件即可:和 根据官方文件,两者的定义如下: onCl

我有点怀疑。我正在使用图像按钮(例如,媒体播放器中的播放图标)。我想知道我应该使用哪个动作侦听器,onClickListener还是onTouchListener。这两个动作之间有什么区别,我应该在什么时候使用它们。

  • 每当引发任何视图的单击事件时,都会使用onClickListener,例如:按钮的单击事件、图像按钮

  • onTouchListener
    在您想要实现触摸式功能时使用,例如,如果您想要获得您精确触摸的屏幕坐标

更新: 只需查看官方文件即可:和

根据官方文件,两者的定义如下:

  • onClickListner:单击视图时调用回调的接口定义
  • onTouchListener:将触摸事件发送到此视图时调用回调的接口定义。在将触摸事件提供给视图之前,将调用回调

onClickListener是一系列使用键盘或触摸屏触发的事件。它们在特定视图上执行,整个视图接收事件。相反,onTouchListener仅用于触摸屏事件,不能通过键盘或任何其他输入触发。它们通常还接收相应的触摸信息,如x、y坐标等


我认为onClickListener适合您的应用程序,如果您不使用更复杂的输入,如手势等。

我还想到了这个问题,应该使用click或touch listener

那么我的理解是这样的,

当我需要任何
视图(按钮/图像/etc)使其可点击时,这意味着用户只需不触摸屏幕的那一部分,而是毫不费力地尝试触摸屏幕的那一部分,因此下一个动作称为I
使用onClickListener
,另一件事是,假设使用按钮,我们可以根据需求动态地使其可点击True/False,因此在这种情况下,OnClickListener是首选的

new View.OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub

            }
        };
在开发屏幕时,
用户的简单触摸将被视为动作
就像在游戏中或处理图像一样,您希望捕捉用户触摸过的图像,并且您需要
查找触摸的上/下/左/右运动事件,请使用onTouchListener


在您的情况下,我建议使用onClickListener,@vishy1618的答案具有此线程的关键洞察力(试图将此作为注释保留在此处,但太长)

从概念上讲,onClick只是一个围绕特定触摸事件序列的“包装器”——向下、无拖动、向上。所以比较onTouch和onClick只是一个低级API(原始触摸事件)和一个高级API(逻辑用户“点击”)

但是,一个重要的兼容性问题是:在安卓系统中,onClick也可以通过键盘(或轨迹球,或任何正在使用的替代输入/硬件设备)触发。但是(afaict)不支持通过触摸屏以外的任何其他输入设备触发触摸事件

因此,如果您专门针对触摸事件对UI进行编码,则意味着您需要触摸屏。然而,如果你坚持使用onClick,你的应用理论上可以在非触摸设备上运行

当然,目前所有“兼容”的Android手机都有触摸屏。。。因此,这实际上是没有实际意义的。但如果你想让你的应用程序在非手机硬件上运行,这可能值得考虑

这里有一些很好的讨论:


这没什么大不了的。。您如何定义点击与如何定义触摸。例如,Nexus 4有一个屏幕,没有鼠标。+1对于没有鼠标的设备,这是唯一一个说明点击和触摸之间区别的答案。甚至在15年前,VB也提供了onMouseDown和onMouseUp等选项。似乎onClick需要一个down和一个up。而且Android也没有专门为“up”提供任何功能。。
new View.OnTouchListener() {

            public boolean onTouch(View v, MotionEvent event) {
                // TODO Auto-generated method stub
                return false;
            }
        };