2013-09-30 44 views

回答

4

No, it doesn't.

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; }

+0

請問您可以發佈鏈接到源代碼(如果可以在互聯網上)嗎?例如 –

+0

[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

1

我不是100%,但我不這麼認爲

從View類grepcode,這是從setFlags(int flags, int mask)方法是從setVisibility(int visibility)稱爲

int changed = mViewFlags^old; 
if (changed == 0) { 
    return; 
} 

在此之後在同一方法是requestLayout()電話和invalidate()

所以由去我會說沒有也

3

展望View#setVisibility

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; 
} 

所以我敢肯定,此方法不執行任何操作。否則,它會做很多事情,除了觸發佈局和重繪。

Background#setVisible是相似的:

public boolean setVisible(boolean visible, boolean restart) { 
    boolean changed = mVisible != visible; 
    if (changed) { 
     mVisible = visible; 
     invalidateSelf(); 
    } 
    return changed; 
} 

if會是假的所以這不會做任何事情。 ImageViewMediaRouteButtonProgressBarSurfaceViewViewStub

然而,View#setVisible()被覆蓋。您需要檢查每個實現是否還有其他額外的功能 - 您可能正在使用其中一個子類。

同樣適用於Drawable:有8類,覆蓋Drawable#setVisible(boolean, boolean)

  1. ClipDrawable
  2. DrawableContainer
  3. AnimationDrawable - 從DrawableContainer
  4. InsetDrawable
  5. LayerDrawable
  6. RotateDrawble
  7. 延伸
  8. ScaleDrawable
  9. SlideDrawable

根據您的組合,你會發現,你實際上是做一些額外的,所以你需要調查你使用什麼樣的View及其背景繪製什麼樣的是可以繪製的。

相關問題