【Android】之【View绘制】

这篇具有很好参考价值的文章主要介绍了【Android】之【View绘制】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、View绘制基本流程

简单的可以说,如 measure,layout,draw 分别对应测量,布局,绘制三个过程。

  • ① measure:测量。系统会先根据xml布局文件和代码中对控件属性的设置,来获取或者计算出每个View和ViewGrop的尺寸,并将这些尺寸保存下来。
  • ② layout:布局。根据测量出的结果以及对应的参数,来确定每一个控件应该显示的位置。
  • ③ draw:绘制。确定好位置后,就将这些控件绘制到屏幕上。

总体流程来说Android 的绘制基本可以分为

  • ①顶级 View 的绘制 --> 也就是​​ViewrootImpl​​​,在这姑且先将它理解为​​Activity​​
  • ② Viewgroup的绘制
  • ③ View 的绘制

自定义View的时候一般需要重写父类的onMeasure()、onLayout()、onDraw()三个方法,来完成视图的展示过程。

二、Android视图层次结构简介

android view绘制流程,android,View绘制

Activity内部有个Window成员,它的实例为PhoneWindow,PhoneWindow有个内部类是DecorView,这个DecorView就是存放布局文件的,里面有TitleActionBar和我们setContentView传入进去的layout布局文件

Window类:是一个抽象类,提供绘制窗口的API。
PhoneWindow:是继承Window的一个具体的类,该类内部包含了一个DecorView对象,该DectorView对象是所有应用窗口(Activity界面)的根View。
DecorView:继承FrameLayout,里面id=content的就是我们传入的布局视图,它可以被认为是 ​​Android​​ 视图树的根节点视图。

android view绘制流程,android,View绘制

AndroidStudio工具中提供了一个布局视察器工具,通过Tools > Android > Layout> Inspector可以查看具体某个Activity的布局情况。上图中,左边树状结构对应了右边的可视图,可见DecorView是整个界面的根视图,对应右边的红色框,是整个屏幕的大小。黄色边框为状态栏部分;那个绿色边框中有两个部分,一个是白框中的ActionBar,对应了上图中紫色部分的TitleActionBar部分,即标题栏,平时咱们可以在Activity中将其隐藏掉;另外一个蓝色边框部分,对应上图中最里面的蓝色部分,即ContentView部分。下图中左边有两个蓝色框,上面那个中有个“contain_layout”,这个就是Activity中setContentView中设置的layout.xml布局文件中的最外层父布局,咱们能通过layout布局文件直接完全操控的也就是这一块,当其被add到视图系统中时,会被系统裹上ContentFrameLayout(显然是FrameLayout的子类),这也就是为什么添加layout.xml视图的方法叫setContentView(…)而不叫setView(…)的原因。

三、相关问题点

1、什么是 Activity?从视图角度分析

  • ​​Activity​​​ 并不负责视图控制,它只是控制生命周期和处理事件。真正控制视图的是​​Window​​​。一个​​Activity​​​ 包含了一个​​Window​​​,​​Window​​才是真正代表一个窗口。
  • Activity​​​就像一个控制器,统筹视图的添加与显示,以及通过其他回调方法,来与​​Window​​​、以及​​View​​ 进行交互。

2、什么是Window?

  • ​​Window​​​ 是一个抽象类,实际在​​Activity​​​中持有的是其子类​​PhoneWindow​​​。​​PhoneWindow​​​中有个内部类​​DecorView​​​,通过创建​​DecorView​​​ 来加载​​Activity​​​中设置的布局​​R.layout.activity_main​​

  • Window​​​ 是视图的承载器,内部持有一个​​DecorView​​​,而这个​​DecorView​​​才是​​view​​ 的根布局。

  • Window​​​ 通过​​WindowManager​​​ 将​​DecorView​​​ 加载其中,并将​​DecorView​​​ 交给​​ViewRootimpl​​,进行视图绘制以及其他交互

