para - widget reloj digital android
Pantalla clara de Android VideoView después de stopPlayback() (4)
Estoy usando un componente VideoView para reproducir videos. Parece que no puedo borrar la pantalla de VideoView después de que invoco manualmente stopPlayback (). Me gustaría reiniciar VideoView para que el fondo original sea visible.
- Reproducir un video en un componente VideoView.
- Seleccione un nuevo video para reproducir.
- El VideoView se atasca en el último cuadro del primer video hasta que comienza el siguiente video. Si hay un error con el siguiente video, la imagen estática del primer video permanece pegada allí.
- Si dejo que el video se complete, la pantalla se borra.
El código que estoy usando:
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, según el origen de VideoView.java, stopPlayback () realiza la siguiente acción en el MediaPlayer subyacente:
public void stopPlayback() {
if (mMediaPlayer != null) {
mMediaPlayer.stop();
mMediaPlayer.release();
mMediaPlayer = null;
}
}
Bueno, para mí ninguna de las soluciones de este hilo funcionó, así que probé otra cosa y debajo está 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);
La solución que decidí, a menos que alguien pueda ofrecer una mejor, es usar setBackgroundResource
, que parece un nombre extraño 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);
}
}
La referencia que se puede dibujar es una simple layer-list
con un fondo azul personalizado y una imagen de logotipo centrada.
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 superficie (también puede definir otra vista en la parte superior 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);
Para mí, lo que funcionó fue simplemente ocultar y luego mostrar VideoView
usando setVisibility
.
public void clearCurrentFrame() {
videoView.setVisibility(GONE);
videoView.setVisibility(VISIBLE);
}
Esto fue porque quería que el VideoView
volviera transparente, no que fuera un color sólido. Establecer el fondo en transparente no funciona, el cuadro de video aún se muestra.
sólo este código:
videoView.setVideoURI(null);