zoukankan      html  css  js  c++  java
  • View的工作原理

    1、ViewRoot和DecorView                                   

    ViewRoot是连接WindowManager和DecorView的纽带,View的三大流程均是通过ViewRoot来完成的。

    在Activity对象被创建后,会将DecorView添加到Window中,同时创建ViewRoot,将DecorView和ViewRoot关联起来。

    View的绘制流程是从ViewRoot的performTraversals方法开始的,经过measure、layout和draw三个过程将View绘制出来。

    measure测量View的宽和高layout用来确定View在父容器中的放置位置draw将View绘制在屏幕上。

    DecorView为整个Window界面的最顶层View。

    DecorView只有一个子元素为LinearLayout,代表整个Window界面,包含通知栏、标题栏和内容显示栏。LinearLayout有2个FrameLayout:标题栏和内容栏。

    MeasureSpec:View的测量过程,决定了一个View的尺寸规格。

    对于DecorView,其MeasureSpec由窗口的尺寸和其自身的LayoutParams来共同决定;

    对于普通View,其MeasureSpec由父容器的MeasureSpec和自身的LayoutParams来共同决定,MeasureSpec一旦确定后,onMeasure中就可以确定View的测量高和宽。

    2、View的工作流程                                                  

    View的工作流程主要值measure(测量宽、高)、layout(布局:确定最终宽、高和四个顶点的位置)、draw(绘制)这三大流程。

    ViewGroup的measure过程:除了完成自己的measure过程外,还要遍历去调用所有子元素的measure方法。ViewGroup是一个抽象类,提供了一个measureChildren方法。

    draw过程:绘制背景background.draw(canvas)、自己(onDraw)、children(dispatchDraw)、装饰(onDrawScrollBars)。

    View的绘制过程的传递是通过dispatchDraw来实现,dispatchDraw会便利调用所有子元素的draw方法。

    3、自定义View                                                       

    自定义View是一个综合的技术体系,涉及View的层次结构、事件分发机制和View的工作原理等技术细节。

    a、继承View重写onDraw方法;

    b、继承ViewGroup派生特殊的Layout;

    c、继承特定的View(比如TextView);

    d、继承特定的ViewGroup(比如LinearL);(b更接近View的底层)

  • 相关阅读:
    深入浅出Nginx
    图解MySQL索引BTree(B+Tree)
    postman升级后,collection集合中的接口找不到了
    PHP抖音SDK搭建问题整理
    vi10
    vi8
    vi9
    vi4
    shell 自动输入密码
    LINUX平台可以用GDB进行反汇编和调试。
  • 原文地址:https://www.cnblogs.com/fankongkong/p/7468843.html
Copyright © 2011-2022 走看看