web-dev-qa-db-ja.com

VideoView内にビデオを配置する

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

51
DArkO

代わりにFrameLayoutを使用してみてください。理由はわかりませんが、コードでLinearまたはRelativeを使用すると、中心になりませんが、FrameLayoutは中心になります。以下は、ビデオを画面に合わせて、比率を維持して中央揃えするXMLです。

<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>
124
Cameron

ビデオをRelativeLayoutの中央に配置するために、両方のlayout_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>
14
frognosis

プログラム的な方法でのキャメロンの回答(私のような誰かがそれを必要とする場合)

    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);
9
Hoven

これは、ビデオのアスペクト比を維持するすべてのビデオで機能します。 VideoView内にビデオを配置し、ImageViewと同様にCenter CropまたはCenter Insideを実行します。

VideoViewを使用して、ConstraintLayout全体をカバーしています。おそらく幅と高さとしてmatch_parentを持つ他のレイアウトを使用できます。

<?xml version="1.0" encoding="utf-8"?>
<Android.support.constraint.ConstraintLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">
    <VideoView
        Android:id="@+id/videoView"
        Android:layout_width="0dp"
        Android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</Android.support.constraint.ConstraintLayout>

OnCreateで:

Uri uri = //The uri of your video.
VideoView videoView = findViewById(R.id.videoView);
videoView.setVideoURI(uri);
videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {

        //Get your video's width and height
        int videoWidth = mp.getVideoWidth();
        int videoHeight = mp.getVideoHeight();

        //Get VideoView's current width and height
        int videoViewWidth = videoView.getWidth();
        int videoViewHeight = videoView.getHeight();

        float xScale = (float) videoViewWidth / videoWidth;
        float yScale = (float) videoViewHeight / videoHeight;

        //For Center Crop use the Math.max to calculate the scale
        //float scale = Math.max(xScale, yScale);
        //For Center Inside use the Math.min scale. 
        //I prefer Center Inside so I am using Math.min
        float scale = Math.min(xScale, yScale);

        float scaledWidth = scale * videoWidth;
        float scaledHeight = scale * videoHeight;

        //Set the new size for the VideoView based on the dimensions of the video
        ViewGroup.LayoutParams layoutParams = videoView.getLayoutParams();
        layoutParams.width = (int)scaledWidth;
        layoutParams.height = (int)scaledHeight;
        videoView.setLayoutParams(layoutParams);               
    }
 });

それが誰かを助けることを願っています!

4
Carlitos