ViewGroup执行onDraw()
方法的条件与机制
一、默认行为:ViewGroup不触发onDraw()
-
透明容器特性
ViewGroup作为容器控件,默认不绘制自身内容(透明且无背景),因此系统会跳过onDraw()
方法以优化性能14。此时绘制流程仅通过dispatchDraw()
渲染子View6。 -
硬件加速影响
在硬件加速模式下,ViewGroup的绘制流程可能被进一步简化,若未设置背景或前景,GPU渲染管线会直接忽略onDraw()
14。
二、触发onDraw()
的条件
若需强制ViewGroup执行onDraw()
,需满足以下任一条件:
-
设置背景/前景属性
- 通过XML或代码设置
android:background
、android:foreground
等属性,系统会认为存在绘制内容,触发onDraw()
- 通过XML或代码设置
-
主动调用
setWillNotDraw(false)
在自定义ViewGroup的构造函数中调用此方法,明确告知系统需要执行onDraw()
,即使无背景或内容17。public CustomViewGroup(Context context) { super(context); setWillNotDraw(false); // 强制启用onDraw() }