我想弄清楚我的自定義視圖的優化。我想知道,如果對View.setVisibility(View.VISIBLE)的調用強制Android框架更新視圖可見性(< - 強制視圖重繪),即使視圖已經可見。View.setVisibility(View.VISIBLE)是否強制視圖重繪,即使它已經可見?
3
A
回答
4
在setVisibility()
看看:
public void setVisibility(int visibility) {
setFlags(visibility, VISIBILITY_MASK);
if (mBGDrawable != null) mBGDrawable.setVisible(visibility == VISIBLE, false);
}
它只是簡單地調用setFlags()
,如果一切都沒有改變其立即返回:
....
int changed = mViewFlags^old;
if (changed == 0) {
return;
}
即使它(不知)有過去有,然後它檢查單個標誌是否改變,並且只在它們中的一個與之不同時更新。
1
setVisibility()通過調用setFlags來設置視圖標誌。如果我們進入sdk View.setFlags(),我們可以看到如果標誌狀態沒有改變,這個方法就沒有什麼可做。從SDK View.setFlags碼()方法:int changed = mViewFlags^old; if (changed == 0) { return; }
1
我不是100%,但我不這麼認爲
從View類grepcode,這是從setFlags(int flags, int mask)
方法是從setVisibility(int visibility)
稱爲
int changed = mViewFlags^old;
if (changed == 0) {
return;
}
在此之後在同一方法是requestLayout()
電話和invalidate()
所以由去我會說沒有也
3
public void setVisibility(int visibility) {
setFlags(visibility, VISIBILITY_MASK);
if (mBackground != null) mBackground.setVisible(visibility == VISIBLE, false);
}
setFlags(...)
方法開始:
int old = mViewFlags;
mViewFlags = (mViewFlags & ~mask) | (flags & mask);
int changed = mViewFlags^old;
if (changed == 0) {
return;
}
所以我敢肯定,此方法不執行任何操作。否則,它會做很多事情,除了觸發佈局和重繪。
public boolean setVisible(boolean visible, boolean restart) {
boolean changed = mVisible != visible;
if (changed) {
mVisible = visible;
invalidateSelf();
}
return changed;
}
的if
會是假的所以這不會做任何事情。 ImageView
,MediaRouteButton
,ProgressBar
,SurfaceView
和ViewStub
:
然而,View#setVisible()
被覆蓋。您需要檢查每個實現是否還有其他額外的功能 - 您可能正在使用其中一個子類。
同樣適用於Drawable
:有8類,覆蓋Drawable#setVisible(boolean, boolean)
:
- ClipDrawable
- DrawableContainer
- AnimationDrawable - 從DrawableContainer
- InsetDrawable
- LayerDrawable
- RotateDrawble 延伸
- ScaleDrawable
- SlideDrawable
根據您的組合,你會發現,你實際上是做一些額外的,所以你需要調查你使用什麼樣的View
及其背景繪製什麼樣的是可以繪製的。
相關問題
- 1. 淨重/節點Webkit - 圖像解碼即使它已經可見
- 2. 的RelativeLayout刷新後view.setVisibility(View.GONE)和view.setVisibility(View.VISIBLE)
- 3. 強制重繪視圖
- 4. 如何強制android視圖重繪它的背景可繪製? /可能是動畫阻止它正常工作
- 5. View.setVisibility(View.VISIBLE)與自定義適配器
- 6. Quartz for iPhone是否繪製視圖的不可見部分?
- 7. 我可以重繪視圖而不強制重繪底層視圖嗎?
- 8. 獲取當前的Android視圖並強制重繪它
- 9. 如何強制重繪在NSOutlineView一組行,它已經擴展後/摺疊
- 10. 是否可以使用SAS繪製實時可視化圖?
- 11. Android列表視圖項目未在setVisibility(View.VISIBLE)之後繪製
- 12. 如何強制頁面發生錯誤,即使它已經在tlb中?
- 13. 強制頁面重新加載,如果它已經改變了
- 14. 當視圖已經可見時更改uitabbar圖標
- 15. 使用後退鍵時,是否可以強制活動重新繪製?
- 16. 如何強制Aero繪製無邊框窗口,即使它不是?
- 17. 即使它已經過時,仍然可以使用System.Data.OracleClient嗎?
- 18. 圖表繪製:需要檢查anyChart繪圖是否已完成
- 19. 視頻通過javascript隱藏,但已經開始播放(autplay-mode),即使它不可見?
- 20. 即使進入viewDidLoad之後,視圖控制器的視圖也不可見
- 21. SL 4 - 強制重繪視覺樹
- 22. C#測試是否已經繪製了我要繪製的東西
- 23. 強制重繪層
- 24. 強制UIWebView重繪?
- 25. Android - 如何強制一個畫廊重新繪製其視圖?
- 26. 是否可以在圖像上繪製/繪製並在Android中擦除它?
- 27. 如何強制ListView手動重新使用它的.Items.Filter視圖?
- 28. 如何檢查另一個視圖控制器是否可見?
- 29. 即使使用URL重寫,IIS強制也會刪除它
- 30. EF4試圖重新創建數據庫,即使它已經在那裏?
請問您可以發佈鏈接到源代碼(如果可以在互聯網上)嗎?例如 –
[link](http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.2.2_r1/android/view/View.java#View。 setFlags%28int%2Cint%29) – rdbmsa