web-dev-qa-db-fra.com

Redimensionner la vidéo pour adapter la vidéasieView

Je positionne une vidéoView avec Absolutelayout (j'ai besoin de l'afficher sur plusieurs endroits dans l'écran à des postes spécifiques).

public void showVideo(RectF bounds, final String videoUrl) {
    AbsoluteLayout.LayoutParams params = (AbsoluteLayout.LayoutParams) video.getLayoutParams();
    params.width = (int) bounds.width();
    params.height = (int) bounds.height();
    params.x = (int) bounds.left;
    params.y = (int) bounds.top;

    video.requestLayout();

    video.setVisibility(View.VISIBLE);
    video.setFocusable(true);
    video.setFocusableInTouchMode(true);
    video.requestFocus();

    File file = new File(videoUrl);
    video.setVideoPath(file.getAbsolutePath());
    video.start();
}

Mais la vidéo n'est pas redimensionnée aux limites que j'ai spécifiées.

Des conseils?

Une autre question connexe est la suivante: comment faire du message MediaController sur la vidéopieView?

17
Marcos Vasconcelos

c'est très proche de ce que vous essayez. Si vous êtes prêt à sous-classer la vidéothèque et override onMeasure Voici la solution. vous devez

MyVideoView extends VideoView

https://stackoverflow.com/questions/4434027/androïd-videoView-orientation-change-with-buffered-video/4452597#4452597


pour afficher MediaController sur VidowView

Déclarer

private MediaController controller = null;

Surcreate

controller = new MediaController(this);
controller.setMediaPlayer(mcEvents);
controller.setAnchorView(findViewById(R.id.wrapper));

Activité

@Override
public boolean onTouchEvent(MotionEvent event) {
    //the MediaController will hide after 3 seconds - tap the screen to make it appear again
    controller.show();
    return false;
}

Événements du contrôleur de média

private MediaController.MediaPlayerControl mcEvents = new MediaController.MediaPlayerControl() {        
    public void start() {
        player.start();
    }

    public void seekTo(int pos) {
        player.seekTo(pos);         
    }

    public void pause() {
        player.pause();
    }

    public boolean isPlaying() {            
        return player.isPlaying();
    }

    public int getDuration() {          
        return player.getDuration();
    }

    public int getCurrentPosition() {           
        return player.getCurrentPosition();
    }

    public int getBufferPercentage() {          
        return pBuffer;
    }

    public boolean canSeekForward() {           
        return true;
    }

    public boolean canSeekBackward() {
        return true;
    }

    public boolean canPause() {
        return true;
    }
};

un exemple de fichier de mise en page

<FrameLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/wrapper"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
>
<com.my.views.MyViedoView
    Android:id="@+id/player"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_gravity="center"
/>
</FrameLayout>
16
Samuel

Vous ne pouvez modifier que le fichier de mise en page:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent">

    <VideoView Android:id="@+id/videoViewRelative"
         Android:layout_alignParentTop="true"
         Android:layout_alignParentBottom="true"
         Android:layout_alignParentLeft="true"
         Android:layout_alignParentRight="true"
         Android:layout_width="fill_parent"
         Android:layout_height="fill_parent">
    </VideoView>

</RelativeLayout>
12
boomz

Après avoir changé votre LayoutParams, je pense que vous devrez appeler setLayoutParams afin que la mise en page puisse être mise à jour avec les nouveaux paramètres. Après l'appel à setLayoutParams, vous devrez peut-être appeler la méthode reqestLayout pour invalider la mise en page et déclencher une redessinée de la vue.

Vous devrez créer une nouvelle instance de MediaController et utiliser la méthode setMediaController sur l'objet VideoView.

2
bluefalcon