59

そこで、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 を含む相対的なレイアウトがあります。

4

5 に答える 5

136

FrameLayout代わりにa を使用してみてください。理由はわかりませんが、コードでLinearorを使用すると、中央に配置されませんが、中央に配置されます。これは、ビデオを画面に合わせて比率を維持し、中央に配置する XML です。RelativeFrameLayout

<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>
于 2011-01-31T19:46:27.993 に答える
14

動画をRelativeLayoutlayout_gravity="center"の中央に配置するために、両方の adを追加しましlayout_centerInParent="true"た。Android 4.3 携帯電話で動作します。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <VideoView android:id="@+id/surface_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center"
        android:layout_centerInParent="true" />
</RelativeLayout>
于 2013-08-15T22:58:56.093 に答える
9

プログラムによるキャメロンの回答(私のような人がそれを必要とする場合に備えて)

    FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(
            LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);

    FrameLayout fl = new FrameLayout(this);

    fl.setLayoutParams(lp);

    VideoView vv = new VideoView(this);

    FrameLayout.LayoutParams lp2 = new FrameLayout.LayoutParams(lp);

    lp2.gravity = Gravity.CENTER;

    vv.setLayoutParams(lp2);

    fl.addView(vv);

    setContentView(fl);
于 2013-11-29T11:35:35.597 に答える