缩放 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"/>