2013-07-11 15 views
8

Sto affrontando un bizzarro problema di sfarfallio utilizzando VideoView. Quando l'attività inizia, provoca un minimo sfarfallio di frazione per un secondo. Quindi, il video inizia. Mostra 2 linee nere nella parte superiore e inferiore del video. Guarda lo scatto qui sotto.Problema di sfarfallio di VideoView

check snap shot

Ho testato la mia applicazione su 2 dispositivi

1) Samsung n-8000 (Tablet)

2) Lenovo un-800

video.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:background="#ffffff" 
android:gravity="center"> 

<VideoView 
    android:id="@+id/vvSplash" 
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content" 
    android:background="#00ffffff"> 
</VideoView> 

</LinearLayout> 

Codice attività:

private VideoView vd; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    getWindow().requestFeature(Window.FEATURE_NO_TITLE); 
    setContentView(R.layout.video); 
    vd = (VideoView) findViewById(R.id.vvSplash); 
    playVideo(); 
} 

private void playVideo() { 
    Uri uri = Uri.parse("android.resource://" + getPackageName() +"/"+ R.raw.intro); 
    vd.setVideoURI(uri); 
    vd.setMediaController(null); 
    vd.start();  
} 

Qualsiasi aiuto sarebbe apprezzato. Grazie.

+0

@Piotr Chojnacki grazie per la domanda modificata .. :) – TheFlash

+0

Sei il benvenuto! –

+0

Anch'io sto affrontando lo stesso problema del tuo. Come hai risolto quel problema? – VickyS

risposta

8

ridicolo come sembra, ma la risposta è qui:

ripeto la soluzione , grazie a coloro che l'hanno scoperto:

<SurfaceView 
    android:layout_width="0px" 
    android:layout_height="0px" 
    android:visibility="gone" /> 

E 'MOLTO IMPORTANTE che si aggiunge alla superficie vista alla vista radice nella vostra attività, non il padre immediato. Altrimenti non funzionerà.

+0

U r right..going per accettare .. :) – TheFlash

+2

Questo non risolve il problema su Android 5.1. – user2966445

+0

Questo non funziona più. –

2

ho anche affrontato lo stesso problema, ma l'ho risolto cambiando il parametro di layout di videoview dal contenuto di avvolgimento per abbinare il genitore. Inoltre è necessario rimuovere la proprietà di sfondo della vista video da XML. Spero che funzionerà per voi

+0

grazie per la risposta. Proverò ad accettare se funziona .. :) – TheFlash

+0

ho provato quello che hai detto ma non funziona. comunque grazie e +1 da parte mia. – TheFlash

+0

Stavo riproducendo un video, e alla fine stavo mettendo una miniatura sul video, ma stavo ottenendo questi tremolii neri, quando il video è iniziato e terminato, dopo aver letto questo post, ho provato a impostare lo sfondo del video sul video miniatura e POOF, non ci sono più problemi. Grazie, +1. – Korebian

0

Basta rimuovere la seguente riga dal tuo xml.

android:background="#00ffffff" 

Essa vi aiuterà :)

+0

ho risolto il mio problema. Comunque grazie per la tua risposta. – TheFlash

1

Per le persone nel futuro: Questo brutto bug sembra essere stato risolto in Marshmallow. Nel mio lavoro, stiamo sviluppando con Xamarin (quindi, in pratica, tutte le viste vengono aggiunte in modo programmatico). Abbiamo un sacco di dispositivi di test, e lavoravo principalmente con un dispositivo Marshmallow, quindi non ho mai notato questo sfarfallio nero quando ho creato la pagina su cui stavo lavorando. Dopo aver finalmente testato con un dispositivo Lollipop, ho notato questo sfarfallio.

Purtroppo non ho una soluzione. Abbiamo bisogno che la nostra applicazione sia il più multipiattaforma possibile, quindi usare un layout xml è scoraggiato/triste.

+1

Si può invece fare in codice Java. Vedi la mia risposta, http://stackoverflow.com/a/37966446/38557. – noamtm

0

Per tutti coloro che hanno ancora problemi e non riescono a utilizzare la risposta di cui sopra. Semplicemente copia questo codice e lo incolla nel layout principale dell'attività che stai usando lo videoview sotto il layout principale (primo).

<SurfaceView 
    android:layout_width="0px" 
    android:layout_height="0px" 
    android:visibility="gone" /> 

nel mio caso

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/Mainframlayout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@color/facebookbgcolor" > 
<SurfaceView 
    android:layout_width="0px" 
    android:layout_height="0px" 
    android:visibility="gone" /> 
.....rest of the layout 
0

Adattato la soluzione xml-based da https://stackoverflow.com/a/27307286/38557 di utilizzare codice Java, invece. Mettere questo nel di Fragment onCreateView(), prima di gonfiare il layout:

// Add a SurfaceView to prevent flickering when the video is loaded later. 
SurfaceView surfaceView = new SurfaceView(getActivity()); 
surfaceView.setVisibility(View.GONE); 
container.addView(surfaceView, new ViewGroup.LayoutParams(0, 0)); 

Si fa la stessa cosa, e può essere utilizzato quando non si può o non si vuole cambiare le XMLs.

1

Se il vostro problema è VideoViewsfarfallio quando si preme il pulsante Indietro, basta impostare il VideoView visibilità INVISIBLE o GONE nel metodo della vostra attività onBackPressed() prima di chiamare il super implementazione.

Se l'utente può anche lasciare attraverso il "up" pulsante, intercettare android.R.home voce di opzione per nascondere la VideoView.

Ecco un esempio in Kotlin:

override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) { 
    android.R.id.home -> super.onOptionsItemSelected(item).also { 
     video_view.visibility = GONE // Hide videoView before leaving to avoid flickering 
    } 
    R.id.action_share -> consume { shareVideo() } // Your regular menu options 
    else -> super.onOptionsItemSelected(item) 
} 

override fun onBackPressed() { 
    video_view.visibility = GONE // Hide videoView before leaving to avoid flickering 
    super.onBackPressed() 
}