View的Draw过程解析

1、问题

View经过了Measure和Layout这个两个过程后,View的大小已确定,以及View的位置也确定,接下来就是要把View显示出来,这里我将继续分析View的Draw过程。

2、分析

Draw过程的入口点从ViewRootImpl.performTraversals( )方法开始,在perforMeasure()和perforLayout( )后,接下来来就是执行perforDraw( )方法

private void draw(boolean fullRedrawNeeded) {
    Surface surface = mSurface;
     。。。省略
    if (!dirty.isEmpty() || mIsAnimating || accessibilityFocusDirty) {
        // 更加是否开启硬件加速来进行不同的处理,是否开启硬件加速,View的绘制流畅都是一样的,区别就是Canvas不一样
        if (mAttachInfo.mHardwareRenderer != null && mAttachInfo.mHardwareRenderer.isEnabled()) {
            。。。省略
            // 开启了硬件加速,则走该分支
            mAttachInfo.mHardwareRenderer.draw(mView, mAttachInfo, this);
        } else {

            。。。省略
            // 未开启硬件加速,就走这个分支
            if (!drawSoftware(surface, mAttachInfo, xOffset, yOffset, scalingRequired, dirty)) {
                return;
            }
        }
    }
}

我们只分析未开启硬件加速的绘制流程

private boolean drawSoftware(Surface surface, AttachInfo attachInfo, int xoff, int yoff,
        boolean scalingRequired, Rect dirty) {
    final Canvas canvas;

    。。。省略
    // 从surface得到画布
    canvas = mSurface.lockCanvas(dirty);

    try {
         。。。省略
         // 调用DecorView.draw(),把DecorView的内容以及DecorView子View的内容都绘制在这个画布上
         mView.draw(canvas);

    } finally {
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值