J'utilise un composant VideoView pour lire des vidéos. Je n'arrive pas à effacer l'affichage VideoView après avoir appelé manuellement stopPlayback (). Je souhaite réinitialiser VideoView afin que l'arrière-plan d'origine soit visible.
Le code que j'utilise:
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();
}
}
Notez que sur la source VideoView.Java, stopPlayback () effectue l'action suivante sur le MediaPlayer sous-jacent:
public void stopPlayback() {
if (mMediaPlayer != null) {
mMediaPlayer.stop();
mMediaPlayer.release();
mMediaPlayer = null;
}
}
Pour moi, ce qui a bien fonctionné a été de masquer puis d'afficher la VideoView
en utilisant setVisibility
.
public void clearCurrentFrame() {
videoView.setVisibility(GONE);
videoView.setVisibility(VISIBLE);
}
C'est parce que je voulais que la VideoView
devienne transparente et non une couleur unie. La définition de l'arrière-plan sur transparent ne fonctionne pas - l'image vidéo est toujours affichée.
La solution que j'ai choisie, à moins que quelqu'un ne puisse en proposer un meilleur, consiste à utiliser setBackgroundResource
, qui semble étrangement nommé puisqu'il semble modifier la ressource de premier plan.
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);
}
}
Le dessin que je référence est un simple layer-list
avec un arrière-plan bleu personnalisé et une image de logo centrée.
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>
Sinon, j'ai également pu utiliser setZOrderOnTop
pour contrôler l'emplacement de la vue de surface (vous pouvez également définir une autre vue au-dessus de VideoViewer et basculer la visibilité de cette façon):
videoViewer.setZOrderOnTop(false);
videoViewer.setZOrderOnTop(true);
Sinon, je pourrais aussi utiliser setBackgoundColor
pour accomplir la même chose que setBackgroundResource
:
videoViewer.setBackgroundColor(getResources().getColor(R.color.custom_blue));
videoViewer.setBackgroundColor(Color.TRANSPARENT);
juste ce code:
videoView.setVideoURI(null);
Eh bien, pour moi, aucune des solutions de ce fil n'a fonctionné, alors j'ai essayé autre chose et voici la solution qui fonctionne pour moi
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
mVideoViewPlayList.setVisibility(View.GONE);
mVideoViewPlayList.setVisibility(View.VISIBLE);
mVideoViewPlayList.setVideoURI(Uri.parse(path));
}
}, 500);
videoView.stopPlayBack();
videoView.seekTo(0);
espérons que cela peut vous aider