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 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android UI 绘制流程及原理 -> 正文阅读

[移动开发]Android UI 绘制流程及原理

View添加到窗口中的流程

  1. 创建 DecorView,顶层容器,继承于 FrameLayout。
  2. 根据主题不同,创建不同的基础容器ViewGroup(如: R.layout.screen_simple,是一个线性布局),并添加到 decorView 中。
  3. 基础容器中,有一个ID为 Window.ID_ANDROID_CONTENT(com.android.internal.R.id.content)的FrameLayout布局容器,这个容器就是contentView。开发者调用的 setContentView 方法,就是将自定义的容器追加到 contentView 中。

类图
在这里插入图片描述

  • Window是一个抽象类,定义了绘制窗口的API
  • PhoneWindow是Window具体实现类,该类内部包含DecorView对象。DecorView是所有应用窗口(Activity)的根View,DecorView是PhoneView的内部类,是FrameLayout的子类。

View的绘制流程

  1. 绘制入口
ActivityThread.handlerResumeActivity 
--> WidowManagerImpl.addView(decorView, layoutParams)
--> WindowManagerGlobal.addView()
  1. 绘制的类和方法
ViewRootImpl.setVIew(decorView, layoutParams, parentView)
-->ViewRootImpl.requestLayout()
-->scheduleTraversals() --> doTraversals() --> performTravesals()
  1. 三步骤
ViewRootImpl.performMeasure //测量 
ViewRootImpl.performLayout // 布局
ViewRootImpl.performDraw // 绘制

测量

测量View = 模式 + 尺寸 -> MeasureSpec 32int值
模式: 
    EXACTLY : 精确
    AT_MOST : 最大
    UNSPECIFIED : 
    
MeasureSpec = SpecMode(2) + SpecSize(30)
ViewGroup 容器测量 : measure  -> onMeausre(测量子控件的宽高) -> setMeasuredDimension() -> setMeasuredDimensionRaw(保存自己的宽高)
View measure : measure -> onMeasure(仅测量自己) -> setMeasuredDimension() -> setMeasuredDimensionRaw(保存自己的宽高)

布局

ViewGroup 是一个容器

  1. 调用 view.layout 确定自身的位置,即mLeft,mTop,mRirht,mBottom
  2. 如果是 ViewGroup 类型(容器类型),需要调用 onLayout 确定子 View 的位置(递归调用)

绘制

  1. 绘制背景 :drawBackground(canvas)
  2. 绘制自己 :onDraw(canvas)
  3. 绘制子VIew (如果是ViewGroup):dispatchDraw(canvas)
  4. 绘制前景,滚动条等装饰 :onDrawForeground(canvas)

自定义VIew需要重写的方法

onMeasue() -> onLayout(容器) -> [onDraw]
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-02-14 21:17:24  更:2022-02-14 21:18:02 
 
开发: 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 14:26:23-

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