para - Centro de recorte de un Android VideoView
manual android studio avanzado (3)
Estoy buscando algo como el CENTER_CROP en ImageView.ScaleType
Escale la imagen uniformemente (mantenga la relación de aspecto de la imagen) de modo que ambas dimensiones (ancho y alto) de la imagen sean iguales o más grandes que la dimensión correspondiente de la vista (menos el relleno). La imagen se centra entonces en la vista. Desde XML, use esta sintaxis: android: scaleType = "centerCrop"
pero para un VideoView. ¿Existe algo como esto?
Hay una manera sin utilizar TextureView
.
Coloque su VideoView
dentro de un ConstraintLayout
(el equivalente con FrameLayout
no funcionó):
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/container"
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">
<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" />
</androidx.constraintlayout.widget.ConstraintLayout>
Luego, en el tiempo de ejecución, agregue un OnPreparedListener
que verifique la proporción de video en comparación con la proporción de la vista, y aumente la ConstraintLayout
consecuencia:
videoView.setOnPreparedListener { mediaPlayer ->
val videoRatio = mediaPlayer.videoWidth / mediaPlayer.videoHeight.toFloat()
val screenRatio = container.width / container.height.toFloat()
val scaleX = videoRatio / screenRatio
if (scaleX >= 1f) {
container.scaleX = scaleX
} else {
container.scaleY = 1f / scaleX
}
}
Solo puedes lograr esto con un TextureView. (SurfaceView no funcionará tampoco). Aquí hay una biblioteca para reproducir video en un textureView con función de recorte central. TextureView solo se puede usar en api nivel 14 y superior desafortunadamente.
https://github.com/dmytrodanylyk/android-video-crop
Otra posibilidad es hacer zoom en la vista de video, pero no lo he intentado todavía.
//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;
}