Android中onTouch与onClick两种监听的完全解析

本文探讨了在Android中,onTouch和onClick监听器的工作原理和交互。通过一系列测试,总结了当仅设置OnTouchListener或同时设置OnTouchListener和OnClickListener时,不同情况下事件的处理规则。onTouch的返回值决定了事件的消耗与传递,其优先级高于onClick。当onTouch的DOWN事件返回true,onClick不会执行;而当DOWN事件返回false,onClick会被调用,且onTouch可以捕获后续事件。

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

之前项目中做一个竖直方向的ViewPager效果(详见我的另一篇博文),这几天做了几个改动,突然发现我设置的OnTouchListener对触摸事件的监听突然不起作用了,琢磨了半天觉得问题就出在onTouch的返回值true还是false上,后来自己测试的时候发现不光与这个有关,与OnClickListener也有关,我自己做了一些测试并尝试来进行源码的分析,解析真正的规律和原因所在。

1、一个简单的测试
为了弄懂这个问题,我们先来做一个简单的测试,寻找一下其中的规律,我们在布局中加一个很简单的view,然后给他设置一个OnTouchListener,根据onTouch函数返回值分别测一下结果
(1)全部返回false

View view = findViewById(R.id.id_view_test);
view.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                if (motionEvent.getAction() == MotionEvent.ACTION_DOWN){
                    Log.d("test", "DOWN");
                } else if(motionEvent.getAction() == MotionEvent.ACTION_MOVE){
                    Log.d("test", "MOVE");
                } else if (motionEvent.getAction() == MotionEvent.ACTION_UP){
                    Log.d("test", "UP");
                }
                return false;
            }
        });

然后我们测试一下一次滑动的结果,发现输出只有DOWN操作:

11-05 21:27:46.453 17673-17673/com.test.lee.touchtestapplication D/test: DOWN

(2)DOWN操作时返回true,其他都返回false

public boolean onTouch(View view, MotionEvent motionEvent) {
                if (motionEvent.getAction() == MotionEvent.ACTION_DOWN){
                    Log.d("test", "DOWN");
                    return true; //DOWN时返回true
                } else if(motionEvent.getAction() == MotionEvent.ACTION_MOVE){
                    Log.d("test", "MOVE");
                } else if (motionEvent.getAction() == MotionEvent.ACTION_UP){
                    Log.d("test", "UP");
                }
                return false;
            }

测试结果发现只要DOWN返回true,无论之后返回什么,直到UP的所有操作都收到了:

11-05 21:33:47.084 17673-17673/com.test.lee.touchtestapplication D/test: DOWN
11-05 21:33:47.169 17673-17673/com.test.lee.touchtestapplication D/test: MOVE
11-05 21:33:47.188 17673-17673/com.test.lee.touchtestapplication D/test: MOVE
11-05 21:33:47.206 17673-17673/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值