Android 一个view如何同时响应onTouch和onClick事件

安卓上层代码通过onTouch事件模拟实现"onClick"的动作,以及触屏"灵敏度"的设置 PS:以下通过开发时遇到的问题来具体介绍。 关于安卓设备悬浮球不能响应”Click”事件的总结 背景如下:安卓电视红外触屏框不能响应onClick事件,触屏框底层驱动不支持onclick事件。 以下通过对项目从分析到解决问题过程作一个简单的介绍: 一、遇到的问题: 1、 安卓应用悬浮球不能响应Click事件。 2、 触摸框边缘获取数据异常。 3、 对于 阅读详情

一个view如何同时响应onTouch和onClick事件,这种情况很多,但是在网上搜了很长时间,大多数都是讲解如何区分onTouchEvent和onClick,onLongClick的调用顺序和流程.但是都没有讲到如何让onTouch事件和onClick事件共存.也就是说一个控件既能响应点击事件又能响应触摸事件.

首先声明,此博文参考的文章链接https://technicalsearch.iteye.com/blog/1972470   感谢前辈的智慧结晶.

值得说明的是解决的思路:在touch事件的onMove中判断手指的移动距离,当移动通过勾股定理算出<15px时,就把此事件当做是点击事件,当算出移动距离大于等于15px时就当做触摸事件处理

直接贴出代码,需要的朋友复制粘贴就可使用.

flSmall.setOnTouchListener(new View.OnTouchListener() {
        private int lastY;
        private int lastX;
        private float x1, x2;
        private float y1, y2;

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            int action = event.getAction();
            int screenWidth = getResources().getDisplayMetrics().widthPixels;
            switch (action) {
                case MotionEvent.ACTION_DOWN:
                    lastX = (int) event.getRawX();
                    lastY = (int) event.getRawY();
                    x1 = event.getRawX();//得到相对应屏幕左上角的坐标
                    y1 = event.getRawY();
                    break;
                case MotionEvent.ACTION_MOVE:
                    int dx = (int) event.getRawX() - lastX;
                    int dy = (int) event.getRawY() - lastY;

                    int left = v.getLeft() + dx;
                    int top = v.getTop() + dy;
                    int right = v.getRight() + dx;
                    int bottom = v.getBottom() + dy;
                    if (left < 0) {
                        left = 0;
                        right = left + v.getWidth();
                    }
                    if (right > screenWidth) {
                        right = screenWidth;
                        left = right - v.getWidth();
                    }
                    if (top < 0) {
                        top = 0;
                        bottom = top + v.getHeight();
                    }
                    if (bottom > getScreenHeight(MainActivity.this)) {
                        bottom = getScreenHeight(MainActivity.this);
                        top = bottom - v.getHeight();
                    }
                    v.layout(left, top, right, bottom);
                    lastX = (int) event.getRawX();
                    lastY = (int) event.getRawY();
                    break;
                case MotionEvent.ACTION_UP:
                    x2 = event.getRawX();
                    y2 = event.getRawY();
                    Log.i("i", x1 + ",,," + y1 + ",,," + x2 + ",,," + y2);
                    double distance = Math.sqrt(Math.abs(x1 - x2) * Math.abs(x1 - x2) + Math.abs(y1 - y2) * Math.abs(y1 - y2));//两点之间的距离
                    Log.d("i", "x1 - x2>>>>>>" + distance);
                    if (distance < 15) { // 距离较小,当作click事件来处理
                        Log.d(TAG, "onTouch: 点击事件");
                        return false;
                    } else {
                        Log.d(TAG, "onTouch: 滑动事件");
                        return true;
                    }
            }
            return false;
        }
    });
}

public int getScreenHeight(Activity activity) {
    if (activity.getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
        return DisplayUtil.getScreenWidth(activity);
    } else {
        return DisplayUtil.getRealScreenHeight(activity);
    }
}
【Android面试八股文】你能说一说View中onTouch、onTouchEvent和onClick的执行顺序吗? 是事件分发的入口,会首先尝试调用的onTouch()方法。onTouch():如果被设置并且其onTouch()方法返回true,则事件被消费,后续流程中止。:如果onTouch()返回false或者没有设置,事件传递到。onClick():在中,如果识别到有效的点击事件,会调用,进而触发onClick()方法。通过理解和分析方法的工作原理,可以更好地掌握 Android 触摸事件处理机制及各种回调方法的执行顺序。 阅读详情

相关推荐

c转c++——蓝桥杯

在这里,`int &i` 表示 `i` 是一个整型的引用变量,而不是一个拷贝,这意味着在循环中对 `i` 的修改会影响到数组 `arr` 中对应位置的值。arr则是需要遍历的数组。一、为啥要转C++:之前只学过C语言,然后为了蓝桥杯苦哈哈敲了C好久,偶然听了别人的意见去看了一下C++后发现简直太香了——C++不像C要把底层逻辑自己敲出来,而是可以直接调用STL函数库(比如排序,C语言可能要敲个几十行代码C++直接用调用sort函数就可以了),而且C++完全兼容C语言,里面的语法全部可以用C替换。

