IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 安卓View的代理分发事件TouchDelegate -> 正文阅读

[移动开发]安卓View的代理分发事件TouchDelegate

????????之前在重新翻看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的目的。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-03-12 17:41:04  更:2022-03-12 17:42:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 19:02:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码