そこで、VideoView の onMeasure を拡張して、ビデオをフルスクリーン ビュー内に収まるように拡大しました。
方法は次のとおりです:
public void setVideoAspect(int w,int h){
wVideo=w;
hVideo=h;
onMeasure(w, h);
}
@Override
protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec)
{
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if(wVideo!=0 && hVideo!=0)
setMeasuredDimension(wVideo,hVideo);
}
画面の表示メトリック (幅、高さ) を指定して setVideoAspect() を呼び出します。問題は、このメソッドが画面内に収まるようにビデオを引き伸ばしてしまうことです。アスペクト比を維持できるようにしたいのです (ビデオは 4:3、画面サイズは 3:2 です)。次のコードを使用して、保持された比率の測定値をビューに渡しました。
int height = (int) (metrics.widthPixels*3/(float)4);
int width= metrics.widthPixels;
mVideoView.setVideoAspect(width,height);
これでうまくいきますが、問題があります。画面の幅に合わせて 4:3 のビデオが生成され、高さも正しく調整されますが、ビデオが中央に配置されません。(ビデオの上部と下部を均等にトリミングするのではなく、ビデオの下部だけがトリミングされます。) VideoView の重力が中央に設定された VideoView を含む相対レイアウトがあります。
ベストアンサー1
代わりにを使用してくださいFrameLayout
。理由はわかりませんが、コード内でLinear
または を使用すると中央に配置されませんが、中央に配置されます。比率を維持し、中央に配置してビデオを画面に合わせる XML は次のとおりです。Relative
FrameLayout
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/bg">
<!-- Video player -->
<VideoView
android:id="@+id/surface_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="center"/>
</FrameLayout>