Android笔记--View绘制流程源码分析二

通过上一篇View绘制流程源码分析一可以知晓整个绘制流程之前,在activity启动过程中:

Window的建立(activit.attach生成),DecorView的建立(phonewindow.setContentView生成),

两者利用ViewRootImpl(WindowManagerGlobal.addView生成)建立window和decorview的联系。

并在root.setView(view, wparams, panelParentView)中把viewrootimpl(其本身也是一个viewparent)

作为参数传给decorview.从而让decorview一脉的所有view受viewRootImpl管理绘制。

在知道了上述Window DecorView WindowManager ViewRootImpl的来龙去脉以后就可以继续分析View

绘制的流程。

那么到底是谁触发了绘制呢?从源码中可以找到如下静态内部类:

 static class W extends IWindow.Stub {

这个类就是负责处理来自系统进程的调用处理工作。在WMS中会触发相应的方法。而W中真正执行处理的

是ViewRootImpl。可以看一个其中的例子:

static class W extends IWindow.Stub {

。。。省略

    @Override
public void dispatchAppVisibility(boolean visible) {
final ViewRootImpl viewAncestor = mViewAncestor.get();
if (viewAncestor != null) {
viewAncestor.dispatchAppVisibility(visible);
}
}
。。。省略
}

W是在ViewRootImpl的构造函数中初始化的:

public ViewRootImpl(Context context, Display display) {
。。。省略
mWindow = new W(this);
}

所以这里的ViewRootImpl就是W中的ViewRootImpl对象。

从而系统进程远程触发绘制的流程:

viewAncestor.dispatchAppVisibility(visible);

这个就是ViewRootImpl的方法。最终会调用如下方法:

ViewRootImpl.java

public void dispatchAppVisibility(boolean visible) {
Message msg = mHandler.obtainMessage(MSG_DISPATCH_APP_VISIBILITY);
msg.arg1 = visible ? 1 : 0;
mHandler.sendMessage(msg);
}
//通过handler进行消息传递 void handleAppVisibility(boolean visible) {
if (mAppVisible != visible) {
mAppVisible = visible;
scheduleTraversals();
。。。省略
}
}

scheduleTraversals方法就是开始进行view绘制的入口方法

 void scheduleTraversals() {
if (!mTraversalScheduled) {
mTraversalScheduled = true;
mTraversalBarrier = mHandler.getLooper().getQueue().postSyncBarrier();
mChoreographer.postCallback(
Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null);
//这里的mTraversalRunnable就是一个runnable接口。其run方法内部是view绘制的全过程 。。。省略
}
} void doTraversal() {
if (mTraversalScheduled) {
。。。省略 performTraversals(); 。。。。省略
}
}

执行到此为止performTraversals方法就是众所周知的真 | View绘制流程!

Android笔记--View绘制流程源码分析(二)的更多相关文章

  1. Android笔记--View绘制流程源码分析(一)

    Android笔记--View绘制流程源码分析 View绘制之前框架流程分析 View绘制的分析始终是离不开Activity及其内部的Window的.在Activity的源码启动流程中,一并包含 着A ...

  2. Android之View绘制流程源码分析

    版权声明:本文出自汪磊的博客,转载请务必注明出处. 对于稍有自定义View经验的安卓开发者来说,onMeasure,onLayout,onDraw这三个方法都不会陌生,起码多少都有所接触吧. 在安卓中 ...

  3. Android开发——View绘制过程源码解析(二)

    0. 前言   View的绘制流程从ViewRoot的performTraversals开始,经过measure,layout,draw三个流程,之后就可以在屏幕上看到View了.上一篇已经介绍了Vi ...

  4. Android开发——View绘制过程源码解析(一)

    )UNSPECIFIED:表示View可以设置成任意的大小,没有任何限制.这种情况比较少见. 2. MeasureSpec的生成过程 2.1 顶级View的MeasureSpec // desired ...

  5. Android Touch事件派发流程源码分析

    分native侧事件派发到java侧和Framework派发事件到UI,流程看源码即可,此处不赘叙, Native侧派发事件的干活类图如下:

  6. scrapy 源码解析 (二):启动流程源码分析(二) CrawlerProcess主进程

    CrawlerProcess主进程 它控制了twisted的reactor,也就是整个事件循环.它负责配置reactor并启动事件循环,最后在所有爬取结束后停止reactor.另外还控制了一些信号操作 ...

  7. [Android]从Launcher开始启动App流程源码分析

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5017056.html 从Launcher开始启动App流程源码 ...

  8. [Android]Android系统启动流程源码分析

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5013863.html Android系统启动流程源码分析 首先 ...

  9. Spring加载流程源码分析03【refresh】

      前面两篇文章分析了super(this)和setConfigLocations(configLocations)的源代码,本文来分析下refresh的源码, Spring加载流程源码分析01[su ...

随机推荐

  1. js 常用验证

    邮箱验证: $(function () {            $("#txt_Email").blur(function () {                var ema ...

  2. 利用css制作横向和纵向时间轴

    Html代码: <div class="container"> <p>原文地址:http://www.cnblogs.com/xiaofeixiang/&l ...

  3. 牛客多校2 D-money(dp记录/贪心)

    D-money 链接:https://www.nowcoder.com/acm/contest/140/D来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K, ...

  4. DSOFramer控件使用注意事项

    1.引用dll==>AxInterop.DSOFramer.dll ==>Interop.DSOFramer.dll ==>WindowsFormsIntegration ==> ...

  5. 伪类选择器 :nth-child(even) :nth-child(odd) :nth-of-type

    属性 描述 CSS :active 向被激活的元素添加样式. 1 :focus 向拥有键盘输入焦点的元素添加样式. 2 :hover 当鼠标悬浮在元素上方时,向元素添加样式. 1 :link 向未被访 ...

  6. Keras输出每一层网络大小

    示例代码: model = Model(inputs=self.inpt, outputs=self.net) model.compile(loss='categorical_crossentropy ...

  7. RVO算法

    http://blog.sina.com.cn/s/blog_6ad33d350102xqal.html 简介 在介绍VO,RVO之前,需要先介绍路径规划. 对Agent进行路径规划,实际上要完成的任 ...

  8. Hyperledger Fabric 第一次安装

    第一次安装fabric有很多坑.记录一下,主要跟版本问题. 参考的是http://www.cnblogs.com/aberic/p/7532114.html 这篇博客. 我用的阿里云centOs 7. ...

  9. 洛谷P2875 [USACO07FEB]牛的词汇The Cow Lexicon

    P2875 [USACO07FEB]牛的词汇The Cow Lexicon 题目描述 Few know that the cows have their own dictionary with W ( ...

  10. 封装MySQL的单例,连接数据库并对数据进行增删改查操作

    单例: 一个类只能有一个对象 应用场景:多次请求数据库只需要一个连接对象. 实现:三私一公 1.私有的静态属性用来保存对象的单例2.私有的构造方法用来阻止在类的外部实例化3.私有的__clone阻止在 ...