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