Positionnement de MediaController sur VideoView

J’ai une VideoView qui occupe la moitié supérieure de l’activité en orientation portrait, la moitié inférieure de l’écran affichant des images et du texte. Je lis un stream vidéo rtsp dans la vue vidéo au démarrage de l’activité. J’ai attaché un MediaController à VideoView via le code suivant:

MediaController controller = new MediaController(this); controller.setAnchorView(this.videoView); controller.setMediaPlayer(this.videoView); this.videoView.setMediaController(controller); 

Lorsque j’appuie sur VideoView pour afficher le MediaController à l’écran, je m’attends à ce que les commandes de lecture apparaissent en superposition dans la partie inférieure de VideoView (en bas du MediaController, même en bas de VideoView). Au lieu de cela, le MediaController apparaît plus bas sur l’écran, recouvrant une partie des graphiques et du texte que j’ai sous VideoView.

Dois-je prendre d’autres mesures pour que le MediaController apparaisse à l’écran?

Franchement, je voudrais juste écrire mon propre contrôleur. En fait, j’ai fait une fois .

Cela étant dit, essayez setAnchorView() – en lisant le code source, le MediaController apparaîtra au bas de la vue d’ancrage.

Définir la vue d’ancrage ne fonctionnera que si la taille de la vue vidéo est connue – ce ne sera pas lors de l’initialisation. Mais vous pouvez faire quelque chose comme ceci:

 video.setOnPreparedListener(new OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { mp.setOnVideoSizeChangedListener(new OnVideoSizeChangedListener() { @Override public void onVideoSizeChanged(MediaPlayer mp, int width, int height) { /* * add media controller */ mc = new MediaController(YourActivity.this); video.setMediaController(mc); /* * and set its position on screen */ mc.setAnchorView(video); } }); } }); 

J’ai trouvé une solution vraiment facile.

Enveloppez simplement la videoView dans un FrameLayout, puis vous pouvez append le MediaController à ce FrameLayout à partir du code, comme ceci:

  MediaController mc = new MediaController(context); videoView.setMediaController(mc); FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); lp.gravity = Gravity.BOTTOM; mc.setLayoutParams(lp); ((ViewGroup) mc.getParent()).removeView(mc); ((FrameLayout) findViewById(R.id.videoViewWrapper)).addView(mc); 

EDIT: depuis que j’ai posté cette réponse, je me suis heurté à de nombreux problèmes avec le masquage et avec le contrôle de sa taille, j’ai donc créé ma propre mise en page avec des contrôles que je pouvais animer et utiliser sans mal de tête.

Je rencontre le même problème récemment, en utilisant setAnchorView (videoView), vous placerez le contrôleur complètement sous VideoView, en passant sur la partie inférieure de celui-ci. My VideoView est un troisième écran dans la zone supérieure, de sorte que le contrôleur finit par couvrir n’importe quelle vue sous VideoView.

Voici comment je onSizeChanged par le faire sans écrire un contrôleur personnalisé complet (ne onSizeChanged que onSizeChanged de MediaController pour se déplacer):

Utilisez FrameLayout comme ancre pour MediaContoller, enveloppez-le avec VideoView comme ci-dessous:

     

Créez un MediaController personnalisé qui déplacera FrameLayout (avec MediaController ancré à celui-ci) lorsque sa taille change:

 public class MyMediaController extends MediaController { private FrameLayout anchorView; public MyMediaController(Context context, FrameLayout anchorView) { super(context); this.anchorView = anchorView; } @Override protected void onSizeChanged(int xNew, int yNew, int xOld, int yOld) { super.onSizeChanged(xNew, yNew, xOld, yOld); RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) anchorView.getLayoutParams(); lp.setMargins(0, 0, 0, yNew); anchorView.setLayoutParams(lp); anchorView.requestLayout(); } } 