3、什么是DecorView?

  • ​​DecorView​​​ 是 ​​FrameLayout​​​ 的子类,它可以被认为是 ​​Android​​ 视图树的根节点视图。

  • ​​DecorView​​​ 作为顶级 ​​View​​,一般情况下它内部包含一个竖直方向的 ​​LinearLayout​​,在这个 ​​LinearLayout​​ 里面有上下三个部分,上面是个 ​​ViewStub​​,延迟加载的视图(应该是设置​​ActionBar​​,根据 ​​Theme​​ 设置),中间的是标题栏(根据Theme设置,有的布局没有),下面的是内容栏。具体情况和Android版本及主体有关。

  • ​​在 ​​Activity​​​ 中通过 ​​setContentView​​​ 所设置的布局文件其实就是被加到内容栏之中的,成为其唯一子 ​​View​​​,就是上面的 ​​id​​​ 为 ​​content​​​ 的 ​​FrameLayout​​​ 中,在代码中可以通过 ​​content​​ 来得到对应加载的布局。

4、什么是 ViewRootImpl

从结构上来看,​​ViewRootImpl​​​ 和 ​​ViewGroup​​ 其实是一种东西。

相同点

  • 它们都继承了​​ViewParent​​。
  • ViewParent​​​ 是一个接口,定义了一些父​​View​​​ 的基本行为,比如​​requestlayout​​​,​​getparent​​ 等。

不同点

  • ViewRootImpl​​​ 并不会像​​ViewGroup​​ 一样被真正绘制在屏幕上
  • 在​​Activity​​​ 中,它是专门用来绘制​​DecorView​​​ 的,核心方法是​​setView​​
    android view绘制流程,android,View绘制

5、Activity,window,View 三者之间的关系是什么?

​​window​​​ 是 ​​activity​​​ 的一个成员变量,​​window​​​ 和 ​​View​​ 是“显示器”和“显示内容”的关系

  • Window 抽象类,PhoneWindow 唯一实现类,用于加载​​Activity​​​ 的顶级​​View​​​ –​​DecorView​​

  • 一个 Activity 对应一个 Window 也就是 PhoneWindow,一个 PhoneWindow 持有一个 DecorView 的实例,DecorView 本身是一个 FrameLayout

6、Activity、PhoneWindow、DecorView 关系图

类似的问题,其实问的基本是一个东西。activity​​​ 的 ​​setContentView​​​ 方法实际上是就是交给 ​​phonewindow​​​ 去做的。​​window​​​ 和 ​​View​​ 的关系可以类比为显示器和显示的内容。
android view绘制流程,android,View绘制

7、Android 中 xml 布局怎么显示到屏幕上的?

  • 在整个 ​​Activity​​​ 的生命周期中,​​setContentView​​​ 是在 ​​onCreate​​​ 中调用的,它实现了对资源文件的解析,完成了 ​​xml​​​ 文件到 ​​View​​ 的转化。

  • 那么 View 真正开始绘制是在哪个生命周期呢?
    答案是 ​​onResume​​ 结束后

  • onResume​​​ 之后,从 Activity 中的 Window 实例中获取​​Decorview​​。
    调用​​activity​​​ 中​​windowmanager​​​ 的​​addView​​​ 方法,将​​decorView​​​ 传入到​​ViewRootImpl​​​ 的​​setView​​ 方法中通过​​ViewRootImpl.setView()​​​ 来完成​​View​​ 的绘制

四、参考

  • Android View 绘制流程

  • 【朝花夕拾】Android自定义View篇之(一)View绘制流程

  • Android View绘制流程

  • Android View绘制流程

  • 一文梳理自定义View工作流程

  • Android View的绘制流程

  • Android视图绘制流程完全解析,带你一步步深入了解View

  • 从 XML 到 View 显示在屏幕上,都发生了什么?文章来源地址https://www.toymoban.com/news/detail-714253.html

