ImageView.ScaleType のCENTER_CROPのようなものを探しています
画像を均一にスケーリングし(画像のアスペクト比を維持)、画像の両方の寸法(幅と高さ)がビューの対応する寸法(マイナスパディング)以上になるようにします。次に、画像がビューの中央に配置されます。 XMLから、次の構文を使用します:Android:scaleType = "centerCrop"
videoViewの場合。このようなものは存在しますか?
TextureViewでのみこれを達成できます。 (surfaceViewも機能しません)。これは、センタークロップ機能を備えたtextureViewでビデオを再生するためのライブラリです。 TextureViewは、残念ながらAPIレベル14以上でのみ使用できます。
https://github.com/dmytrodanylyk/Android-video-crop
もう1つの可能性は、ビデオビューを適切にズームインすることですが、まだ試していません。
ConstraintLayoutを使用している場合のシンプルで簡単な方法。
xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<VideoView
Android:id="@+id/videoView"
Android:layout_width="@dimen/dimen_0dp"
Android:layout_height="@dimen/dimen_0dp"
Android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
その後
videoView.setOnPreparedListener { mediaPlayer ->
val videoRatio = mediaPlayer.videoWidth / mediaPlayer.videoHeight.toFloat()
val screenRatio = videoView.width / videoView.height.toFloat()
val scaleX = videoRatio / screenRatio
if (scaleX >= 1f) {
videoView.scaleX = scaleX
} else {
videoView.scaleY = 1f / scaleX
}
}
そして、これは私のために働いた。
//store the SurfaceTexture to set surface for MediaPlayer
mTextureView.setSurfaceTextureListener(new SurfaceTextureListener() {
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface,
int width, int height) {
FullScreenActivity.this.mSurface = surface;
}
ナビンKシュレスタの答えは私のために働いた。
Javaバージョン:
videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
float videoRatio = mp.getVideoWidth() / (float) mp.getVideoHeight();
float screenRatio = videoView.getWidth() / (float) videoView.getHeight();
float scaleX = videoRatio / screenRatio;
if (scaleX >= 1f) {
videoView.setScaleX(scaleX);
} else {
videoView.setScaleY(1f / scaleX);
}
}
});