AbsoluteLayoutを使用してVideoViewを配置しています(画面のいくつかの場所の特定の位置に表示する必要があります)。
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();
}
しかし、ビデオは指定した範囲にサイズ変更されません。
任意のヒント?
関連するもう1つの質問は、MediaControllerをVideoViewの上に表示する方法です。
これはあなたがしようとしていることに非常に近いです。あなたがビデオビューをサブクラス化することをいとわないなら、そしてここにoverride onMeasure
が解決策です。必要がある
MyVideoView extends VideoView
表示についてVidowView上のMediaController
宣言する
private MediaController controller = null;
OnCreate
controller = new MediaController(this);
controller.setMediaPlayer(mcEvents);
controller.setAnchorView(findViewById(R.id.wrapper));
アクティビティ
@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;
}
メディアコントローライベント
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;
}
};
サンプルレイアウトファイル
<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>
レイアウトファイルのみ変更できます。
<?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>
LayoutParams
を変更したら、setLayoutParams
を呼び出して、レイアウトを新しいパラメーターで更新できるようにする必要があると思います。 setLayoutParams
を呼び出した後、reqestLayout
メソッドを呼び出してレイアウトを無効にし、ビューの再描画をトリガーする必要がある場合があります。
MediaController
の新しいインスタンスを作成し、setMediaController
オブジェクトでメソッドVideoView
を使用する必要があります。