2013-04-08 98 views
18

我有點卡住了這一點 - 首先,以下鏈接已經很有用,但是我已經想出了一點與可見性有關的問題:確定一個視圖是否在屏幕上 - Android

鏈接:Check view visibility

我有一個滾動視圖(父)和若干子次(LinearLayout - >TableLayout)等有許多的我XML(android:visibility="gone")內設置爲View.GONE項目。

我有一些簡單的代碼,以確定它是否是可見或不使用getVisibility()但是當我設置的項目View.VISIBLE並立即嘗試getDrawingRect()我得到一個矩形與全線零。任何進一步的點擊獲得正確的座標。

現在,這可能是因爲視圖從未繪製過(如XML中定義的),導致它不返回座標,但是我在嘗試確定屏幕可見性之前設置了View.VISIBLE。難道我需要從onDraw()中獲得某種回調嗎?或者在代碼中設置隱藏項的視圖可見性。有點惱人;(

某些代碼:

Rect scrollBounds = new Rect(); 
scroll.getHitRect(scrollBounds); 

Rect viewBounds = new Rect(); 

if (view.getVisibility() == View.GONE) { 
    view.setVisibility(View.VISBLE) 


    viewBounds.getDrawingRect(viewBounds); 
    if (!Rect.intersects(scrollBounds, viewBounds) { 
     // do somthing 
    } 
} 

佈局面積如下:

  • ScrollView
    • LinearLayout
      • TableLayout
        • Button
        • HiddenView

。當然,這是極有可能,我一共要對這個錯誤的方式 - 基本上我只是想確保滾動視圖自己定位,因此可以看到已經變得可見的視圖。

如果需要其他信息,請告訴我!

回答

15

好的,非常感謝OceanLife指出我正確的方向!確實有一個回調需要和ViewTreeObserver.OnGlobalLayoutListener()伎倆。我最終實現了對我的片段類的偵聽器,並在需要的地方將其拾取。感謝多個電話的警告,我使用removeOnGlobalLayoutListener()方法解決了這個問題,這是一種魅力。

代碼:

... 

// vto initialised in my onCreateView() method 

vto = getView().getViewTreeObserver(); 
vto.addOnGlobalLayoutListener(this); 

... 

@Override 
    public void onGlobalLayout() { 

     final int i[] = new int[2]; 
     final Rect scrollBounds = new Rect(); 

     sView.getHitRect(scrollBounds); 
     tempView.getLocationOnScreen(i); 

     if (i[1] >= scrollBounds.bottom) { 
      sView.post(new Runnable() { 
       @Override 
       public void run() { 
        sView.smoothScrollTo(0, sView.getScrollY() + (i[1] - scrollBounds.bottom)); 
       } 
      }); 
     } 

     vto.removeOnGlobalLayoutListener(this); 
    } 

只需要做一些現在清理...

+1

很酷。如果有幫助,請隨意選擇箭頭/ +1。乾杯。 – OceanLife 2013-04-08 23:23:25

+0

是試圖做到這一點,但我的聲望點不會允許我:( – 2013-04-09 07:35:46

10

因此,如果我正在閱讀這個權利,您遇到的問題是您想要了解佈局中某些視圖的尺寸,以確定您是否與父項ScrollView有交集。

我認爲你所看到的(就像你指出的那樣)是繪製被分派視圖的指令,然後在某種競爭條件下,渲染器解析實際呈現的佈局的度量視圖對象獲得真實大小。找出視圖在屏幕上顯示的維度的一種方法是使用佈局樹 - 監聽器。我們使用這個觀察者來解決一個屏幕的尺寸時,利用Google Charts API,這需要定義一個像素寬度和高度......這當然是Android上可能是開發人員面臨的最大問題。所以觀察(雙關語意);作爲渲染器關閉的最終解決方案

final ViewTreeObserver vto = chart.getViewTreeObserver(); 
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 

    /** 
    * @see android.view.ViewTreeObserver.OnGlobalLayoutListener#onGlobalLayout() 
    */ 
    @SuppressWarnings("deprecation") 
    @Override 
    public void onGlobalLayout() { 
    if (view.getVisibility() == View.GONE) { 
     view.setVisibility(View.VISBLE) 
     viewBounds.getDrawingRect(viewBounds); 
     if (!Rect.intersects(scrollBounds, viewBounds) { 
     // do something 
     } 
    } 
    } 
}); 

警告onGlobalLayout的字將被調用多次。最後一次電話是我們所採取的。

這將爲您提供一種機制,用於在繪製視圖上執行操作,例如獲取視圖組件的寬度和高度。希望能幫助你。

另外:在Square的聰明的章節設計了一個FEST hamcrest庫,它可以讓你爲Robotium編寫一個測試。 Check it out

+0

只注意到方法是''''deprecated''''。嗯。希望它的替換說明很明確。 – OceanLife 2013-04-08 09:59:53

+0

是的你的正確,我想找到尺寸的原因是檢查視圖是否在屏幕上相對於ScrollView的位置可見 - 如果不是我想要推動滾動視圖一起。當我離開工作時,我將盡快查看ViewTreeObserver!感謝:P – 2013-04-08 10:07:31

相關問題