そのため、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を含む相対的なレイアウトがあります。
代わりに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>
ビデオを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>
プログラム的な方法でのキャメロンの回答(私のような誰かがそれを必要とする場合)
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);
これは、ビデオのアスペクト比を維持するすべてのビデオで機能します。 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);
}
});
それが誰かを助けることを願っています!