Center Crop an Android VideoView

19,753

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.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>

then

In Kotlin:

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
    }
}

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(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);
        }
    }
});

Solution 4

//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;

    }
Share:
19,753

Related videos on Youtube

clocksmith
Author by

clocksmith

Updated on April 14, 2022

Comments

  • clocksmith
    clocksmith about 2 years

    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 the image will be equal to or larger than the corresponding dimension of the view (minus padding). The image is then centered in the view. From XML, use this syntax: android:scaleType="centerCrop"

    but for a VideoView. Does anything like this exist?

  • MoDu
    MoDu over 4 years
    This is by far, the best solution I've seen. Drop in a wrapper and one lambda, and it's perfect!
  • Dyno Cris
    Dyno Cris over 3 years
    unfourtunatly, it doesn't work for me( why? it doesn't scale, remains unchanged
  • Alessandro Scarozza
    Alessandro Scarozza over 3 years
    @Nabin works! but why not works using FrameLayout instead ConstraintLayout?