到了这里,关于【Android】之【View绘制】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Android View动画整理

    Android View动画整理

    View 动画相关内容可参考官网 动画资源 此前也有写 View 动画相关的内容,但都只是记录代码,没有特别分析。以此篇作为汇总、整理、分析。 Android View 动画有4中,分别是 平移动画 TranslateAnimation 缩放动画 ScaleAnimation 旋转动画 RotateAnimation 透明度动画 AlphaAnimation View 动画可以

    2024年02月11日
    浏览(9)
  • Android进阶 View事件体系(二):从源码解析View的事件分发

    Android进阶 View事件体系(二):从源码解析View的事件分发

    本篇文章为总结View事件体系的第二篇文章,前一篇文章的在这里:Android进阶 View事件体系(一):概要介绍和实现View的滑动 本篇文章将专注于介绍View的点击事件的分发,介绍的内容主要有: 点击事件的传递原则 解析Activity的构成 源码解析View的事件分发 源码解析View对点击

    2024年02月06日
    浏览(19)
  • Android View滑动处理大法

    Android View滑动处理大法

    原文链接 Android View滑动处理大法 对于触控式操作来说,滑动是一个特别重要的手势操作,如何做到让应用程序的页面滑动起来如丝般顺滑,让用户感觉到手起刀落的流畅感,是开发人猿需要重点解决的问题,这对提升用户体验是最为重要的事情。本文就将探讨一下,Android中

    2024年02月13日
    浏览(6)
  • android 自定义圆角View

    public class CustomView extends View {     private float cornerRadius;     public CustomView(Context context) {         super(context);         init();     }     public CustomView(Context context, AttributeSet attrs) {         super(context, attrs);         TypedArray typedArray = context.obt

    2024年02月11日
    浏览(12)
  • android开发之Android 自定义滑动解锁View

    android开发之Android 自定义滑动解锁View

    自定义滑动解锁View 需求如下: 近期需要做一个类似屏幕滑动解锁的功能,右划开始,左划暂停。 需求效果图如下 实现效果展示 自定义view如下 /** Desc 自定义滑动解锁View Author ZY Mail sunnyfor98@gmail.com Date 2021/5/17 11:52 */ @SuppressLint(“ClickableViewAccessibility”) class SlideSwitchButton :

    2024年02月13日
    浏览(10)
  • Android 动态控制view的大小

    这样就实现了控件尺寸随着我们手指滑动变化了。 OnTouchListener中有event.getX(),event.getY(),和event.getRawX(),event.getRawY(),他们究竟有什么区别了? getX和getY代表相当于控件本身的位置,getRawX和getRawY相对屏幕的位置

    2023年04月08日
    浏览(7)
  • Android动画深入分析(View动画)

    Android动画深入分析(View动画)

    Android的动画我其实在View的滑动里面写过,主要还是分为2点。 一个就是View动画,还有一个是属性动画 先讲述 View动画 View动画主要分为4种, 平移动画 , 缩放动画 , 旋转动画 , 透明度动画 。 还有一个叫 帧动画 ,但是表现方式和上面4种不太一样 一般情况下我们是在xml里面定义动

    2024年02月07日
    浏览(12)
  • Android View实现滑动的方式

    实现View的滑动有三种方式 通过View本身提供的scrollTo/scrollBy方法实现滑动 通过动画给View施加平移效果来实现滑动 通过改变View LayoutParams使得View重新布局从而实现滑动 scrollTo:通过传递的参数实现绝对滑动 scrollBy:通过传递的参数实现相对滑动 scrollTo和scrollBy只能改变View内容

    2024年02月16日
    浏览(12)
  • Android 遍历界面所有的View

    Android 遍历界面所有的View

    关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。 我们继续总结学习,温故知新。 本文讲述如何遍历获取页面中所有的view,并输出对应的id,textview文

    2024年02月08日
    浏览(6)
  • 无涯教程-Android - List View函数

    Android ListView 是垂直滚动列表中显示的视图,使用 Adapter 从列表(如数组或数据库)中获取内容的列表项会自动插入列表中。 适配器(Adapter)实际上是UI组件和将数据填充到UI组件中的数据源之间的桥梁,适配器保存数据并将数据发送到适配器视图,该视图可以从适配器视图获取数

    2024年02月10日
    浏览(8)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包