如何防止 Android 视图绘制其背景

Mat*_*ape 2 android view

在 Android 中,我有一个扩展 View 的类。在某些情况下,我希望它不绘制自己。我意识到我可以将 Visibility() 设置为 View.INVISIBLE 或 View.GONE,但如果可能的话,我宁愿避免这种情况。如果此自定义视图可见或不可见,则代码的其他部分的行为会有所不同,如果不需要,我不想重写这些部分。

最初我认为它会像覆盖 onDraw() 一样简单,类似于以下内容...

@Override
protected void onDraw(Canvas canvas) {
   if(...){ //check some member variables
      return;
   } else {
      //draw code
   }
}
Run Code Online (Sandbox Code Playgroud)

这适用于大多数视图,但我发现无论我的条件检查结果如何,背景仍然会显示。在阅读了一些文档后,我发现了这个......

“绘制是通过遍历树并渲染与无效区域相交的每个视图来处理的。因为树是按顺序遍历的,这意味着父母将在他们的孩子之前(即在后面)绘制,兄弟姐妹按照他们出现的顺序绘制在树中。如果您为 View 设置了可绘制的背景,那么 View 会在回调其 onDraw() 方法之前为您绘制它。”

我想出的解决方案有点像黑客......

@Override
protected void onDraw(Canvas canvas) {
   if(...){ //check some member variables
      //set background to transparent
      return;
   } else {
      //restore default background
      //draw code
   }
}
Run Code Online (Sandbox Code Playgroud)

所以我想我的问题变成了这样:有没有办法覆盖视图的默认背景绘制行为,这样我就不必更改视图的可见性或背景?

kco*_*ock 5

背景是在draw()方法中绘制的,而不是onDraw()方法中。你可以覆盖它,但它不仅仅是绘制背景,所以这不是一个真正的选择。

根据上面的评论,您最好的选择是以编程方式更改背景。

编辑:所以是的,您可以draw()在调用 to 之前覆盖和覆盖背景super.draw()