32 votos

Colocación sobre VideoView MediaController

Tengo un VideoView que ocupa la mitad superior de la Actividad en orientación vertical, con la mitad inferior de la pantalla que muestra algunas de las imágenes y de texto. Yo estoy jugando un rtsp secuencia de vídeo en la visualización de vídeo cuando se inicie la Actividad. He adjuntado una MediaController a la VideoView mediante el siguiente código:

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

Cuando me toca el VideoView para que aparezca el MediaController en la pantalla esperaba, los controles de reproducción aparecen superponer la zona inferior de la VideoView (la parte inferior de la MediaController incluso con la parte inferior de la VideoView). En lugar de la de MediaController aparece más abajo en la pantalla, la superposición de algunos de los gráficos y de texto que tengo debajo de la VideoView.

Hay algunos pasos adicionales que debo tomar para obtener la MediaController a aparecer donde yo quiero que en la pantalla?

20voto

bk138 Puntos 894

Ajuste el punto de vista de anclaje sólo funcionará si se conoce el tamaño videoview - que no sean con init. Pero se puede hacer algo como esto:

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

7voto

Hafiz Puntos 84

Me encuentro con el mismo problema recientemente, el uso de setAnchorView(videoView) configurar el controlador completamente bajo VideoView en lugar del ratón en la parte inferior de la misma. Mi VideoView es un tercio de la pantalla en la parte superior, por lo que el controlador de acabar cubriendo cualquier punto de Vista bajo VideoView.

A continuación es la forma en que termino haciendo sin escribir en toda regla personalizadas del controlador (sólo primordial onSizeChanged de MediaController para mover el ancla) :

Uso FrameLayout como un ancla para MediaContoller, envolver junto con VideoView de la siguiente manera :

<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>

Crear MediaController que se mueven FrameLayout (con MediaController que está anclado a lo que le sigue) cuando su tamaño ha cambiado :

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

El uso de la costumbre controlador de arriba en lugar de la estándar y, a continuación, fíjelo a la 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);                
}

6voto

Rongan Puntos 31

Usar este código para solucionarlo.

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

para establecer la vista mediacontroller a la posición deseada. Esto ayudará a la esperanza.

4voto

bughi Puntos 536

Encontré una solución muy fácil.

Simplemente Envuelva la videoView en un FrameLayout entonces usted puede Agregar el MediaController a eso FrameLayout del código, así:

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

3voto

CommonsWare Puntos 402670

Francamente, sólo escribiría mi propio controlador. De hecho, que lo hice una vez.

Dicho esto, trate de setAnchorView() --por mi lectura del código fuente, el MediaController aparecerá en la parte inferior de lo que el anclaje es.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X