首页 > 解决方案 > ViewGroup中绘制背景drawable的方式

问题描述

默认情况下,ViewGroup 不会调用 onDraw()。

所以我有一个问题:当我们为 ViewGroup 设置背景可绘制时会发生什么

标签: androidandroid-drawable

解决方案


onDraw() 继承自 View 类,因为 ViewGroup 是 View 的子类。因此,当您在 ViewGroup 上设置背景时,它的工作方式与任何其他视图相同。当您在视图上调用 setBackground 时,它会将requestLayout标志设置为 true 并使视图无效。

此外, View 类的官方文档指出:

如果您为 View 设置了背景可绘制对象,则 View 将在回调其 onDraw() 方法之前绘制它。

你可以在 Android 的 View 类的源代码中看到它是如何工作的

    public void setBackgroundDrawable(Drawable d) {
        ...
        {
            requestLayout = true;
        }
        ...
        computeOpaqueFlags();
        if (requestLayout) {
            requestLayout();
        }
        mBackgroundSizeChanged = true;
        invalidate(true);
    }

如果您查看invalidate()的文档,您会发现

public void invalidate() 使整个视图无效。如果视图可见,onDraw(android.graphics.Canvas) 将在未来的某个时间点被调用。

setBackgroundColor()setBackgroundResource( ) 在内部使用 setBackgroundDrawable() ,因此它们的工作方式相同。

总而言之,当您执行setBackground()时,会在将来的某个时间调用 onDraw 。


推荐阅读