2014-03-27 55 views
2

我想通過layout.addView(view)方法動態添加一個新視圖到佈局。新的視圖不應該是可見的,但我希望它的顯示列表被創建,因此當我決定顯示它時(通過動畫,例如淡入),它不必重繪(調用onDraw方法)本身。當通過addView方法動態添加視圖時,onDraw會調用兩次

我運行此代碼:

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

的onDraw方法被調用爲customView,一切都很好。但是,當我更改佈局中的任何內容(按下按鈕,滾動,導致佈局無效的任何內容)時,我的customView的onDraw方法將被第二次調用。之後,如果我不使自定義視圖失效(正確的行爲),則不會再調用它。

我不知道爲什麼Android的行爲如此。我希望它創建customView,調用onDraw,爲它創建一個顯示列表,並且不會再調用onDraw,直到我使視圖無效。總之,onDraw應該被調用一次。

而且它與customView的初始隱形無關,如果alpha設置爲0.5f,行爲是相同的。

我的問題是,如何使Android調用onDraw一次?

如果Android真的需要兩次調用onDraw,那麼我應該怎麼做才能在this.addView(view)之後的代碼中執行它?沒有設置任何計時器,因爲這將是完全醜陋的。

回答

2

您所描述的行爲是好的,是Android框架對視圖對象的部分 -

**Drawing** 

Drawing is handled by walking the tree and rendering each view that intersects 
the invalid region. Because the tree is traversed in-order, this means that 
parents will draw before (i.e., behind) their children, with siblings drawn 
in the order they appear in the tree. If you set a background drawable 
for a View, then the View will draw it for you before calling back to its 
onDraw() method. 
Note that the framework will not draw views that are not in the invalid region. 
To force a view to draw, call invalidate() 
(Taken from the official google android API docs). 

這意味着您的自定義視圖是由包含該按鈕\滾動條同樣的觀點包含
等等,如果你不用它來渲染evrytime,你的視圖所在的
子樹就會調用onDraw方法,你可以將視圖的布爾標誌設置爲false - use setWillNotDraw()來做到這一點。
(你應該把它放在活動的onCreate上,以便使視圖設置這個標誌爲false(這也是默認設置),並且當你想渲染視圖時使用invalidate()。
您可以閱讀official google docs瞭解更多信息。

+0

對不起,但我認爲你的解決方案沒有意義(顯然這是行不通的)。你明白我的問題嗎?帶有this.addView的代碼被調用一次,只有onDraw被調用兩次。 – r00dY

+0

然後我完全誤解了你的問題..你可以試着讓它更清楚嗎? – crazyPixel

+0

告訴我哪一部分你不明白,我會盡力解釋它更好:) – r00dY

相關問題