19

Ho un video che viene riprodotto in modalità verticale. Alla fine del video, ho bisogno di mostrare alcune viste su di esso. Questo funziona bene finora.Android: le visualizzazioni sovrapposte all'ultimo fotogramma di un video a schermo intero non si ridisegnano correttamente quando si accende e si spegne lo schermo

Tuttavia, ho un problema in cui le visualizzazioni che si trovano nell'ultimo fotogramma di un video non si ridisegnano correttamente quando si ritorna all'attività dopo aver spento lo schermo, quindi riacceso, quindi sbloccato lo schermo.

Quello che sto osservando è che quando lo schermo si riaccende e io sblocco. I miei video e le mie immagini vengono prima renderizzati al di fuori della modalità a schermo intero (con la barra di stato ancora visualizzata), quindi lo schermo andrà in modalità a schermo intero spostando tutte le viste e causando artefazione.

Sembra che le viste vengano spostate dai limiti di visualizzazione dopo il passaggio a schermo intero dopo il rendering.

Sono davvero perplesso su come impedire che ciò accada.

Here is the sandbox project on github per evitare di rendere questo un post completo di codice.

La configurazione di base per il progetto è questo:

attività frammento ha una visualizzazione video e una vista tasto sul suo layout. Quindi aggiunge un frammento in un contenitore contentView. ContentView si dissolve in 1 secondo prima della fine della riproduzione del video.

Tutto funziona correttamente e il problema è con il ritorno all'app dopo aver acceso e spento lo schermo.

Inoltre, a volte il video si interrompe completamente, lasciando le visualizzazioni su uno sfondo nero.

Grazie in anticipo per qualsiasi aiuto è possibile fornire.

proper rendering of views over video

Ecco l'artifacting che accade quando si accende lo schermo spento, indietro, e sbloccare. Nota che dovevo farne una foto. Su DDMS lo strumento screenshot vede le immagini correttamente.

artifacted image

risposta

3

piuttosto che impedire lo spegnimento dello schermo, è possibile scegliere di ricevere un evento quando l'utente sblocca il blocco tastiera dopo aver riattivato il telefono.

A questo punto, potrebbe essere una buona idea chiamare View.invalidate su entrambe le viste, questo dovrebbe causare un ridisegno. La catena di disegno è molto instabile mentre la schermata di blocco è attiva, perché la tua app è tecnicamente visibile, proprio sotto la schermata di blocco.

registerReceiver(new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context ctx, Intent intent) { 
      if(intent.getAction().equals(Intent.ACTION_USER_PRESENT)) 

     } 
    }, new IntentFilter(Intent.ACTION_USER_PRESENT)); 
+0

Grazie per il suggerimento Colin. Darò una prova. –

+0

np! spero che funzioni :) –

+0

Grazie Colin. Ciò ha sicuramente aiutato, non ho ancora capito come risolverlo, ma il tuo suggerimento illustra il problema. Il problema è che onResume viene chiamato mentre stai visualizzando la schermata di blocco. Sulla schermata di blocco è visibile la barra di stato che causa un disegno errato. Ricevere l'intenzione persente dell'utente aiuterà a correggere il problema. L'unico problema ora è che la chiamata invalida sulle viste sembrava non avere alcun effetto. Ma quella dovrebbe essere la parte facile. Grazie ancora! –

0

Sembra che la disposizione di sovrapposizione è stata spostata dalla barra di controllo.
Non pensi che sia stato influenzato dall'area del controller (riproduzione/pausa/ff/riavvolgi + progresso)?

+0

ciao JonA. Non sono sicuro cosa intendi. Non ho alcun controller impostato per questa istanza di mediaplayer.Ma c'è qualcos'altro che dovrei fare per assicurarmi che la barra del controller non interferisca? –

0

potrebbe esserci un modo per evitare che lo schermo si spenga al 1 ° posto in quanto sarebbe meglio risolvere i problemi di re-draw, sperare che questo aiuti.