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. Eclipse常用配置(1)

    1.代码自动提示 在我们忘记方法名或者想偷懒时,代码自动提示很管用.不过Eclipse默认是输入"."后才会出现包或类成员的提示,也就意味着我们必须先输入一个完整的类名,提示才能出 ...

  2. jQuery 防止相同的事件快速重复触发

    重复触发就是防止用户重复点击提交数据了,我们一般都是点击之后没反应会再次点击了,这个不但要从用户体验上来做好,还在要js或php程序脚本上做好,让用户知道点击是己提交服务器正在处理,下面我就整理从脚本 ...

  3. npm如何删除node_modules文件夹

    npm install rimraf -g 先安装删除工具,然后使用删除命令 rimraf node_modules

  4. C# 32位程序在64位系统下注册表操作

    在64位的Windows操作系统中,为了兼容32位程序的运行,64位的Windows操作系统采用重定向机制.目的是为了能让32位程序在64位的操作系统不仅能操作关键文件文夹和关键的注册表并且又要避免与 ...

  5. CF-816A

    A. Karen and Morning time limit per test 2 seconds memory limit per test 512 megabytes input standar ...

  6. B - Simple Game

    B - Simple Game Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Su ...

  7. Obama unveils his&nbsp…

    LAS VEGAS - Declaring that America's immigration system is broken, President Obama on Tuesday called ...

  8. jQuery命名空间和自定义插件的的多种方法

    jQuery插件的开发包括两种: 一种是类级别的插件开发,即给jquery添加新的全局函数,相当于给jQuery类本身添加方法.jQuery的全局函数就是属于jQuery命名空间的函数,另一种是对象级 ...

  9. NativeScript官方书籍:NativeScript in Action-用你现有技术构建移动应用程序

    大家好,我用nativescript做企业级移动应用开发一年多了.从最初只能看nativescript英文文档,到现在看到官方发布正式的书籍,感觉nativescript变得越来越好. 当然,在这个过 ...

  10. SCUT - 15 - 为美好的世界献上爆炎 - dfs

    https://scut.online/p/15 样例错了,按题目说的去做就AC了. 反向搜索使得最终比较strncmp的时候复杂度下降了很多(虽然应该可行性剪枝也少了) #include<bi ...