OnTouchListener、OnClickListener、OnLongClickListener

本文深入探讨了Android开发中常用的OnTouchListener、OnClickListener与OnLongClickListener监听器。通过一个具体示例展示了不同监听器之间的交互及返回值对事件处理的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

android应用中常用的监听OnTouchListener、OnClickListener、OnLongClickListener,大家肯定经常使用。但是你真的知道它会产生的神奇效果么?不要忽视这些神奇效果哦!说不定这些神奇效果正是你想要的呢?好,下面请看我的示例。

示例、

首先在Activity中创建一个button,然后对这个button同时设置OnTouchListener、OnClickListener、onLongClickListener这三种监听方式。接着就是重写这三个接口的实现代码了。

java代码:


因为action_down最先触发的,下面的代码中我在action_down处理完需要做的事情之后就返回true,表示action_down 事件已经被消耗了。


运行结果如下

不管你怎么的click或者longclick 都不会得到响应的


如果将action_down的返回值改成false



则会变成


不要奇怪。。因为我按了两次。。第一次长按,第二次短按。结果却是这样的。为什么呢?这与网上有些朋友写的不一样啊?!是因为,

action_up返回了true,它在起作用。因为笔者我没有更改长按的时间而是使用系统的500ms,所以在手离开手机屏幕的时候就又有了一次long click。

如果你将action_up的返回值改成false


则得到的结果就是,从中你可以看出touch,click,long click的先后触发顺序了。



注意哦!

action_up 返回true时要注意哦。如果你同时使用这三种监听的话。action_up之后如果产生long click的话。button可是一直处于按下的状态哦!你可以从控件的颜色上看得到。

再者,使用OnLongClickListener的时候也要注意它的返回值,返回true时会使手机的振动一下。而返回false时则不会有这种效果。

其实你只要理解了事件处理机制,知道true和false在其中起着标志事件是否被消耗,如果消耗了就不再传递给其他控件了。如果没有消耗则还会传递给其他控件,触发其他控件的事件处理函数。使用的时候注意下就是了。这对高手来说,可能是小菜了,但是新手可能就没注意到三种事件监听同时使用时返回值会起到如此大的影响力。

Android中,要在View上实现点击和长按的不同操作效果,你可以通过创建一个自定义的OnTouchListener并与View关联起来。这个监听器会接收两个事件:ACTION_DOWN(点击开始)和ACTION_UP(点击结束),以及ACTION_MOVE(按下并移动手指)和ACTION_CANCEL(用户取消触摸,比如抬起手)。以下是简单的步骤: 1. 首先,创建一个实现了OnTouchListener接口的匿名内部类: ```java View.OnClickListener onClickListener = new View.OnClickListener() { @Override public void onClick(View v) { // 点击事件的处理代码 Toast.makeText(context, "点击", Toast.LENGTH_SHORT).show(); } }; View.OnLongClickListener onLongClickListener = new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { // 长按事件的处理代码 Toast.makeText(context, "长按", Toast.LENGTH_SHORT).show(); return true; // 返回true表示已经处理了长按,系统不会默认弹出选择菜单 } }; view.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { // 触摸开始时切换监听器 view.setOnClickListener(onClickListener); view.setOnLongClickListener(null); } else if (event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL) { // 触摸结束时切换回原来的监听器 view.setOnClickListener(null); view.setOnLongClickListener(onLongClickListener); } // 处理ACTION_MOVE事件,检查是否满足长按条件 if (event.getAction() == MotionEvent.ACTION_DOWN && event.getDuration() > MIN_LONG_PRESS_TIME) { // 如果长按时间超过设定值(如500毫秒) return onLongClick(v); // 调用长按监听器 } return false; } }); ``` 这里假设`MIN_LONG_PRESS_TIME`是一个全局常量,用于定义长按的最小持续时间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值