页面View Tree简介

深入一些,看下Client这边ViewTree相关原理

我们在日常开发中,会override Activity的onCreate方法,并且调用setContentView方法对页面的内容View进行设置。 而android viewTree体系的根就是在这个方法中进行建立的,我们这篇文章将说下viewTree的原理。

viewTree根结点建立

调用setContentView后,会触发一个DecorView对象的创建,DecorView对象很重要。从下面的层级图可以看到DecorView继承自FrameLayout,并且添加到window对象上,是android视图所有view的根节点。我们调用setContentView设置的view,都添加到android.R.id.content这个节点下,使用View和ViewGroup组合的方式构建出一个视图树

View ViewGroup

从类结构来说,View是ViewGroup的父类,ViewGroup的定位是View的容器,在设计模式上属于组合模式.measure layout draw的调用,都是从根节点开始,用后序的方式进行遍历计算。其中某个节点的数据有变化,会引起父节点和相关联节点的重绘。

整体事件

ViewRootImpl接到系统传来的事件后,以消息的方式(handler(MainLooper))通知到activity。activity再从DecorView开始遍历ViewTree,对事件进行分发和消费。具体如下:

  • 事件产生:当用户在触摸屏幕上进行操作时,例如点击、滑动或长按,Android 系统会将这些操作转化为相应的事件。

  • 事件分发:事件分发是指将产生的事件传递给正确的 View 进行处理。在 Android 中,事件分发是基于视图层级结构进行的。事件从根 View(通常是 Activity 的根布局)开始,逐级向下传递,直到找到合适的目标 View 来处理事件。

  • 分发顺序:事件首先传递给根 View,然后通过 View 的 dispatchTouchEvent()方法逐级向下传递给子 View,直到找到目标 View 或事件被消费。

  • 事件分发过程中会依次触发三个关键方法:

    • dispatchTouchEvent():负责事件的分发,决定事件的传递方向。
    • onInterceptTouchEvent():用于拦截事件,即判断是否将事件截获并交由自身处理。
    • onTouchEvent():用于处理事件,执行具体的逻辑操作。
  • 事件处理:一旦目标 View 被确定,事件就会传递给该 View 的 onTouchEvent()方法进行处理。在 onTouchEvent()方法中,开发者可以根据事件类型(例如点击、滑动、长按等)执行相应的操作。事件的处理结果可能会影响后续事件的传递。

  • 事件传递结束:事件传递会一直沿着 View 层级向下传递,直到事件被消费或到达最底层的 View。如果事件在某个 View 上被消费(即被处理),则事件传递结束。否则,事件会继续向上传递给父级 View 进行处理。

需要注意的是,事件的传递是根据 View 层级结构和触摸事件的性质决定的。View 可以设置监听器来处理特定的事件,也可以重写相关的事件处理方法来实现自定义的事件处理逻辑。此外,Android 还提供了一些特殊的事件类型,例如手势(Gesture)事件、滚动(Scroll)事件等。这些事件可以通过特定的监听器或手势识别器来处理。

事件主要包括点按、长按、拖拽、滑动等,点按又包括单击和双击,另外还包括单指操作和多指操作,这些都构成了 Android 中的事件响应。事件即 MotionEvent,继承于 InputEvent,用于标记各种动作事件。其中比较重要的有以下三个:

  • MotionEvent.ACTION_DOWN:按下 View,是所有事件的开始。
  • MotionEvent.ACTION_MOVE:滑动事件。
  • MotionEvent.ACTION_UP:与 down 对应,表示抬起。

View 的坐标体系原点在屏幕左上角,View 常用属性有 mTouchSlop(系统能识别的被认为是滑动的最小距离)、VelocityTracker(速度追踪)和 GestureDetector(手势检测)。处理滑动时,用 mTouchSlop 常量过滤未达到临界值的移动行为。VelocityTracker 用于追踪手指滑动的速度,包括水平和竖直方向的速度。GestureDetector 用于辅助检测用户的单击、滑动、长按、双击等行为。

相关推荐
SRC_BLUE_171 小时前
SQLI LABS | Less-39 GET-Stacked Query Injection-Intiger Based
android·网络安全·adb·less
无尽的大道5 小时前
Android打包流程图
android
镭封6 小时前
android studio 配置过程
android·ide·android studio
夜雨星辰4876 小时前
Android Studio 学习——整体框架和概念
android·学习·android studio
邹阿涛涛涛涛涛涛6 小时前
月之暗面招 Android 开发,大家快来投简历呀
android·人工智能·aigc
IAM四十二6 小时前
Jetpack Compose State 你用对了吗?
android·android jetpack·composer
奶茶喵喵叫7 小时前
Android开发中的隐藏控件技巧
android
Winston Wood9 小时前
Android中Activity启动的模式
android
众乐认证9 小时前
Android Auto 不再用于旧手机
android·google·智能手机·android auto
三杯温开水9 小时前
新的服务器Centos7.6 安卓基础的环境配置(新服务器可直接粘贴使用配置)
android·运维·服务器