2013-04-08 16 views
18

Ich bin ein wenig mit diesem stecken - in erster Linie war der folgende Link nützlich, aber ich habe ein bisschen ein Problem mit der Sichtbarkeit:Ermitteln Sie, ob eine Ansicht auf dem Bildschirm ist - Android

der Link: Check view visibility

ich habe eine Scroll-Ansicht (Eltern) und eine Reihe von Unteransichten (LinearLayout ->TableLayout) etc. Es gibt eine Reihe von Punkten I bis View.GONE im XML gesetzt (android:visibility="gone").

Ich habe einige einfachen Code, um zu bestimmen, ob es sichtbar ist oder nicht jedoch mit getVisibility(), wenn ich den Artikel View.VISIBLE setzen und versuchen erhalten sofort getDrawingRect() ich eine Rect mit Nullen auf der ganzen Linie. Jeder weitere Klick erhält die richtigen Koordinaten.

Nun könnte dies sein, weil die Ansicht nie gezeichnet wurde (wie in der XML definiert), so dass es keine Koordinaten zurückgibt, aber ich setze View.VISIBLE vor dem Versuch, Bildschirm Sichtbarkeit zu bestimmen. Könnte es sein, dass ich eine Art Rückruf von sagen der onDraw() brauche? Oder legen Sie die Sichtbarkeit von versteckten Objekten im Code fest. Ein bisschen ärgerlich, (

Einige Code:

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

Bereich Layouts wie folgt:

  • ScrollView
    • LinearLayout
      • TableLayout
        • Button
        • HiddenView

Natürlich ist es sehr wahrscheinlich, ich darüber ganz die falsche Art und Weise werde - im Grunde Ich möchte nur sicherstellen, dass Der Scrollview positioniert sich so, dass die sichtbar gewordene Ansicht vollständig sichtbar ist.

Wenn weitere Informationen erforderlich sind, lassen Sie es mich wissen!

Antwort

15

Ok, also danke an OceanLife, dass sie mich in die richtige Richtung weisen! Es war in der Tat ein Rückruf erforderlich und ViewTreeObserver.OnGlobalLayoutListener() hat den Trick gemacht. Ich habe den Zuhörer gegen meine Splitterklasse implementiert und sie dort abgeholt, wo ich sie gebraucht habe. Danke für die Warnung auch in Bezug auf die mehreren Anrufe, löste ich dies mit der removeOnGlobalLayoutListener() Methode - funktioniert ein Charme.

Code:

... 

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

Wir waren gerade einige jetzt Reinigung zu tun ...

+1

Kühl. Fühlen Sie sich frei, den Pfeil/+1 zu kreuzen, wenn es half. Prost. – OceanLife

+0

Yeah versucht, das zu tun, aber mein Rufpunkte erlauben mir nicht :( –

10

Also, wenn ich dieses Recht lese, ist das Problem, das Sie haben, dass Sie die Dimensionen einer Ansicht in Ihrem Layout herausfinden möchten, um herauszufinden, ob Sie eine Kreuzung mit dem übergeordneten ScrollView haben.

Was ich denke, Sie sehen (wie Sie angedeutet) ist die Anweisung der Ansicht versendungs ​​zu ziehen, und dann in einer Art von Rennen-Zustand, der Renderer die Messungen für das Layout der Lösung und die tatsächliche machen wo Ansichtsobjekte reale Größen erhalten. Eine Möglichkeit, um herauszufinden, welche Art von Dimensionen eine Ansicht auf dem Bildschirm hat, ist die Verwendung des Layout-Baum-Listeners. Wir verwenden diesen Beobachter, um die Dimensionen eines Bildschirms aufzulösen, wenn wir die Google Charts-API nutzen, für die eine Pixelbreite und -höhe definiert werden muss ... was natürlich bei Android das größte Problem für Entwickler ist.So beobachte (Wortspiel beabsichtigt);

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

Wort der Warnung onGlobalLayout wird mehrmals erhalten genannt wie der Renderer auf der Endlösung in geschlossen wird. Der letzte Anruf ist der, den wir nehmen.

Damit verfügen Sie über einen Mechanismus zum Ausführen von Aktionen für eine gezeichnete Ansicht, z. B. zum Abrufen der Breite und Höhe einer Ansichtskomponente. Hoffe, dass dir das hilft.

Nebenbei: Die cleveren Jungs von Square haben eine FEST Hamcrest-Bibliothek entworfen, mit der Sie neben Robotium einen Test dafür schreiben können. Check it out.

+0

habe gerade bemerkt, dass Methode '' '' deprecated''''. Hmm. Hoffentlich ist es Ersatz Anweisungen klar sind. – OceanLife

+0

Ja, das ist der Grund, warum ich die Dimensionen finden möchte, ist zu überprüfen, ob die Ansicht auf dem Bildschirm relativ zur Position der ScrollView sichtbar ist - wenn nicht, möchte ich die Scrollansicht entlang schieben. Ich werde ViewTreeObserver bald sehen, wenn ich aus der Arbeit komme! Danke: P –

Verwandte Themen