Coordinate sbagliate Da getLocationOnScreen/getLocationInWindow

Una chiamata a getLocationOnScreen() o getLocationInWindow() entrambi mi danno un top/Y di coordinate che è di circa ~30px (stato/notifiche della barra di altezza) troppo in basso. Il left/X di coordinate è morto.

Come ho accennato sopra, credo che la differenza è a causa dello stato/barra di notifica… potrei sbagliarmi. Penso di poter risolvere questo se posso determinare la dimensione della barra di notifica, ma sto avendo problemi a fare proprio questo.

Qualsiasi aiuto sarebbe molto apprezzato.

InformationsquelleAutor nimph | 2010-04-14

 

4 Replies
  1. 81

    Ho finito per risolvere in parte questo problema di determinare l’altezza di stato la barra di notifica in questo modo:

    View globalView = ...; //the main view of my activity/application
    
    DisplayMetrics dm = new DisplayMetrics();
    this.getWindowManager().getDefaultDisplay().getMetrics(dm);
    int topOffset = dm.heightPixels - globalView.getMeasuredHeight();
    
    View tempView = ...; //the view you'd like to locate
    int[] loc = new int[2]; 
    tempView.getLocationOnScreen(loc);
    
    final int y = loc[1] - topOffset;
    • Questo ha funzionato in configurazione normale, ma se l’attività regola ‘globalView’ altezza quando SoftInput/Tastiera è aperta, quindi altezza della tastiera viene contato per ‘offsetcima’, questo si traduce in un valore errato per ‘y’.
    • int [] locInWindow = new int [2]; globalView.getLocationInWindow(locInWindow); topOffset = locInWindow[1]; //Calcolo topOffset da ottenere la coordinata Y del globalView
    • Mi ha salvato un sacco di tempo, grazie!
    • buona soluzione. grazie!
  2. 7

    Ecco come mi piace avere la barra di stato in altezza, e regolare l’offset:

    final int[] location = new int[2];
    anchor.getLocationInWindow(location); //Includes offset from status bar, *dumb*
    Rect anchorRect = new Rect(location[0], location[1],
            location[0] + anchor.getWidth(), location[1] + anchor.getHeight());
    
    anchor.getRootView().findViewById(android.R.id.content).getLocationInWindow(location);
    int windowTopOffset = location[1];
    anchorRect.offset(0, -windowTopOffset);
    • Perché è muto che la posizione nella finestra comprende offset dalla barra di stato? Si sta chiedendo per la posizione di nella finestra, in modo che altro ti aspettavi?
    • Si potrebbe presumere che la finestra è al di sotto della barra di stato, quindi l’offset non includono la barra di stato di altezza.
    • Sei confusa Finestra con Schermo penso.
    • windowTopOffset comprende anche l’azione della barra di altezza, non solo la status bar.
  3. 5

    Io sto avendo lo stesso problema, provare a utilizzare

    offset = myView.GetOffsetY();

    e regolare la vostra Y coord da tale valore, ad esempio

    coordY -= offset;

    Classe, che offre il `metodo:

    class MyView extends View {
    
      public int GetOffsetY() {
        int mOffset[] = new int[2];
        getLocationOnScreen( mOffset );
        return mOffset[1]; 
      }
    
    }
    • Non vedo “getOffsetY()”. Che classe è che un metodo?
    • Mi dispiace, non sono riuscito a postare il metodo, in classe MyView si estende Visualizzare { public int GetOffsetY() { int mOffset[] = new int[2]; getLocationOnScreen( mOffset ); return mOffset[1]; }
  4. 4

    Questa risposta non comprende come ottenere la barra di stato in altezza, ma non spiega il comportamento di getLocationOnScreen() e getLocationInWindow() restituisce lo stesso valore.

    In caso di normale attività (e non una finestra) si dovrebbe aspettare questi due metodi per restituire lo stesso valore. Una Finestra si delinea sotto (come in z-order non coordinate y) la barra di stato, in modo che questi metodi non possono essere utilizzati per determinare l’altezza della barra di stato.

    https://stackoverflow.com/a/20154562/777165

    • nella finestra di Dialogo vista, funziona bene se non si imposta la finestra a schermo intero è vero, ma se impostato come segue: <item name=”android:windowFullscreen”>vero</item> quindi il valore non è corretto, quindi hanno bisogno di sottrarre il ‘offsetcima’

Lascia un commento