看清安卓自定义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动作监听不到的问题。

总结

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

相关文章
|
2月前
|
缓存 前端开发 Android开发
安卓开发中的自定义视图:从零到英雄
【10月更文挑战第42天】 在安卓的世界里,自定义视图是一块画布,让开发者能够绘制出独一无二的界面体验。本文将带你走进自定义视图的大门,通过深入浅出的方式,让你从零基础到能够独立设计并实现复杂的自定义组件。我们将探索自定义视图的核心概念、实现步骤,以及如何优化你的视图以提高性能和兼容性。准备好了吗?让我们开始这段创造性的旅程吧!
32 1
|
3月前
|
数据可视化 Android开发 开发者
安卓应用开发中的自定义View组件
【10月更文挑战第5天】在安卓应用开发中,自定义View组件是提升用户交互体验的利器。本篇将深入探讨如何从零开始创建自定义View,包括设计理念、实现步骤以及性能优化技巧,帮助开发者打造流畅且富有创意的用户界面。
116 0
|
2月前
|
XML 前端开发 Android开发
Android:UI:Drawable:View/ImageView与Drawable
通过本文的介绍,我们详细探讨了Android中Drawable、View和ImageView的使用方法及其相互关系。Drawable作为图像和图形的抽象表示,提供了丰富的子类和自定义能力,使得开发者能够灵活地实现各种UI效果。View和ImageView则通过使用Drawable实现了各种图像和图形的显示需求。希望本文能为您在Android开发中使用Drawable提供有价值的参考和指导。
47 2
|
2月前
|
搜索推荐 前端开发 Android开发
安卓应用开发中的自定义视图实现
【10月更文挑战第30天】在安卓开发的海洋中,自定义视图是那抹不可或缺的亮色,它为应用界面的个性化和交互体验的提升提供了无限可能。本文将深入探讨如何在安卓平台创建自定义视图,并展示如何通过代码实现这一过程。我们将从基础出发,逐步引导你理解自定义视图的核心概念,然后通过一个实际的代码示例,详细讲解如何将理论应用于实践,最终实现一个美观且具有良好用户体验的自定义控件。无论你是想提高自己的开发技能,还是仅仅出于对安卓开发的兴趣,这篇文章都将为你提供价值。
|
2月前
|
Android开发 开发者 UED
安卓开发中自定义View的实现与性能优化
【10月更文挑战第28天】在安卓开发领域,自定义View是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何高效地创建和管理自定义View,以及如何通过代码和性能调优来确保流畅的交互体验。我们将一起学习自定义View的生命周期、绘图基础和事件处理,进而探索内存和布局优化技巧,最终实现既美观又高效的安卓界面。
44 5
|
3月前
|
缓存 数据处理 Android开发
在 Android 中使用 RxJava 更新 View
【10月更文挑战第20天】使用 RxJava 来更新 View 可以提供更优雅、更高效的解决方案。通过合理地运用操作符和订阅机制,我们能够轻松地处理异步数据并在主线程中进行 View 的更新。在实际应用中,需要根据具体情况进行灵活运用,并注意相关的注意事项和性能优化,以确保应用的稳定性和流畅性。可以通过不断的实践和探索,进一步掌握在 Android 中使用 RxJava 更新 View 的技巧和方法,为开发高质量的 Android 应用提供有力支持。
|
3月前
|
缓存 调度 Android开发
Android 在子线程更新 View
【10月更文挑战第21天】在 Android 开发中,虽然不能直接在子线程更新 View,但通过使用 Handler、AsyncTask 或 RxJava 等方法,可以实现子线程操作并在主线程更新 View 的目的。在实际应用中,需要根据具体情况选择合适的方法,并注意相关的注意事项和性能优化,以确保应用的稳定性和流畅性。可以通过不断的实践和探索,进一步掌握在子线程更新 View 的技巧和方法,为开发高质量的 Android 应用提供支持。
46 2
|
3月前
|
XML 前端开发 Android开发
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
|
3月前
|
XML 前端开发 Android开发
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
29 2
|
3月前
|
XML 前端开发 Java
安卓应用开发中的自定义View组件
【10月更文挑战第5天】自定义View是安卓应用开发的一块基石,它为开发者提供了无限的可能。通过掌握其原理和实现方法,可以创造出既美观又实用的用户界面。本文将引导你了解自定义View的创建过程,包括绘制技巧、事件处理以及性能优化等关键步骤。