2010-09-24 51 views
140

我設置visibility爲不可見像這樣在Android:如何檢查視圖在Android中是否可見?

myImageView.setVisibility(View.INVISIBLE); 

然後使其可見:

myImageView.setVisibility(View.VISIBLE); 

現在我不知道是否myImageView可見或不可見的,我怎麼能檢查它是這樣的:

if (myImageView IS VISIBLE) { 
    Do something 
} else { 
    Do something else 
} 

我該怎麼做?我必須在括號內寫什麼?

回答

375

儘管View.getVisibility()確實獲得了可見性,但它不是一個簡單的true/false。視圖可以將其可見性設置爲三件事之一。

View.VISIBLE 該視圖是可見的。

View.INVISIBLE 視圖是不可見的,但它通常會佔用的任何間距仍將被使用。它的「隱形」

View.GONE 視圖不見了,你看不到它,它不佔用「點」。

因此,要回答你的問題,你正在尋找:

if (myImageView.getVisibility() == View.VISIBLE) { 
    // Its visible 
} else { 
    // Either gone or invisible 
} 
+3

可以看到,而它不在可見屏幕的範圍內,所以在所有情況下都不準確。然而,[Bill Mote's](http://stackoverflow.com/a/12428208/62921)答案一直在工作。 – ForceMagic 2014-03-06 21:26:59

+1

ForceMagic是正確的,我發佈我的答案的原因。視圖可以設置爲View.VISIBLE,並且您的if-logic將返回true,但是,該視圖實際上可能不會被用戶看到。當且僅當用戶可以在屏幕的視圖端口上實際看到View的任何部分時,我的解決方案將返回true。 – 2014-09-29 12:34:07

+0

@BillMote我的解決方案是解決原始問題。如何獲取可見性屬性的值。 – William 2014-10-08 19:43:46

3

你會使用相應的方法getVisibility()。以'get'和'set'爲前綴的方法名稱是用於表示屬性的Java慣例。一些語言有屬性的實際語言結構,但Java不是其中之一。所以當你看到標有'setX'的東西時,你可以99%確定有一個對應的'getX'來告訴你這個值。

98

或者你可以簡單地使用

View.isShown() 
+2

這樣做更準確,因爲它可以檢查視圖是否位於顯示列表上,因爲視圖可以是「可見的」但沒有父視圖。 – user123321 2013-04-12 23:54:30

+2

當它不在可見屏幕的範圍內時可以爲真,因此在任何情況下都不準確。然而,[Bill Mote's](http://stackoverflow.com/a/12428208/62921)答案一直在工作。 – ForceMagic 2014-03-06 21:26:33

+0

View#isShown()遍歷所有父視圖的可見性,以驗證它是否顯示在屏幕上。這個過程有時可能是昂貴的。 – 2017-08-30 00:02:08

47

如果圖像是佈局,可能是「View.VISIBLE的一部分「但這並不意味着它在可見屏幕的範圍內。如果這就是你的追求;這將工作:

Rect scrollBounds = new Rect(); 
scrollView.getHitRect(scrollBounds); 
if (imageView.getLocalVisibleRect(scrollBounds)) { 
    // imageView is within the visible window 
} else { 
    // imageView is not within the visible window 
} 
+0

你介意解釋爲什麼這可行嗎?我查看了View.getLocalVisibleRect的源代碼,我不確定它是如何工作的。 – yarian 2012-09-18 20:32:31

+0

這裏有兩件事。 1)View.getHitRect(scrollBounds)在父級座標中獲取命中的矩形,並將它們填充到scrollBounds中; 2)使用scrollBounds對ImageView的View.getLocalVisibleRect(scrollBounds)進行種子處理。如果ImageView屬於scrollBounds的邊界,則該方法返回true。 – 2012-09-18 21:57:16

+1

注意:以下格式化註釋時遇到問題。道歉。 對,我不好指定。確切的問題是'imageView.getLocalVisibleRect(scrollBounds)'調用。 From grepcode: 'public final boolean getLocalVisibleRect(Rect r){ Point offset = new Point();如果(getGlobalVisibleRect(r,offset)){r0.offset(-offset.x,-offset.y); //使當地 返回true; } return false; }' – yarian 2012-09-19 21:20:16

相關問題