
android View扩大触摸选区
灵活性:可以通过添加不同类型的TouchDelegate实现多种触摸响应逻辑。 可扩展性:支持多个视图同时响应触摸事件,适用于复杂布局需求。 代码管理:将触摸事件逻辑封装在各个TouchDelegate中,简化代码管理和维护。
发布日期:2021-05-18 09:00:22
浏览次数:42
分类:精选文章
本文共 2531 字,大约阅读时间需要 8 分钟。
在Android中实现展开式触突触响应
概述
在Android开发中,当需要在不同的View组件中处理touch事件时,TouchDelegate是一个非常有用的工具。通过TouchDelegate,我们可以将触摸事件分解处理,实现各个视图对触摸事件的响应分配。为了更灵活地管理触点事件,我们可以创建一个TouchDelegateComposite容器类,它能够�管理多个touch delegate的组合。
TouchDelegateComposite实现详解
类结构定义
public class TouchDelegateComposite extends TouchDelegate { private final ListmDelegates = new ArrayList<>(); private final View mParent; public TouchDelegateComposite(@NonNull View parent) { super(null, parent); mParent = parent; } public void addDelegate(@NonNull TouchDelegate delegate) { mDelegates.add(delegate); } public void build() { mParent.setTouchDelegate(this); } @Override public boolean onTouchEvent(MotionEvent event) { boolean res = false; float x = event.getX(); float y = event.getY(); for (TouchDelegate delegate : mDelegates) { event.setLocation(x, y); res = delegate.onTouchEvent(event) || res; } return res; }}
功能的核心逻辑
construct
方法:初始化父视图并将TouchDelegateComposite设置为父视图的touch delegate。addDelegate
方法:将新的TouchDelegate添加到委派列表中。onTouchEvent
方法:遍历所有注册的委派并执行touch事件处理。通过将事件位置设定为当前位置,确保每个委派收到的都是同一触摸坐标,其结果通过逻辑或操作合并,最终返回触发结果。
优势分析
触突触区域的扩展实现
方法逻辑说明
protected void expandTouchView(View parent, View... views) { Rect parentRect = new Rect(); parent.getHitRect(parentRect); TouchDelegateComposite touchDelegate = new TouchDelegateComposite(parent); for (View view : views) { Rect viewRect = new Rect(); view.getHitRect(viewRect); // 调整视图的边界基于布局参数 viewRect.left = viewRect.left - ((ConstraintLayout.LayoutParams) view.getLayoutParams()).leftMargin; // 保持与父视图对齐,右边扩展到布局参数定义的区域 viewRect.right = parentRect.right; viewRect.top = parentRect.top; viewRect.bottom = parentRect.bottom; // 注册TouchDelegate,处理触摸响应 touchDelegate.addDelegate(new TouchDelegate(viewRect, view)); } // 构建并设置TouchDelegate touchDelegate.build();}
条件说明
parentRect
:获取父视图的最小碰撞矩形区域。viewRect
:获取当前视图的最小碰撞矩形,根据布局参数进行边界调整。TouchDelegate
创建:每个视图对应一个TouchDelegate实例,处理其触摸响应事件。touchDelegate.build()
:完成注册所有TouchDelegate实例并设置为父视图的touch delegate。
实用场景示例
在ConstraintLayout场景中,扩展触点支持至各个相关组件之间。通过类似方式,可以灵活地控制触摸触发范围,提升用户交互体验。
总结
通过以上方法实现的扩展式触摸响应机制,可有效管理多个视图间的触摸事件,从而提供更灵活的用户交互体验。这种方法在复杂布局场景中尤为有用,可帮助开发者轻松扩展触摸响应区域。
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2025年05月11日 04时58分05秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
openssl服务器证书操作
2021-05-10
我用wxPython搭建GUI量化系统之最小架构的运行
2021-05-10
selenium+python之切换窗口
2021-05-10
重载和重写的区别:
2021-05-10
账号转账演示事务
2021-05-10
map[]和map.at()取值之间的区别
2021-05-11
Struts2-从值栈获取list集合数据(三种方式)
2021-05-11
VTK:可视化之RandomProbe
2021-05-12
Java时间
2021-05-12
【编程】C语言入门:1到 100 的所有整数中出现多少个数字9
2021-05-12
pair的用法
2021-05-12
javaWeb服务详解(含源代码,测试通过,注释) ——Emp的Dao层
2021-05-14
echarts 基本图表开发小结
2021-05-14
TreeSet、TreeMap
2021-05-14
JVM内存模型
2021-05-14
可变长度参数
2021-05-14
GitHub上传时,项目在已有文档时直接push出现错误解决方案
2021-05-14
嵌入式系统试题库(CSU)
2021-05-15
00010.02最基础客户信息管理软件(意义类的小项目,练习基础,不涉及数据库)
2021-05-15