美文网首页工作生活
Android View 框架(4)-- draw

Android View 框架(4)-- draw

作者: 黑色偏幽默 | 来源:发表于2019-07-03 14:33 被阅读0次

本篇你将了解到:

  1. draw 的具体流程
  2. 简单的去重写 onDraw 方法

draw 方法

draw过程的主要流程如下:

  1. 绘制 background
  2. 如果需要的话,保存 canvaslayer,来准备fading
  3. 绘制 viewcontent(调用 onDraw 方法)
  4. 绘制 childrendispatchDraw 方法)
  5. 如果需要的话,绘制 fading edges,然后还原 layer
  6. 绘制装饰器、比如 scrollBar

下方是伪代码,

public void draw(Canvas canvas) {
    final boolean dirtyOpaque = (privateFlags & PFLAG_DIRTY_MASK) == PFLAG_DIRTY_OPAQUE &&
                    (mAttachInfo == null || !mAttachInfo.mIgnoreDirtyState);
    // Step 3, draw the content 调用onDraw方法
     if (!dirtyOpaque) onDraw(canvas);

    // Step 4, draw the children
     dispatchDraw(canvas);

    // Step 6, draw decorations (foreground, scrollbars)
     onDrawForeground(canvas);
}

其中标志位 dirtyOpaquetrue 时,是不回去调用 onDraw 方法的。而 dirtyOpaque 其实是由 privateFlags 决定的。如果我们修改了 privateFlags 的值,就可以使重写 onDraw 被调用。

  • 方法1:设置背景
    设置背景的方法里会调用 computeOpaqueFlags 重新设置 privateFlags
public void setBackgroundDrawable(Drawable background) {
        computeOpaqueFlags();
        ....省略一大段代码
        computeOpaqueFlags();
        ....省略一点点代码
        invalidate(true);
        invalidateOutline();
    }
  • 方法2:调用 setWillNotDraw 方法
    同样也是修改 privateFlags 达到目的。
public void setWillNotDraw(boolean willNotDraw) {
        setFlags(willNotDraw ? WILL_NOT_DRAW : 0, DRAW_MASK);
    }

重写 onDraw

目标效果就是在上一章的 Layout 中,添加一个圆形图案。


image.png

关键代码:

   var paint = Paint().let {
        it.color = Color.YELLOW
        it
    }
    /**
     * 不设置 background 的话,不会调用该方法
     */
    override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)
        val x = measuredWidth / 2.0F
        val y = measuredHeight / 2.0F
        canvas?.drawCircle(x, y, Math.min(x, y), paint)
    }

全部代码 -- AViewGroup:Github 地址,是 kotlin 写的

总结

Android View 框架(1)-- LayoutInflater
Android View 框架(2)-- measure
Android View 框架(3)-- layout
Android View 框架(4)-- draw

相关文章

网友评论

    本文标题:Android View 框架(4)-- draw

    本文链接:https://www.haomeiwen.com/subject/eobqhctx.html