作家
登录

Android View绘制的三大流程

作者: 来源: 2017-08-22 11:05:27 阅读 我要评论

【51CTO晃荡】8.26 带你与清华大年夜学、搜狗、京东大年夜咖们一路商量基于算法的IT运维实践


介绍

Android的View是树形构造的:

根本概念

在介绍View的三大年夜流程之前,我们必须先介绍一些根本的概念,才能更好地舆解这全部过程。

Window的概念

1.根据各自的测量规矩遍历Children元素,调用getChildMeasureSpec办法获得Child的measureSpec;

View的工作流程主如果指measure、layout、draw这三大年夜流程,即测量、构造和绘制,个中measure肯定View的测量宽高,layout根据测量的宽高肯定View在其父View中的四个顶点的地位,而draw则将View绘制到屏幕上,如许经由过程ViewGroup的递归遍历,一个View树就展如今屏幕上了。说的简单,下面带大年夜家一步一步大年夜源码平分析:

经由过程以上代码,DecorView的MeasureSpec的产生过程就很明白了,因为DecorView是FrameLyaout的子类,属于ViewGroup,对于ViewGroup来说,除了完成本身的measure过程外,还会遍历去调用所有子元素的measure办法,各个子元素再递归去履行这个过程。和View不合的是,ViewGroup是一个抽象类,他没有重写View的onMeasure办法,这里很好懂得,因为每个具体的ViewGroup实现类的功能是不合的,若何测量应当让它本身决定,比如LinearLayout和RelativeLayout。

Window表示的是一个窗口的概念,它是站在WindowManagerService角度上的一个抽象的概念,Android中所有的视图都是经由过程Window来竽暌箍现的,不管是Activity、Dialog照样Toast,只要有View的处所就必定有Window。

关于Window这方面的内容,我们这里先懂得一个大年夜概

DecorView的概念

DecorView是全部Window界面的最顶层View,View的测量、构造、绘制、事宜分发都是由DecorView往下遍历这个View树。DecorView作为顶级View,一般情况下它内部会包含一个竖直偏向的LinearLayout,在这个LinearLayout琅绫擎有高低两个部分(具体情况和Android的版本及主题有关),膳绫擎是【标题栏】,下面是【内容栏】。在Activity中我们经由过程setContentView所设置的构造文件其实就是被加载到【内容栏】中的,而内容栏的id是content,是以指定构造的办法叫setContent().

ViewRoot的概念

ViewRoot对应于ViewRootImpl类,它是连接WindowManager和DecorView的纽带,View的三大年夜流程均是经由过程ViewRoot来完成的。在ActivityThread中,当Activity对象被创建完之后,会讲DecorView添加到Window中,同时会创建对应的ViewRootImpl,并将ViewRootImpl和DecorView建立接洽关系,并保存到WindowManagerGlobal对象中。

  1. WindowManagerGlobal.java 
  2.  
  3. root = new ViewRootImpl(view.getContext(), display);   
  4. root.setView(view, wparams, panelParentView);  

Java

View的绘制流程是大年夜ViewRoot的performTraversals办法开端的,它经由measure、layout和draw三个过程才能最终将一个View绘制出来,大年夜致流程如下图:

Measure测量

这里须要留意的是,这个抽象的Window概念和PhoneWindow这个类并不是同一个器械,PhoneWindow表示的是手机屏幕的抽象,它充当Activity和DecorView之间的序言,就算没有PhoneWindow也是可以展示View的。

为了更好地舆解View的测量过程,我们还须要懂得MeasureSpec,它是View的一个内部类,它表示对View的测量规格。MeasureSpec代表一个32位int值,高2位代表SpecMode(测量模式),低30位代表SpecSize(测量大年夜小),我们可以看看它的具体实现:

  1. MeasureSpec.java 
  2.  
  3. public static class MeasureSpec {   
  4.         private static final int MODE_SHIFT = 30; 
  5.         private static final int MODE_MASK  = 0x3 << MODE_SHIFT; 
  6.  
  7.         /** 
  8.           * UNSPECIFIED 模式: 
  9.           * 父View
     1/10    1 2 3 4 5 6 下一页 尾页

      推荐阅读

      两种曲线点抽稀算法-Python实现 附代码

    在处理矢量化数据时,记录中往往话苄很多反复数据,对进一步数据处理带来诸多不便。多余的数据一方面浪费了较多的存储空间,另一方面造成所要表达的图形不但滑或不相符标准。是以要经由过程某种规矩,在包管矢量曲线>>>详细阅读


    本文标题:Android View绘制的三大流程

    地址:http://www.17bianji.com/lsqh/36843.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)