2013-04-08 31 views
18

私は少しこのことに固執しています。まずは以下のリンクを参考にしてみましょう。しかし、私は可視性について少し問題を思いつきました:ビューが画面上に表示されているかどうかを判断する - Android

リンク: - 私はXML(android:visibility="gone")内View.GONEに設定項目がいくつかあります(>TableLayoutLinearLayout)などCheck view visibility

私は、スクロールビュー(親)とサブビューの数を持っています。

は、私はそれが目に見えるか、私は View.VISIBLEに項目を設定ししかし getVisibility()を使用していないかどうかを判断し、すぐ getDrawingRect()私は軒並みゼロでのRectを取得しようとするいくつかの簡単なコードを持っています。それ以上クリックすると、正しい座標が得られます。

これは、(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もちろん210
        • 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

+0

それをやろうとしましたが、私の評判のポイントは私を許しませんでした:( –

10

私がこの権利を読んでいる場合は、レイアウト内の一部のビューの寸法を調べて、親との交差点があるかどうかを調べたいという問題があります。ScrollView私は(あなたが示唆したように)あなたが見ていると思う何

は、レース条件のいくつかの並べ替えでは、ビューを描画するための命令ディスパッチされている、とされ、レイアウトのための測定を解決レンダラは実際のレンダリングビューオブジェクトは実際のサイズになります。ビューが画面上にどのような種類のディメンションを表示するかの1つの方法は、レイアウトツリーリスナーを使用することです。このオブザーバーを使用して、Google Charts APIを活用する際の画面のサイズを解決します。ピクセルの幅と高さを定義する必要があります... Androidの場合はおそらく開発者が直面している最大の問題です。だから観察する(馬鹿を意図する)。レンダラは、最終溶液に終了としてonGlobalLayoutを警告する

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

Wordが複数回呼び出されます。最後の呼び出しは私たちが取るものです。

これは、ビューコンポーネントの幅と高さを取得するような、描画されたビューでアクションを実行するためのメカニズムを提供します。それがあなたを助けることを願っています。

その他:スクエアの巧妙なチャップスでは、Robotiumと一緒にこのテストを書くことができるFEST hamcrestライブラリが設計されています。 Check it out

+0

ちょうどメソッドが '' '' deprecated''''であることに気づきました。うーん。うまくいけば、それは交換の指示は明らかです。 – OceanLife

+0

あなたの正確な理由は、私が次元を探したいのは、ScrollViewの位置を基準にして画面上にビューが表示されているかどうかをチェックすることです - スクロールビューを微調整したい場合。私は仕事がなくなり次第ViewTreeObserverをチェックアウトします!ありがとう:P –

関連する問題