安卓View的代理分发事件TouchDelegate

本文探讨了Android View源码中的TouchDelegate特性,如何通过这个API扩展目标View的触摸范围并灵活分发事件,提升用户体验。通过实例说明其设置、使用和在优化点击区域方面的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        之前在重新翻看view触摸事件传递的源码时,意外在View源码中发现了一个之前不曾注意到的api:TouchDelegate,定义非常简单,但是面对一些特殊的view操作需求却有奇效。

定义是:

/**
 * The delegate to handle touch events that are physically in this view
 * but should be handled by another view.
 */
 private TouchDelegate mTouchDelegate = null;

使用位置在:

public boolean onTouchEvent(MotionEvent event) {
    。。。。
     if (mTouchDelegate != null) {
         if (mTouchDelegate.onTouchEvent(event)) {
             return true;
          }
      }
      。。。。
}

设置方法:

setTouchDelegate(TouchDelegate delegate) {}

就可以使用了。

源代码在:

android.view.TouchDelegate

唯一的构造函数:

public TouchDelegate(Rect bounds, View delegateView)
bounds: 
    Bounds in local coordinates of the containing view that should be mapped to the delegate view。
大意是:应映射到代理视图的包含视图的局部坐标中的边界。
 delegateView: 
    The view that should receive motion events。
应该接收运动事件的视图。

实现分发事件判断是:

boolean onTouchEvent(MotionEvent event){
    ......
    if (sendToDelegate) {
       final View delegateView = mDelegateView;

        if (hit) {
             // Offset event coordinates to be inside the target view
             event.setLocation(delegateView.getWidth() / 2, delegateView.getHeight() / 2);
         } else {
             // Offset event coordinates to be outside the target view (in case it does
             // something like tracking pressed state)
              int slop = mSlop;
              event.setLocation(-(slop * 2), -(slop * 2));
           }
            //进入到代理view的事件分发流程。
           handled = delegateView.dispatchTouchEvent(event);
      }
     .......
}

使用场景:

  1.         可以增加TargetView的触摸范围,实现扩大点击区域优化用户体验,将周围的view的代理view设置为此TargetView,那么此时周围view的触摸事件都会分发到TargetView上。
  2.         源码中可以发现对于代理分发事件的处理是很直接的, 代理view不为null就直接将事件全部分发给代理view,同时代理view的引用可以随时设置,即setTouchDelegate(),那么可以在触摸事件持续过程中更换代理view,以达到单次事件过程中传递给多个view的目的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值