smwymzqbyl的博客 2045

Android中onTouch事件和onClick事件冲突问题解决

android中onTouch事件和onClick事件冲突

2614

【win11+vs 2017+OpenCV4.5.5+Qt5.12配置】详细安装过程+小问题解决

由于Qt5无法与最新的vs2022兼容,扩展工具中一直显示不可用,所以将vs降级成vs2017。在安装Qt的过程中,会选择安装Qt套件,其中就的MCVS 2017,说明vs2017是与qt兼容的。当然也可以用qt creator这一原生IDE。OpenCV版本目前是最新的4.8.0,使用过程中没有什么问题,但是还是安装低版本大概率避免一些玄学问题。

qq_45306739的博客 3350

(copy)Android关于OnTouch 和OnClick同时调用冲突的解决方案

在Android中,对一个View同时调用OnTouch事件和OnClick事件时,导致事件冲突,比如onClick事件打算执行A动作,OnTouch事件打算执行B动作,但是在实际使用时会发现,当调用OnTouch时,有可能会同时执行A,B两个动作,这是因为OnClick事件本身就是在OnTouch事件中发生的;在onTouch事件中,如果返回true,就不会执行onClick,返回false,就...

abbiz的博客 388

c语言播放背景音乐

相信很多童鞋都在为大学课设而伤透头脑,而背景音乐的使用无疑会成为其中的一个亮点(总比没有好吧(╯▽╰)),故接下来我将介绍一下如何用C播放音乐。我用的编译器是CodeBlocks16.01接下来新建一个C文件建立完后是这样滴然后添加其中mciSendString()函数是由&lt;mmsystem.h&gt;库提供的供播放音乐(MP3)的函数第一个参数是歌曲所在的绝对路径 打开音乐所在位置 复制这...

qq_41443987的博客 3万+

MT6771 Android13 背光曲线调试与光感数据校准实战

本文详细介绍了MT6771平台在Android 13系统上进行背光曲线调试与光感数据校准的实战经验。针对高亮度环境下背光误调节问题,深入分析了光感数据上报机制,并提供了驱动层配置修改、背光曲线优化及常见问题解决方案,帮助开发者快速定位并解决类似问题。

moon9的博客 287

Android中OnTouchListener和OnClickListener并存

Android中,TouchListener监听触屏事件,TouchListener

snow_1216的专栏 907

Jetson Orin NX 单目标跟踪算法实战

本文对比了NanoTrack和MixFormerV2两种目标跟踪算法在Jetson Orin NX边缘设备上的实际表现。通过天空小目标跟踪场景测试发现,NanoTrack虽然表征能力较弱,但具有目标身份一致性强、失败模式可控、计算负担小等优势,更适合作为边缘端默认算法。MixFormerV2则适用于高速运动等特定场景。实验数据显示NanoTrack在Orin NX上可达200FPS,远高于MixFormerV2的38-120FPS。建议先采用NanoTrack构建稳定系统,后续再评估复杂算法的适用性。

karmueo46的博客 625

android对OnTouchListener、OnClickListener等事件响应的研究

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34038293的博客 344

线性分类器(Linear Classifier)

线性分类器 如上图所示,这是二维空间中的一个数据集,如果他正好能够被一条直线分成两类,那么我们称它为线性可分数据集,这条直线就是一个线性分类器。 在三维空间中,如果数据集线性可分,是指能够被一个平面分为两类。 在一维空间中,所有的点都在一条直线上,如果线性可分。可以理解为它们能够被一个点分开。 这里的直线、平面、点被分为决策边界。 一个 m 维空间中的数据集,如果能够被一个超平面一分为二,那么这个数据集就是线性可分的,这个超平面就是决策边界。 例如,这是二维平面上的一条直线, 它可以把平面切分成两

xuechanba的博客 1万+

【PLC】三菱plc控件安装 component Movedata had the following error ... Error Number:-119

Windows 10 专业版/企业版本版本号:22H2操作系统内部版本:19045.3448。

少莫千华 8002

Android-View 点击&触摸事件优先级

一直很好奇,View 点击&触摸事件它们触发的优先级是怎么样,哪个先执行,哪个后执行,返回只true、false对后续执行有什么影响呢?主要分析onClick,onLongClick,onTouch,onTouchEvent这4个函数,有兴趣的可以一起往下看。源码分析基于Android-23都是可以监听Touch事件,区别在于,前者是通过setOnTouchListener进行注册,后者只要重写即可; 2. onClick 监听点击事件; 3. onLongClick 监听长按事件。 注释1:当设置了se

大模型训练 1751

科研级实战】YOLOv11 pose部署至RK3588全流程:让姿态估计模型在边缘端毫秒级运行,我来帮你突破人体行为分析落地壁垒

