android View扩大触摸选区
发布日期: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 List
mDelegates = 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事件处理。通过将事件位置设定为当前位置,确保每个委派收到的都是同一触摸坐标,其结果通过逻辑或操作合并,最终返回触发结果。
优势分析
  • 灵活性:可以通过添加不同类型的TouchDelegate实现多种触摸响应逻辑。
  • 可扩展性:支持多个视图同时响应触摸事件,适用于复杂布局需求。
  • 代码管理:将触摸事件逻辑封装在各个TouchDelegate中,简化代码管理和维护。
  • 触突触区域的扩展实现

    方法逻辑说明
    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场景中,扩展触点支持至各个相关组件之间。通过类似方式,可以灵活地控制触摸触发范围,提升用户交互体验。

    总结

    通过以上方法实现的扩展式触摸响应机制,可有效管理多个视图间的触摸事件,从而提供更灵活的用户交互体验。这种方法在复杂布局场景中尤为有用,可帮助开发者轻松扩展触摸响应区域。

    上一篇:Android应用内无需权限悬浮窗
    下一篇:TextView处理滑动冲突复盘

    发表评论

    最新留言

    能坚持,总会有不一样的收获!
    [***.219.124.196]2025年05月11日 04时58分05秒