看清安卓自定义view中触摸事件的“盲区”

简介: 今天的工作仍然在思考自定义view,因为需要调服务器接口,而这需要一些参数去其他地方拿,不在我调自定义view的页面,所以我希望能封装好这个自定义view,对外只要开放相应监听接口即可

前言

今天的工作仍然在思考自定义view,因为需要调服务器接口,而这需要一些参数去其他地方拿,不在我调自定义view的页面,所以我希望能封装好这个自定义view,对外只要开放相应监听接口即可,所以第一步我很快就完成了view的触摸事件监听,使我的控件能满足触摸的反应需求,在对竖屏和横屏适配后,我陷入了如何封装的思考中。

这是关于对控件移动边缘限定的宽高获取:

@Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        // 获取宽-测量规则的模式和大小
        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        int widthSize = MeasureSpec.getSize(widthMeasureSpec);
        // 获取高-测量规则的模式和大小
         heightMode = MeasureSpec.getMode(heightMeasureSpec);
         heightSize = MeasureSpec.getSize(heightMeasureSpec);
        //获取xml里面设置的宽高的像素值
        XLog.i(TAG + " widthSize= " + widthSize + ",heightSize = " + heightSize);
    }

此外,我发现可以在上面这个测量方法中初始化一些从外部传入的全局变量

而在onDraw()方法复写中,只要getWiidth()getHeight 即可轻松获取高和宽。

正篇

但我还没想多久,就发现自己手中的自定义view有问题,竖屏时因为固定在Dialog中的所以没有发现,而横屏就出现了问题,有时候控件在view的边缘按下时会出现卡死在边缘无法回到我预设的起始点,于是赶快看了代码:

setOnTouchListener(new OnTouchListener() { //设置触控监听
 @Override
 public boolean onTouch(View v, MotionEvent ev) {
//因为本人控件为圆形的,故这样写
 final float xx = ev.getX() - widthSize * 0.5, yy = ev.getY() - heightSize * 0.5;
 if (ev.getAction() == MotionEvent.ACTION_DOWN) {
 m.down(xx, yy);//按下时的操作
// m.move(xx, yy);
 }
 m.move(xx, yy);//移动时的操作
 if (ev.getAction() == MotionEvent.ACTION_UP) {
 m.up();//松开时的操作
 }
 return true;//不要返回false
 }
 });

请教完前辈发现,有时候安卓在布局边缘处的触控事件是不会触发为UP操作的,应该如下:

if (ev.getAction() == MotionEvent.ACTION_UP || ev.getAction() == MotionEvent.ACTION_CANCEL || ev.getAction() == MotionEvent.ACTION_OUTSIDE) {
 m.up();//松开时的操作
 }

这里解释一下,ACTION_CANCEL就是对应手势被取消了,而ACTION_OUTSIDE则是表明是触碰超出了正常的 UI 边界,而通过日志发现我的ev.getAction()返回的是3,即ACTION_CANCEL,那为什么会出现这种情况呢?这里有一个问答就说明了这个情况发生的原因:


网络异常,图片无法展示
|


大意就是有人问安卓中出现ACTION_CANCEL是什么原因,下面大佬就回答道,当父级接管运动时,就会发生ACTION_CANCEL,例如,当用户在列表视图中拖动的动作过大,甚至让它即将开始滚动,而不是让你能够按下这其中的按钮。

也就是说我对自定义view的触控过头了,导致了取消事件发生从而出现这个Up动作监听不到的问题。

总结

其实出现这个问题还是我源码阅读不够多,不能想到对策与方法,不过贵在积累,明理而笃行。