在智慧安防人体行为分析场景中,基于YOLOv11 pose的模型在云端推理单帧耗时150ms,硬件成本超15000元;经本方案部署到RK3588后,单帧推理耗时降至30ms,硬件成本仅4000元,且关键点检测准确率高达93%以上。在运动姿态评估场景,同款技术路径使模型边缘端推理速度提升6倍,姿态分类精度达95%。这意味着,你也能让自己的姿态估计模型在边缘设备上实现的工业化落地,接下来让我们开启从模型训练到端侧部署的实战征程。

m0_71589036的博客 223

Android按钮事件响应顺序

Android按钮事件响应顺序

archer的技术故事 2028

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Android OnTouch 和OnClick同时调用冲突问题(单个View)

Button的onTouch,onClick,onLongClick事件发生先后顺序和关联:  一,onTouch返回false  首先是onTouch事件的down事件发生,此时,如果长按,触发onLongClick事件;  然后是onTouch事件的up事件发生,up完毕,最后触发onClick事件。   二,onTouch返回true  首先是onTouch事件的down事件发生

u013166232的专栏 1060

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Android中onTouch与onClick事件的关系

这几天遇到点关于Android的触摸事件相关的,还跟onClick有关,暂且记下: LinearLayout分别设置了onTouchListener,onClickListener,onLongClickListener及onTouchEvent回调 1、在屏幕上触摸之后基本的执行流程如下: onTouch,action=0 onTouchEvent,action=0 onTou

mydreamongo的专栏 2万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Android 触屏事件 OnTouch onClick onTouchEvent对于触屏事件的处理和分发

Android 触屏事件 OnTouch onClick onTouchEvent对于触屏事件的处理和分发             做项目的时候经常遇到需要事件分发,很多时候我们发现当我们触发了onTouch却触发不了onClick。或者触发了View的事件却触发不了ViewGroup的事件。那么他们之间到底是什么关系呢,其实最终他们涉及的只是两个问题          O

大叔的愤怒,你驾驭不了 9743

Android View的onTouch、onClick和onLongClick事件分析

一般我们在开发自定义View的时候,多多少少会涉及onTouch、onClick和onLongClick这几个事件,避免不了就是解决这个几个事件的冲突。往往需要我们程序员来覆写onTouchEvent方法来进行解决。下面来分析下: 三个函数:public boolean onTouch(View v, MotionEvent event); public boolean onLongClick(V

金 2547

Android开发详解之onTouch和onClick详解

Android开发详解之onTouch和onClick详解

qq_43666827的博客 1359

android onTouch事件处理机制

android 事件处理机制是对用户触摸屏幕产生的Motion Event事件的传递响应处理机制。 Motion Event事件类型很多,包括单触点及多触点的各种情况,可以参考这篇文章Android MotionEvent详解本文不对源码做详细分析,源码分析可参考: Andriod 从源码的角度详解View,ViewGroup的Touch事件的分发机制处理机制涉及activity,viewGr

peter_water的博客 4816

一个view如何同时响应onTouch和onClick事件

一个view如何同时响应onTouch和onClick事件   在项目中遇到的问题,需要同时给imageVIew设置onTouch和onClick事件 , 在onTouch事件中执行拖动操作,在onClick中执行显示一个对话框,可是两个事件一直有冲突。onTouch事件的返回值是boolean类型的,如果返回true ,那么就把事件拦截,onclick肯定无法响应;返回false,就

小蚂蚁爱搬家 1629

android onTouch与onClick冲突解决方法

本文提供一个解决android中view同时设置onTouch和onClick时冲突问题的参考方法,如果有路过的大神有更好的方法请留言赐教,谢谢!

wqy19920429的专栏 1057

onTouch和onTouchEvent以及onClick的顺序

onTouch和onTouchEvent以及onClick的顺序,有什么区别,又该如何使用? 2016年12月19日 23:04:28fenganit阅读数 4913 通过源码查看: View – dispatchTouchEvent方法中 可以看出: onTouchListener的接口的优先级是要高于onTouchEvent的,假若onTouchListener中的onTouch...

jim1451的博客 1044

安卓实现图片放大缩小,并解决onTouch与onClick冲突

引言: Matrix可以实现图片的变换,再结合onTouch中的事件,就可以实现图片放大缩小功能。而我的这个功能基于单击某个条目实现对该条目对应图片的缩放,所以单独写了一个活动,并且只点击图片,而不进行拖放,需要实现销毁活动的功能。于是,产生了onTouch与onClick冲突,这里我选择了判断操作时间来控制是否响应点击事件。详细实现,见以下代码和注释。 demo: package com.exa...

tran_sient的博客 941
上一篇: Android 网络缓存--Retrofit和OkHttp实现 网络缓存
下一篇: Java 网络获取到的图片转成hex字符串 踏坑日记
huihui_android
博客等级 码龄10年 1粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值