当View通过addView方法动态添加时,onDraw调用了两次

时间:2014-03-27 15:07:44

标签: android android-layout android-view android-ui

我想通过layout.addView(view)方法动态地向布局添加新视图。新视图不应该是可见的,但是我希望它的显示列表被创建,因此当我决定显示它时(通过动画,例如淡入),它不需要重绘(调用onDraw方法)。 / p>

我运行此代码:

customView = new CustomView(this.getContext());
customView .setAlpha(0.0f);
this.addView(customView ); // 'this' is RelativeLayout instance in this case

为customView调用onDraw方法,一切都很好。但是,当我更改布局中的任何内容(按下按钮,滚动,任何使布局无效的内容)时,我的customView的onDraw方法将被第二次调用。之后,如果我不使我的customView无效(正确行为),则不再调用它。

我不知道Android为什么会这样。我希望它创建customView,调用onDraw,为它创建一个显示列表,并且在我使视图无效之前不再调用onDraw。总而言之,onDraw应该被调用一次。

它与customView的初始不可见性无关,如果alpha设置为0.5f,行为是相同的。

我的问题是,如何只在Android上调用onDraw一次?

如果Android真的必须两次调用onDraw,那么我应该怎么做才能强制执行它来在一些代码之后执行此操作。在调用此视图之后。(查看);没有设置任何计时器因为那将是非常丑陋。

1 个答案:

答案 0 :(得分:2)

您描述的行为是正常的,并且是视图对象的android框架的一部分 -

<强>图纸

  

通过遍历树并渲染每个视图来处理绘图   与无效区域相交。因为树是按顺序遍历的,   这意味着父母将在他们的之前(即后面)抽签   孩子们,兄弟姐妹按照他们出现在树上的顺序画出来。如果   您为View设置了一个可绘制的背景,然后View将绘制它   在回调它的onDraw()方法之前为你服务。请注意   框架不会绘制不在无效区域中的视图。至   强制绘制视图,调用invalidate()

(摘自官方google android API文档)。

意味着您的自定义视图包含在包含button \ scrollbar等的同一视图中。如果您不希望每次为视图所在的子树调用onDraw方法时渲染它,您可以设置视图的布尔值标记为false - use setWillNotDraw()执行此操作。
(您应将其放在活动的onCreate上,以便将视图设置为此标志为false(这也是默认值)并使用invalidate()您想要渲染视图。)您可以阅读official google docs以获取更多信息。