将卡片视图高度扩展到包含的 exoplayer 的高度,仅裁剪 exoplayer 的左右两侧
Expand card view height to height of contained exoplayer, crop only left and right sides of expoplayer
我在 CardView 的 RecyclerView 中有一个 ex0player。 exoplayer 的高度需要根据包含的视频的高度以编程方式更改。此高度值是从 API 调用返回的,单位为 像素 。这是 ViewHolder 的布局:
<androidx.cardview.widget.CardView 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"
app:cardCornerRadius="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/communityPlayableCl"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<com.google.android.exoplayer2.ui.PlayerView
android:id="@+id/toroPlayerView"
android:layout_width="match_parent"
android:layout_height="0dp"
android:background="@color/transparent"
android:visibility="invisible"
app:controller_layout_id="@layout/v_player_controls"
app:keep_content_on_player_reset="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/communityPlayableIv"
app:player_layout_id="@layout/toro_exo_player_view"
app:resize_mode="zoom"
app:show_buffering="when_playing"
app:shutter_background_color="@android:color/transparent"
app:surface_type="texture_view"
app:use_controller="false" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/communityPlayableIv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:adjustViewBounds="true"
android:background="@color/black"
android:scaleType="centerCrop"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
tools:layout_editor_absoluteY="0dp"
tools:src="@color/alpha_grey" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/volumeIv"
android:layout_width="64dp"
android:layout_height="64dp"
android:layout_gravity="bottom|end"
android:padding="15dp"
android:src="@drawable/ic_volume_off"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
这是我调整高度和纵横比的方法:
if (model.mediaHeight != 0 && model.mediaHeight != null ) {
communityPlayableCl.requestLayout()
communityPlayableCl.layoutParams.height = model.mediaHeight
}
val constraintSet = ConstraintSet()
constraintSet.clone(communityPlayableCl)
constraintSet.setDimensionRatio(itemView.id,model.mediaAspectRatio)
constraintSet.applyTo(communityPlayableCl)
这会裁剪 640x640 视频的顶部和底部
您可以使用类似这样的方法从视频中获取尺寸。我也会在 Uri.parse
周围添加一个 try/catch,如果无法解析文件,这将失败。
Pair<Integer, Integer> getMediaDimensions(File file, Context context) {
if (!file.exists()) return null;
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
retriever.setDataSource(context, Uri.parse(file.getAbsolutePath()));
int width = Integer.valueOf(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH));
int height = Integer.valueOf(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT));
retriever.release();
return new Pair<>(width, height);
}
从那里,您可以手动计算并在计算比率后设置新的 height/width。或者,使用 ConstraintLayout 作为播放器的容器并将其 layout_constraintDimensionRatio
设置为 H,1:1
之类的内容,并将每个 1 替换为您的 width/height.
如果您使用的是 Kotlin,可以按照 this post 进行相应调整,并添加可重用的扩展。
我最终使用传递的宽高比手动设置了视图的尺寸
我在 CardView 的 RecyclerView 中有一个 ex0player。 exoplayer 的高度需要根据包含的视频的高度以编程方式更改。此高度值是从 API 调用返回的,单位为 像素 。这是 ViewHolder 的布局:
<androidx.cardview.widget.CardView 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"
app:cardCornerRadius="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/communityPlayableCl"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<com.google.android.exoplayer2.ui.PlayerView
android:id="@+id/toroPlayerView"
android:layout_width="match_parent"
android:layout_height="0dp"
android:background="@color/transparent"
android:visibility="invisible"
app:controller_layout_id="@layout/v_player_controls"
app:keep_content_on_player_reset="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/communityPlayableIv"
app:player_layout_id="@layout/toro_exo_player_view"
app:resize_mode="zoom"
app:show_buffering="when_playing"
app:shutter_background_color="@android:color/transparent"
app:surface_type="texture_view"
app:use_controller="false" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/communityPlayableIv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:adjustViewBounds="true"
android:background="@color/black"
android:scaleType="centerCrop"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
tools:layout_editor_absoluteY="0dp"
tools:src="@color/alpha_grey" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/volumeIv"
android:layout_width="64dp"
android:layout_height="64dp"
android:layout_gravity="bottom|end"
android:padding="15dp"
android:src="@drawable/ic_volume_off"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
这是我调整高度和纵横比的方法:
if (model.mediaHeight != 0 && model.mediaHeight != null ) {
communityPlayableCl.requestLayout()
communityPlayableCl.layoutParams.height = model.mediaHeight
}
val constraintSet = ConstraintSet()
constraintSet.clone(communityPlayableCl)
constraintSet.setDimensionRatio(itemView.id,model.mediaAspectRatio)
constraintSet.applyTo(communityPlayableCl)
这会裁剪 640x640 视频的顶部和底部
您可以使用类似这样的方法从视频中获取尺寸。我也会在 Uri.parse
周围添加一个 try/catch,如果无法解析文件,这将失败。
Pair<Integer, Integer> getMediaDimensions(File file, Context context) {
if (!file.exists()) return null;
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
retriever.setDataSource(context, Uri.parse(file.getAbsolutePath()));
int width = Integer.valueOf(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH));
int height = Integer.valueOf(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT));
retriever.release();
return new Pair<>(width, height);
}
从那里,您可以手动计算并在计算比率后设置新的 height/width。或者,使用 ConstraintLayout 作为播放器的容器并将其 layout_constraintDimensionRatio
设置为 H,1:1
之类的内容,并将每个 1 替换为您的 width/height.
如果您使用的是 Kotlin,可以按照 this post 进行相应调整,并添加可重用的扩展。
我最终使用传递的宽高比手动设置了视图的尺寸