高级UI(二): 触摸反馈

简介: 触摸反馈应该是自定义view最简单的部分了,不过内部的原理是比较复杂的,去了解里面的核心机制,需要自己去阅读源码,才能更好理解整个触摸机制,当然,知其所以然也是远远不够的,下面我就带大家了解自定义view触摸机制的难点重点

1681520361953.png

改不完的 Bug,写不完的矫情。公众号 杨正友 现在专注移动基础开发 ,涵盖音视频和 APM,信息安全等各个知识领域;只做全网最 Geek 的公众号,欢迎您的关注!

  

触摸反馈应该是自定义view最简单的部分了,不过内部的原理是比较复杂的,去了解里面的核心机制,需要自己去阅读源码,才能更好理解整个触摸机制,当然,知其所以然也是远远不够的,下面我就带大家了解自定义view触摸机制的难点重点。

一. 概念

触摸反馈就是View对你的用户的触摸事件进行自定义,重写onTouchEvent方法

二.自定义单View的触摸反馈

  • 重写 onTouchEvent(),在方法内部定制触摸反馈算法
  • 是否消费事件取决于 ACTION_DOWN 事件 或 POINT_DOWN 事件是否返回 为true
  • MotionEvent
  • getActionMasked() 和 getAction()
  • POINT_DOWN / POINT_UP 和 getActionIndex()

三.触摸反馈的流程

  • Activity.dispatchEvent()
  • 递归: ViewGroup(View).dispatchTouchEvent()
  • ViewGroup.onInterceptTouchEvent()
  • child.dispatchTouchEvent()
  • super.dispatchTouchEvent()
  • View.onTouchEvent()
  • Activity.onTouchEvent()

四.View.dispatchTouchEvent()

  • 如果设置了 OnTouchListener ,调用 OnTouchListener.onTouch()
  • 如果 OnTouchListener 消费了该事件,返回 true
  • 如果 OnTouchListener 没有消费该事件,继续调用自己的 onTouchEvent 并返回 和 onTouchEvent相同的结果
  • 如果没有设置OnTouchListener,同上

五.ViewGroup.dispatchTouchEvent()

  • 如果是用户初次按下 (ACTION_DOWN) ,清空TouchTargets 和 DISALLOW_INTERCEPT 标记
  • 拦截处理 getParent().requestDisallowInterceptTouchEvent()
  • 如果不拦截并不是 CANCEL 事件,并且是down 或者 POINT_DOWN ,尝试把pointer (手指) 通过 touchTarget 分配给子View;并且 如果 分配给 新的子View ,调用 child.dispatchEvent 把 DOWN 事件传给子View
  • 看有没有 TouchTargets
  • 如果没有,调用super.dispatchEvent()
  • 如果有,调用child.dispatchEvent() 把事件传给对应的子View(如果有的话)
  • 如果是 POINT_UP ,从 TouchTargets 中清除 POINTER 信息;如果 UP 或者 CANCEL 重置状态

六.TouchTarget

  • 作用: 记录单view是被哪些 pointer(手指)按下的
  • 结构: 单向链表

七.面试题分享

Alibaba 面试题: 有一个 ViewGroup, 然后手指头接触 Button ,手指头滑开了,滑开又松手的过程,整个事件发生了什么?经历了什么?

 一开始ViewGroup 会接受到整个事件序列的第一个事件: ACTION_DOWNViewGroup#dispatchTouchEvent 收到ACTION_DOWN 后,


  开始询问 ViewGroup#onInterceptTouchEvent 是否需要拦截,

默认情况下 ViewGroup#onInterceptTouchEvent 返回false 不拦截,开始向下传递ACTION_DOWN 事件,


  Buttton#dispatchTouchEvent 收到ACTION_DOWN 询问onTouchEvent 是否处理,

Button 默认处理,此后的所有事件序列都直接跨过 ViewGroup#onInterceptTouchEvent 的判断直接传递给Button


  但 ViewGroup#dispatchTouchEvent 会收到所有事件。随着手指的滑动Button 的坐标发生了改变,当手指抬起时触发 Button#onClick 事件。

八.参考资料

相关文章
|
8月前
|
设计模式
二十三种设计模式全面解析-桥接模式的高级应用:构建灵活的跨平台UI框架
二十三种设计模式全面解析-桥接模式的高级应用:构建灵活的跨平台UI框架
176 0
高级UI系列(四) 扩展TextView 边角Drawable实战篇
高级UI系列(四) 扩展TextView 边角Drawable实战篇
107 0
高级UI系列(四) 扩展TextView 边角Drawable实战篇
|
XML Java API
高级UI系列(三): 自定义UI动画篇
高级UI系列(三): 自定义UI动画篇
138 0
高级UI系列(三): 自定义UI动画篇
|
XML 存储 前端开发
高级UI系列(一): 自定义UI理论篇(2)
简介: 自定义view是区分中级开发和初级开发的分水岭,虽说今年校招,工作三四年的老程序员一直在劝退客户端,作为职场打拼多年的老菜鸟,对android还是挺有信心的,虽说对view的知识也只是停留在纸上,很少真正落地做一些复杂高性能的ui控件,之前在akulaku确实见识了一群技术大牛,高级ui控件伸手就来,让我羡慕不已,这一次我也从基础到源码再到实战开始写几篇自定义view教程。大家有什么好的见解也欢迎到评论区多多交流。
170 0
高级UI系列(一): 自定义UI理论篇(2)
|
XML 程序员 Android开发
高级UI系列(一): 自定义UI理论篇(1)
自定义view是区分中级开发和初级开发的分水岭,虽说今年校招,工作三四年的老程序员一直在劝退客户端,作为职场打拼多年的老菜鸟,对android还是挺有信心的,虽说对view的知识也只是停留在纸上,很少真正落地做一些复杂高性能的ui控件,之前在akulaku确实见识了一群技术大牛,高级ui控件伸手就来,让我羡慕不已,这一次我也从基础到源码再到实战开始写几篇自定义view教程。大家有什么好的见解也欢迎到评论区多多交流。
174 0
高级UI系列(一): 自定义UI理论篇(1)
|
Java 测试技术 API
Appium自动化(10) - appium高级元素定位方式之 UI Automator API 的详解
Appium自动化(10) - appium高级元素定位方式之 UI Automator API 的详解
258 0
Appium自动化(10) - appium高级元素定位方式之 UI Automator API 的详解
阿里云移动端播放器高级功能---UI播放器
用户想要实现一个视频播放除了要集成我们播放器SDK之外,还需要做一些UI交互的东西。要实现一个完整的视频播放还是需要做很多工作的。那么我们提供了一套完整的UI播放器,用户可以非常快速的集成进去来实现完整的播放器功能。
5792 0
|
SQL 数据库 iOS开发
iOS中 DataBase SQL数据库 UI_高级
SQL(Structured query Lauguage) :结构化 查询 语言 1.创建表格的SQL语句 create table if not exists Teacher(tea_id integer primary key autoincrement,tea_nam...
998 0
|
数据可视化 iOS开发
ios可视化编程 UI高级 UI_13
一、简单的说,IB Xib就是拖控件编程,也可以说是可视化编程(所见即所得),使用Xib编程,相对于纯代码,可以省下大量的敲代码时间,从而提高程序的开发时间,Xcode  4 之后才可以在工程中直接使用xib编程;  使用xib编程只是减轻了MVC中的V设计的工作量,学好Xib有助...
920 0

热门文章

最新文章