博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
绘制流程
阅读量:6039 次
发布时间:2019-06-20

本文共 1726 字,大约阅读时间需要 5 分钟。

通过测量确定了View成员变量mMeasuredWidth和mMeasuredHeight的值,通过布局确定了View相对于父View左上右下的值。当所有的View的大小和位置全部确定之后,我们就可以进行绘制了。

三大工作流程始于ViewRootImpl#performTraversals,在这个方法内部会分别调用performMeasure,performLayout,performDraw三个方法来分别完成测量,布局,绘制流程。那么我们现在先从performDraw方法看起,ViewRootImpl#performDraw

private void performDraw() {    try {        draw(fullRedrawNeeded);    } finally {        mIsDrawing = false;        Trace.traceEnd(Trace.TRACE_TAG_VIEW);    }}复制代码

上边方法调用ViewRootImpl中的drow方法,注意这里调用的是自己类中的draw方法。并传递了fullRedrawNeeded参数,而该参数由mFullRedrawNeeded成员变量获取,它的作用是判断是否需要重新绘制全部视图,如果是第一次绘制视图,那么显然应该绘制所以的视图,如果由于某些原因,导致了视图重绘,那么就没有必要绘制所有视图。继续看draw方法

private void draw(boolean fullRedrawNeeded) {    //获取mDirty,该值表示需要重绘的区域    final Rect dirty = mDirty;    if (mSurfaceHolder != null) {        // The app owns the surface, we won't draw.        dirty.setEmpty();        if (animating) {            if (mScroller != null) {                mScroller.abortAnimation();            }            disposeResizeBuffer();        }        return;    }    //第一次绘制流程,设置需要绘制所有视图    if (fullRedrawNeeded) {        mAttachInfo.mIgnoreDirtyState = true;        dirty.set(0, 0, (int) (mWidth * appScale + 0.5f), (int) (mHeight * appScale + 0.5f));    }    //然后把绘制区域和相关参数传递过去    if (!drawSoftware(surface, mAttachInfo, xOffset, yOffset, scalingRequired, dirty)) {        return;    }}复制代码

我们继续看drawSofeware方法

private boolean drawSoftware(Surface surface, AttachInfo attachInfo, int xoff, int yoff,                             boolean scalingRequired, Rect dirty) {    //锁定canvas区域,由dirty区域决定    canvas = mSurface.lockCanvas(dirty);    //正式开始绘制,这里的mView是DecorView    mView.draw(canvas);}复制代码

mView就是DecorView,也就是说从DecorView开始绘制,前面所做的一切工作都是准备工作,而现在则是正式开始绘制流程。和之前的逻辑差不多,这里,回来用到在做分析

转载地址:http://mnlhx.baihongyu.com/

你可能感兴趣的文章
shell初涉
查看>>
[浪子学编程][MS Enterprise Library]ObjectBuilder之创建策略祥解(二)
查看>>
ASP.NET 中设置路径的三种方式
查看>>
EBS使用 Distributed AD在多个节点并行adpatch
查看>>
windows添加和删除服务
查看>>
关于云栖,有点无语的几个地方,管理能不能管?
查看>>
Windows线程的同步与互斥
查看>>
C#进阶系列——MEF实现设计上的“松耦合”(四):构造函数注入
查看>>
AngularJs ng-change事件/指令(转)
查看>>
linux系统下安装两个或多个tomcat
查看>>
ProtoBuffer 简单例子
查看>>
iOS多线程开发系列之(一)NSThread
查看>>
微信小程序初体验(上)- 腾讯ISUX社交用户体验设计成员出品
查看>>
SAP WM Physical Inventory Method ST & PZ
查看>>
一次快速的数据迁移感悟
查看>>
MySQL修改提示符
查看>>
《ELK Stack权威指南(第2版)》一3.6 Java日志
查看>>
C++流的streambuf详解及TCP流的实现
查看>>
《量化金融R语言初级教程》一2.5 协方差矩阵中的噪声
查看>>
mysql到elasticsearch数据迁移踩坑实践-Ali0th
查看>>