相关文章
|
15天前
|
存储 Shell Android开发
基于Android P,自定义Android开机动画的方法
本文详细介绍了基于Android P系统自定义开机动画的步骤,包括动画文件结构、脚本编写、ZIP打包方法以及如何将自定义动画集成到AOSP源码中。
40 2
基于Android P,自定义Android开机动画的方法
|
13天前
|
供应链 物联网 区块链
未来触手可及:探索新兴技术的趋势与应用安卓开发中的自定义视图:从基础到进阶
【8月更文挑战第30天】随着科技的飞速发展,新兴技术如区块链、物联网和虚拟现实正在重塑我们的世界。本文将深入探讨这些技术的发展趋势和应用场景,带你领略未来的可能性。
|
14天前
|
测试技术 Android开发 Python
探索软件测试的艺术:从基础到高级安卓应用开发中的自定义视图
【8月更文挑战第29天】在软件开发的世界中,测试是不可或缺的一环。它如同艺术一般,需要精细的技巧和深厚的知识。本文旨在通过浅显易懂的语言,引领读者从软件测试的基础出发,逐步深入到更复杂的测试策略和工具的使用,最终达到能够独立进行高效测试的水平。我们将一起探索如何通过不同的测试方法来确保软件的质量和性能,就像艺术家通过不同的色彩和笔触来完成一幅画作一样。
|
3天前
|
Android开发
Android中SurfaceView的双缓冲机制和普通View叠加问题解决办法
本文介绍了 Android 平台上的 SurfaceView,这是一种高效的图形渲染控件,尤其适用于视频播放、游戏和图形动画等场景。文章详细解释了其双缓冲机制,该机制通过前后缓冲区交换来减少图像闪烁,提升视觉体验。然而,SurfaceView 与普通 View 叠加时可能存在 Z-Order 不一致、同步问题及混合渲染难题。文中提供了使用 TextureView、调整 Z-Order 和创建自定义组合控件等多种解决方案。
26 9
|
7天前
|
Android开发 容器
Android经典实战之如何获取View和ViewGroup的中心点
本文介绍了在Android中如何获取`View`和`ViewGroup`的中心点坐标,包括计算相对坐标和屏幕上的绝对坐标,并提供了示例代码。特别注意在视图未完成测量时可能出现的宽高为0的问题及解决方案。
20 7
|
13天前
|
XML 搜索推荐 Android开发
安卓开发中的自定义View组件实践
【8月更文挑战第30天】探索Android世界,自定义View是提升应用界面的关键。本文以简洁的语言带你了解如何创建自定义View,从基础到高级技巧,一步步打造个性化的UI组件。
|
15天前
|
Android开发
Android在rootdir根目录创建自定义目录和挂载点的方法
本文介绍了在Android高通平台的根目录下创建自定义目录和挂载点的方法,通过修改Android.mk文件并使用`LOCAL_POST_INSTALL_CMD`变量在编译过程中添加目录,最终在ramdisk.img的系统根路径下成功创建了`/factory/bin`目录。
35 1
|
27天前
|
API Android开发 开发者
Android经典实战之使用ViewCompat来处理View兼容性问题
本文介绍Android中的`ViewCompat`工具类,它是AndroidX库核心部分的重要兼容性组件,确保在不同Android版本间处理视图的一致性。文章列举了设置透明度、旋转、缩放、平移等功能,并提供了背景色、动画及用户交互等实用示例。通过`ViewCompat`,开发者可轻松实现跨版本视图操作,增强应用兼容性。
67 5
|
5天前
|
前端开发 搜索推荐 Android开发
探索安卓开发中的自定义视图##
【9月更文挑战第6天】 在安卓应用开发的世界里,自定义视图如同绘画艺术中的色彩,它们为界面设计增添了无限可能。通过掌握自定义视图的绘制技巧,开发者能够创造出既符合品牌形象又提升用户体验的独特界面元素。本文将深入浅出地介绍如何从零开始构建一个自定义视图,包括基础框架搭建、关键绘图方法实现、事件处理机制以及性能优化策略。准备好让你的安卓应用与众不同了吗?让我们开始吧! ##
|
17天前
|
前端开发 Android开发 开发者
安卓开发中的自定义视图:构建你的第一个控件
【8月更文挑战第26天】在安卓开发的浩瀚海洋中,自定义视图是一块充满魔力的乐土。它不仅是开发者展示创造力的舞台,更是实现独特用户体验的关键。本文将带你步入自定义视图的世界,从基础概念到实战应用,一步步教你如何打造自己的第一个控件。无论你是初学者还是有经验的开发者,这篇文章都将为你的开发之旅增添新的风景。