70 votes

MediaController positionné sur VideoView

J'ai un VideoView qui occupe la moitié supérieure de l'Activité dans l'orientation portrait avec la moitié inférieure de l'écran affichant des images et du texte. Je suis à jouer un rtsp flux vidéo dans l'affichage de la vidéo lorsque l'Activité commence. J'ai joint une MediaController à la VideoView via le code suivant:

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

Quand je tape sur le VideoView à mettre en place la MediaController sur l'écran j'attend les commandes de lecture apparaissent en superposition de la zone du bas de l'VideoView (le bas de la MediaController même avec le bas de la VideoView). Au lieu de la MediaController apparaît au bas de l'écran, la superposition de certains des graphiques et du texte que j'ai en dessous de la VideoView.

Existe-il d'autres étapes à suivre pour obtenir le MediaController à apparaître là où je veux qu'il à l'écran?

56voto

bk138 Points 894

Définir la vue d'ancrage ne fonctionnera que si la taille de la vidéo est connue - ce ne sera pas lors de l'init. Mais vous pouvez faire quelque chose comme ça:

  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);
                                                    }
                                                });
                                            }
                                        });
 

24voto

bughi Points 536

J'ai trouvé une solution vraiment facile.

Enroulez simplement la videoView dans un FrameLayout pour pouvoir ensuite ajouter 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);
 

13voto

Hafiz Points 84

Je rencontre le même problème récemment, à l'aide de setAnchorView(videoView) va mettre le contrôleur sous VideoView plutôt planant sur la zone de fond d'elle. Mon VideoView est un tiers de l'écran dans la zone supérieure, de sorte que le contrôleur finissent par couvrir tout ce point de Vue sous VideoView.

Ci-dessous est la façon dont je le faire sans avoir à écrire de plein fouet l'personnalisé contrôleur (seulement primordial onSizeChanged de MediaController pour déplacer l'ancre vers le haut) :

Utilisation FrameLayout comme un point d'ancrage pour MediaContoller, l'envelopper avec VideoView comme ci-dessous :

<RelativeLayout
    android:id="@+id/videoLayout"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1.3"
    android:layout_gravity="center"
    android:background="#000000">

    <VideoView
        android:id="@+id/videoView1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerInParent="true" />

    <FrameLayout android:id="@+id/controllerAnchor"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true" 
        android:layout_alignParentRight="true" 
        />

</RelativeLayout>

Créer des MediaController qui se déplacera FrameLayout (avec MediaController qui est ancrée à il va suivre) lorsque sa taille a changé :

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();
    }       
}

Utiliser l'outil de contrôleur ci-dessus à la place de la norme, 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);                
}

9voto

Rongan Points 31

J'utilise ce code pour le résoudre.

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

définir la vue du contrôleur multimédia sur la position souhaitée. J'espère que cela vous aidera.

7voto

CommonsWare Points 402670

Franchement, je viens d'écrire mon propre contrôleur. En fait, je l'ai fait une fois .

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X