Qual è il modo migliore per verificare se la vista è visibile sulla window?

Qual è il modo migliore per verificare se la vista è visibile sulla window?

Ho un CustomView che fa parte del mio SDK e chiunque può aggiungere CustomView ai loro layout. Il mio CustomView sta intraprendendo alcune azioni quando è visibile all'utente periodicamente. Quindi, se la vista diventa invisibile all'utente, allora è necessario arrestare il timer e quando diventa visibile nuovamente dovrebbe riavviare il suo corso.

  • Come posso submit un semplice text al file php utilizzando il metodo openConnection ()
  • come controllare programmaticamente la disponibilità della connessione internet utilizzando jquery
  • Sfondo firebase spingere notifiche a Cordova
  • Chiamare l'API REST da un'applicazione android
  • Richieste HTTP parallele con Retrofit
  • Nessun suono di notifica quando invia una notifica da firebase in android
  • Ma purtroppo non esiste un certo modo di verificare se il mio CustomView diventa visibile o invisibile all'utente. Ci sono poche cose che posso controllare e ascoltare:

    onVisibilityChange //it is for view's visibility change, and is introduced in new API 8 version so has backward compatibility issue onWindowVisibilityChange //but my CustomView can be part of a ViewFlipper's Views so it can pose issues onDetachedFromWindows //this not as useful onWindowFocusChanged //Again my CustomView can be part of ViewFlipper's views. 

    Quindi, se qualcuno ha affrontato questo tipo di problemi, si prega di gettare qualche luce.

  • Differenza tra START_STICKY e START_REDELIVER_INTENT?
  • Come get il colore da un GradientDrawable?
  • fingerpaint all'interno di un horizontalscrollview
  • : app: dexDebug ExecException finito con valore di output non zero 0
  • Errore di rimozione di visualizzazione di Android durante l'animation
  • Sono tutte le autorizzazioni necessarie da PhoneGap su Android?
  • 8 Solutions collect form web for “Qual è il modo migliore per verificare se la vista è visibile sulla window?”

    onDraw() viene chiamato each volta che la vista deve essere disegnata. Quando la vista è distriggersta, allora non viene mai chiamato onDraw (). Quando un piccolo bit della vista diventa visibile all'utente, viene chiamato onDraw (). Questo non è ideale, ma non riesco a vedere un'altra chiamata da utilizzare perché voglio fare la stessa cosa. Ricorda di call il super.onDraw o la vista non verrà disegnata. Fare attenzione a modificare qualsiasi cosa in onDraw che fa sì che la vista sia invalidata poiché causerà un'altra chiamata su onDraw.

    Se si utilizza una listview allora getView può essere utilizzato each volta che la visualizzazione di elenco viene mostrata all'utente.

    ovviamente l'attività onPause() viene chiamata tutte le tue viste sono coperte e non sono visibili all'utente. forse chiamando invalidate () sul genitore e se ondraw () non viene chiamato allora non è visibile.

    Nel mio caso il seguente codice funziona meglio per ascoltare se la vista è visibile o less:

     @Override protected void onWindowVisibilityChanged(int visibility) { super.onWindowVisibilityChanged(visibility); Log.e(TAG, "is view visible?: " + (visibility == View.VISIBLE)); } 

    Questo è un metodo che ho usato un bel po 'nelle mie applicazioni e ho avuto un buon lavoro per me:

     static private int screenW = 0, screenH = 0; @SuppressWarnings("deprecation") static public boolean onScreen(View view) { int coordinates[] = { -1, -1 }; view.getLocationOnScreen(coordinates); // Check if view is outside left or top if (coordinates[0] + view.getWidth() < 0) return false; if (coordinates[1] + view.getHeight() < 0) return false; // Lazy get screen size. Only the first time. if (screenW == 0 || screenH == 0) { if (MyApplication.getSharedContext() == null) return false; Display display = ((WindowManager)MyApplication.getSharedContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); try { Point screenSize = new Point(); display.getSize(screenSize); // Only available on API 13+ screenW = screenSize.x; screenH = screenSize.y; } catch (NoSuchMethodError e) { // The backup methods will only be used if the device is running pre-13, so it's fine that they were deprecated in API 13, thus the suppress warnings annotation at the start of the method. screenW = display.getWidth(); screenH = display.getHeight(); } } // Check if view is outside right and bottom if (coordinates[0] > screenW) return false; if (coordinates[1] > screenH) return false; // Else, view is (at least partially) in the screen bounds return true; } 

    Per usarla, basta passare in qualsiasi vista o sottoclass di visualizzazione (IE, quasi tutto ciò che disegna sullo schermo in Android). Restituirà true se è sullo schermo o false se non è … piuttosto intuitivo, credo.

    Se non utilizzi il metodo sopra come statico, probabilmente puoi avere un context in qualche modo, ma per get il context di applicazione da un metodo statico, devi fare queste due cose:

    1 – Aggiungere il seguente attributo al tag di application nel tuo manifesto:

     android:name="com.package.MyApplication" 

    2 – Aggiungi in una class che estende l'applicazione, così:

     public class MyApplication extends Application { // MyApplication exists solely to provide a context accessible from static methods. private static Context context; @Override public void onCreate() { super.onCreate(); MyApplication.context = getApplicationContext(); } public static Context getSharedContext() { return MyApplication.context; } } 

    Oltre alla vista.getVisibility () esiste la view.isShown ().
    isShown controlla l'tree di visualizzazione per determinare se anche tutti gli antenati sono visibili.

    Anche se, questo non gestisce le vedute ostruite, solo le vedute nascoste o scomparse in se stessi o in uno dei suoi genitori.

    Questo può essere verificato utilizzando il metodo getGlobalVisibleRect . Se il rettangolo restituito da questo metodo ha esattamente la stessa dimensione di View , la View corrente è completamente visibile sullo schermo.

     /** * Returns whether this View is completely visible on the screen * * @param view view to check * @return True if this view is completely visible on the screen, or false otherwise. */ public static boolean onScreen(@NonNull View view) { Rect visibleRect = new Rect(); view.getGlobalVisibleRect(visibleRect); return visibleRect.height() == view.getHeight() && visibleRect.width() == view.getWidth(); } 

    Se hai bisogno di calcolare la percentuale di visibilità puoi farlo usando il calcolo quadrato:

     float visiblePercentage = (visibleRect.height() * visibleRect.width()) / (float)(view.getHeight() * view.getWidth()) 

    Nel trattare con un problema simile, where wherevo sapere se la vista ha un'altra window sopra di esso, ho usato questo nella mia visualizzazione personalizzata:

     @Override public void onWindowFocusChanged(boolean hasWindowFocus) { super.onWindowFocusChanged(hasWindowFocus); if (!hasWindowFocus) { } else { } } 

    nella tua visualizzazione personalizzata, impostare gli ascoltatori:

      getViewTreeObserver().addOnScrollChangedListener(this); getViewTreeObserver().addOnGlobalLayoutListener(this); 

    Sto usando questo codice per animare una vista una volta quando è visibile all'utente.

    Occorre prendere in considerazione 2 casi.

    1. La tua vista non è sullo schermo. Ma sarà visibile se l'utente lo scorre

       public void onScrollChanged() { final int i[] = new int[2]; this.getLocationOnScreen(i); if (i[1] <= mScreenHeight - 50) { this.post(new Runnable() { @Override public void run() { Log.d("ITEM", "animate"); //animate once showValues(); } }); getViewTreeObserver().removeOnScrollChangedListener(this); getViewTreeObserver().removeOnGlobalLayoutListener(this); } } 
    2. La tua vista è inizialmente nella schermata (non in un altro luogo invisibile all'utente in scorrimento, è inizialmente sullo schermo e visibile all'utente)

       public void onGlobalLayout() { final int i[] = new int[2]; this.getLocationOnScreen(i); if (i[1] <= mScreenHeight) { this.post(new Runnable() { @Override public void run() { Log.d("ITEM", "animate"); //animate once showValues(); } }); getViewTreeObserver().removeOnGlobalLayoutListener(this); getViewTreeObserver().removeOnScrollChangedListener(this); } } 

    è ansible aggiungere il costatore CustomView a un onScrollChangedListener da ViewTreeObserver

    quindi se la vista è scorsa di schermo è ansible call view.getLocalVisibleRect () e determinare se la tua vista è parzialmente offscreen …

    puoi dare un'occhiata al codice della mia libreria: PercentVisibleLayout

    Spero che sia d'aiuto!

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.