Skip to content Skip to sidebar Skip to footer

Center Crop An Android Videoview

I am looking for something like the CENTER_CROP in ImageView.ScaleType Scale the image uniformly (maintain the image's aspect ratio) so that both dimensions (width and height) of

Solution 1:

You can only achieve this with a TextureView. (surfaceView won't work either). Here's a lib for playing video in a textureView with center crop function. TextureView can only be used in api level 14 and up unfortunately.

https://github.com/dmytrodanylyk/android-video-crop

Another possibility is to zoom in the videoview just right, but I haven't tried that yet.

Solution 2:

The simple and easy way if you are using ConstraintLayout.

XML

<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayoutxmlns: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"><VideoViewandroid: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>

then

In Kotlin:

videoView.setOnPreparedListener { mediaPlayer ->
    valvideoRatio= mediaPlayer.videoWidth / mediaPlayer.videoHeight.toFloat()
    valscreenRatio= videoView.width / videoView.height.toFloat()
    valscaleX= videoRatio / screenRatio
    if(scaleX >= 1f) {
        videoView.scaleX = scaleX
    } else {
        videoView.scaleY = 1f / scaleX
    }
}

See my Java version answer here: https://stackoverflow.com/a/59069357/6255841

And this worked for me.

Solution 3:

Nabin's answer worked for me.

Here is the Java version:

videoView.setOnPreparedListener(newMediaPlayer.OnPreparedListener() {
    @OverridepublicvoidonPrepared(MediaPlayer mp) {
        floatvideoRatio= mp.getVideoWidth() / (float) mp.getVideoHeight();
        floatscreenRatio= videoView.getWidth() / (float) videoView.getHeight();
        floatscaleX= videoRatio / screenRatio;
        if (scaleX >= 1f) {
            videoView.setScaleX(scaleX);
        } else {
            videoView.setScaleY(1f / scaleX);
        }
    }
});

Solution 4:

//store the SurfaceTexture to set surface for MediaPlayer
mTextureView.setSurfaceTextureListener(newSurfaceTextureListener() {
@OverridepublicvoidonSurfaceTextureAvailable(SurfaceTexture surface,
            int width, int height) {
        FullScreenActivity.this.mSurface = surface;

    }

Post a Comment for "Center Crop An Android Videoview"