android - ViewGroup中绘制背景drawable的方式
问题描述
默认情况下,ViewGroup 不会调用 onDraw()。
所以我有一个问题:当我们为 ViewGroup 设置背景可绘制时会发生什么
解决方案
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 。
推荐阅读
- amazon-web-services - 使用 S3 和 CloudFront 防止图像盗链
- ionic-framework - CORS | Access-Control-Allow-Headers 不允许请求标头字段授权 IOS 13 预检响应
- node.js - GCP KMS createKey 函数从不解析
- java - 单元测试 AWS 秘密管理器 java
- python - 按日期过滤时,并非所有日期都被捕获。蟒蛇熊猫
- javascript - 使用 EJS 的节点 if/else 语句
- python - 如何在 Django 中添加 media_root 和 media_url
- unix - 获取每一行的最高绝对值(awk)
- javascript - 如何从 .txt 读取文本并将其保存为变量中的字符串?
- java - Heroku Java 应用程序在 90 秒后超时