Utilisez le contrôleur personnalisé ci-dessus à la place du contrôleur standard, puis fixez-le au FrameLayout:

 protected void onCreate(Bundle savedInstanceState) { //... videoView = (VideoView) findViewById(R.id.videoView1); videoController = new MyMediaController(this, (FrameLayout) findViewById(R.id.controllerAnchor)); videoView.setMediaController(videoController); //... } public void onPrepared(MediaPlayer mp) { videoView.start(); FrameLayout controllerAnchor = (FrameLayout) findViewById(R.id.controllerAnchor); videoController.setAnchorView(controllerAnchor); } 

J’utilise ce code pour le résoudre.

 mediaController.setPadding(0, 0, 0, px); 

pour définir la vue mediacontroller sur la position souhaitée. J’espère que cela vous aidera.

  //It work good with me        package com.example.videoview; import android.app.Activity; import android.content.res.Configuration; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; import android.media.MediaPlayer.OnPreparedListener; import android.media.MediaPlayer.OnVideoSizeChangedListener; import android.os.Bundle; import android.os.Handler; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.MediaController; import android.widget.RelativeLayout; import android.widget.RelativeLayout.LayoutParams; import android.widget.Toast; import android.widget.VideoView; public class MainActivity extends Activity { // private Ssortingng path = "http://clips.vorwaerts-gmbh.de/VfE_html5.mp4"; private Ssortingng path = "http://2387227f13276d2e8940-fbe0b8d9df729a57ca0a851a69d15ebb.r55.cf1.rackcdn.com/hero_2012_demo.mp4"; private VideoView mVideoView; MediaController mc; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (mVideoView != null) return; /** * TODO: Set the path variable to a streaming video URL or a local media * file path. */ mVideoView = (VideoView) findViewById(R.id.videoview); mVideoView.setOnCompletionListener(new OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { Toast.makeText(MainActivity.this, "The End", Toast.LENGTH_LONG) .show(); } }); if (path == "") { // Tell the user to provide a media file URL/path. Toast.makeText( MainActivity.this, "Please edit MainActivity, and set path" + " variable to your media file URL/path", Toast.LENGTH_LONG).show(); } else { /* * Alternatively,for streaming media you can use * mVideoView.setVideoURI(Uri.parse(path)); */ mVideoView.setVideoPath(path); mVideoView .setMediaController(new MediaController(MainActivity.this)); mVideoView.requestFocus(); mVideoView.setOnPreparedListener(new OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { // TODO Auto-generated method stub mp.setOnVideoSizeChangedListener(new OnVideoSizeChangedListener() { @Override public void onVideoSizeChanged(MediaPlayer mp, int width, int height) { /* * add media controller */ mc = new MediaController(MainActivity.this); mVideoView.setMediaController(mc); /* * and set its position on screen */ mc.setAnchorView(mVideoView); ((ViewGroup) mc.getParent()).removeView(mc); ((FrameLayout) findViewById(R.id.videoViewWrapper)) .addView(mc); mc.setVisibility(View.INVISIBLE); } }); mVideoView.start(); } }); mVideoView.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub if (mc != null) { mc.setVisibility(View.VISIBLE); new Handler().postDelayed(new Runnable() { @Override public void run() { mc.setVisibility(View.INVISIBLE); } }, 2000); } return false; } }); } } private RelativeLayout.LayoutParams paramsNotFullscreen, paramsFullscreen; /** * handle with the configChanges atsortingbute in your manifest */ @Override public void onConfigurationChanged(Configuration newConfig) { // TODO Auto-generated method stub super.onConfigurationChanged(newConfig); if (paramsFullscreen == null) { paramsNotFullscreen = (RelativeLayout.LayoutParams) mVideoView .getLayoutParams(); paramsFullscreen = new LayoutParams(paramsNotFullscreen); paramsFullscreen.setMargins(0, 0, 0, 0); paramsFullscreen.height = ViewGroup.LayoutParams.MATCH_PARENT; paramsFullscreen.width = ViewGroup.LayoutParams.MATCH_PARENT; paramsFullscreen.addRule(RelativeLayout.CENTER_IN_PARENT); paramsFullscreen.addRule(RelativeLayout.ALIGN_PARENT_LEFT); paramsFullscreen.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); paramsFullscreen.addRule(RelativeLayout.ALIGN_PARENT_TOP); paramsFullscreen.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); } // To fullscreen if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { mVideoView.setLayoutParams(paramsFullscreen); } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { mVideoView.setLayoutParams(paramsNotFullscreen); } } @Override protected void onPause() { if (mVideoView.isPlaying()) { mVideoView.pause(); } super.onPause(); } @Override public void onBackPressed() { if (mVideoView != null) { mVideoView.stopPlayback(); } finish(); } }               

C’est la première fois que je réponds à une question dans stackoverflow, j’insère uniquement un VideoView dans un FrameLayout avec les mêmes mesures à la fois. MediaController sera au bas de FrameLayout. Cela a fonctionné pour moi:

main_activity.XML:

     

MainActivity.java:

 @Override public void onClick(View v) { int i = v.getId(); if(i == R.id.select_video){ selectVideo(); } private void selectVideo(){ //this code is to get videos from gallery: Intent galleryIntent = new Intent(Intent.ACTION_GET_CONTENT); galleryIntent.addCategory(Intent.CATEGORY_OPENABLE); galleryIntent.setAction(Intent.ACTION_GET_CONTENT); galleryIntent.setType("video/*"); startActivityForResult(galleryIntent, GALLERY_REQUEST); MediaController mediaController = new MediaController(this); mediaController.setAnchorView(mVideo); //mVideo is the VideoView where I insert the video mVideo.setMediaController(mediaController); mVideo.pause(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case 1: if (resultCode == RESULT_OK) { mVideoUri = data.getData(); mVideo.setVideoURI(mVideoUri); mVideo.start(); } } } 

Avec java 8 :

 videoView.setOnPreparedListener(mediaPlayer -> mediaPlayer.setOnVideoSizeChangedListener( (player, width, height) -> { MediaController controller = new MediaController(YourActivity.this); videoView.setMediaController(controller); controller.setAnchorView(videoView); } ) );