Android VideoView borrar la visualización después de stopPlayback ()
Estoy utilizando un componente de VideoView para reproducir videos. Parece que no puedo borrar la pantalla de VideoView después de invocar manualmente stopPlayback (). Me gustaría restablecer el VideoView para que el fondo original sea visible.
- Reproduce un video en un componente VideoView.
- Seleccione un video nuevo para reproducirlo.
- El VideoView está atascado en el último fotograma del primer video hasta que comience el siguiente video. Si hay un error con el siguiente video, la imagen estática del primer video permanece atascada allí.
- Si dejo que el video se reproduzca hasta el estado de finalización, la pantalla se borra.
El código que estoy usando:
- Android Appcompat v21 - utilizar el estilo antiguo del hilandero
- ¿Es posible usar un ListView sin ListActivity en Mono Android?
- ¿Es imposible agregar varias vistas a un ScrollView?
- ¿Cómo definir el fondo del botón en un lugar y se utiliza alrededor de toda la aplicación?
- Cómo forzar redibujar de listview?
private VideoView videoViewer = null; public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ... if (videoViewer != null) { videoViewer.setOnPreparedListener(new OnPreparedListener()); } ... } public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if (videoViewer != null) { videoViewer.stopPlayback(); videoViewer.setVideoURI(Uri.parse("http://my_vido_url/playlist.m3u8")); } } private class OnPreparedListener implements MediaPlayer.OnPreparedListener { @Override public void onPrepared(MediaPlayer mp) { videoViewer.start(); } }
Tenga en cuenta que basándose en el origen VideoView.java, stopPlayback () realiza la siguiente acción en el MediaPlayer subyacente:
public void stopPlayback() { if (mMediaPlayer != null) { mMediaPlayer.stop(); mMediaPlayer.release(); mMediaPlayer = null; } }
- Listview normal y coloque el estilo de fondo en android
- ¿Qué significa android: layout_weight?
- Diferencia entre el tipo de entrada de texto sin formato y el tipo de entrada Person Name en Editext en android
- Desactivar todas las interacciones de pantalla táctil durante la animación
- Cómo disparar onListItemClick en Listactivity con los botones en la lista?
- Android cómo enfocar ActionBar searchView
- Ayuda de la interfaz de usuario para la notificación en el icono
- AutoStart La aplicación no funciona correctamente
Para mí, lo que funcionó fue simplemente ocultar luego mostrar el VideoView
usando setVisibility
.
public void clearCurrentFrame() { videoView.setVisibility(GONE); videoView.setVisibility(VISIBLE); }
Esto era porque quería que el VideoView
volviera transparente, no un color sólido. El ajuste del fondo a transparente no funciona – el marco de vídeo sigue apareciendo.
La solución en la que me establecí, a menos que alguien pueda ofrecer una mejor, es usar setBackgroundResource
, que parece extrañamente nombrado, ya que parece cambiar el recurso de primer plano.
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ... videoViewer.setBackgroundResource(R.drawable.viewer_background); ... } public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if (videoViewer != null) { videoViewer.stopPlayback(); // Set the background back to the drawable resource to clear the current video when switching to a new one. videoViewer.setBackgroundResource(R.drawable.viewer_background); videoViewer.setVideoURI(Uri.parse("http://my_vido_url/playlist.m3u8")); } } private class OnPreparedListener implements MediaPlayer.OnPreparedListener { @Override public void onPrepared(MediaPlayer mp) { videoViewer.start(); // Clear the background resource when the video is prepared to play. videoViewer.setBackgroundResource(0); } }
El drawable que estoy referenciando es una layer-list
simple de la layer-list
con un fondo azul de encargo y una imagen centrada de la insignia.
Drawable \ viewer_background.xml:
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item> <shape android:shape="rectangle"> <solid android:color="@color/custom_blue" /> </shape> </item> <item> <bitmap android:src="@drawable/img_logo" android:gravity="center" /> </item> </layer-list>
Alternativamente también pude usar setZOrderOnTop
para controlar dónde se coloca la vista de la superficie (también se podría definir otra vista encima del VideoViewer y cambiar la visibilidad de esa manera):
videoViewer.setZOrderOnTop(false); videoViewer.setZOrderOnTop(true);
Alternativamente también podría usar setBackgoundColor
para lograr lo mismo que setBackgroundResource
:
videoViewer.setBackgroundColor(getResources().getColor(R.color.custom_blue)); videoViewer.setBackgroundColor(Color.TRANSPARENT);
Bueno, para mí ninguna de las soluciones de este hilo funcionó, así que probé algo más y por debajo es la solución que funcionó para mí,
new Handler().postDelayed(new Runnable() { @Override public void run() { mVideoViewPlayList.setVisibility(View.GONE); mVideoViewPlayList.setVisibility(View.VISIBLE); mVideoViewPlayList.setVideoURI(Uri.parse(path)); } }, 500);
Sólo este código:
videoView.setVideoURI(null);