缩放 SurfaceView 时,Exoplayer 视频不缩放
Exoplayer video does not scale when SurfaceView is scaled
我正在使用 Exoplayer library to create video player application. I'm trying to make a feature like youtube: drag video player to bottom and i will be scaled to smaller size. To do that, i have used ViewDragHelper。当播放器拖动时,我会这样缩放它的大小:
public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {
mTop = top;
mDragOffset = (float) top / mDragRange;
mVideoView.setPivotX(mHeaderView.getWidth());
mVideoView.setPivotY(mHeaderView.getHeight());
mVideoView.setScaleX(1 - mDragOffset / 2);
mVideoView.setScaleY(1 - mDragOffset / 2);
mDescView.setAlpha(1 - mDragOffset);
requestLayout();
}
mVideoView
是一个 SurfaceView
,玩家需要 SurfaceView
来渲染它的内容。 SurfaceView
正确缩放,但它的内容没有。
问题:如何缩放 SurfaceView 及其内容?
终于,我找到了解决问题的方法。我用 TextureView
代替 SurfaceView
,现在它完美无缺。
作为答案有点晚了,但另一种解决方案是用 FrameLayout 包裹 SurfaceView。然后修改布局参数或FrameLayout的正确属性,而不是直接修改SurfaceView。
注意:也可以使用自定义布局,在某些情况下可能是更好的方法。
如果因为使用第三方库或类似的东西而必须坚持使用 SurfaceView,解决方法是使用缩放动画缩小它,并在动画完成后更新 SurfaceView 的布局参数为缩放位置提供正确的大小和位置。它并不完美,但对于那些别无选择的人来说应该是好的。
您可以像这样使用 TextureView
而不是 SurfaceView
:
<com.google.android.exoplayer2.ui.PlayerView
android:id="@+id/play_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:surface_type="texture_view"/>
我正在使用 Exoplayer library to create video player application. I'm trying to make a feature like youtube: drag video player to bottom and i will be scaled to smaller size. To do that, i have used ViewDragHelper。当播放器拖动时,我会这样缩放它的大小:
public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {
mTop = top;
mDragOffset = (float) top / mDragRange;
mVideoView.setPivotX(mHeaderView.getWidth());
mVideoView.setPivotY(mHeaderView.getHeight());
mVideoView.setScaleX(1 - mDragOffset / 2);
mVideoView.setScaleY(1 - mDragOffset / 2);
mDescView.setAlpha(1 - mDragOffset);
requestLayout();
}
mVideoView
是一个 SurfaceView
,玩家需要 SurfaceView
来渲染它的内容。 SurfaceView
正确缩放,但它的内容没有。
问题:如何缩放 SurfaceView 及其内容?
终于,我找到了解决问题的方法。我用 TextureView
代替 SurfaceView
,现在它完美无缺。
作为答案有点晚了,但另一种解决方案是用 FrameLayout 包裹 SurfaceView。然后修改布局参数或FrameLayout的正确属性,而不是直接修改SurfaceView。
注意:也可以使用自定义布局,在某些情况下可能是更好的方法。
如果因为使用第三方库或类似的东西而必须坚持使用 SurfaceView,解决方法是使用缩放动画缩小它,并在动画完成后更新 SurfaceView 的布局参数为缩放位置提供正确的大小和位置。它并不完美,但对于那些别无选择的人来说应该是好的。
您可以像这样使用 TextureView
而不是 SurfaceView
:
<com.google.android.exoplayer2.ui.PlayerView
android:id="@+id/play_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:surface_type="texture_view"/>