我正在使用DraggablePanel库(https://github.com/pedrovgs/DraggablePanel)来方便YouTube之类的视频播放器。如果您不熟悉此功能,则基本上可以让用户将当前正在播放的视频缩小到停靠在屏幕角落的小缩略图中。

不幸的是(我不确定上述库是否存在问题),我注意到如果在VideoView的父 View 上应用X和Y缩放比例,VideoView本身将不会调整其内容大小以匹配。

请参见下面的屏幕截图,其中VideoView处于自然比例,然后其父 View 缩小到大约0.6:0.6。您应该注意到,在缩放的屏幕截图中,VideoView裁剪了其内容,而不是调整大小以适合。



因此,我尝试在VideoView的父级比例更改时对其施加宽度和高度。互联网上有一些有关覆盖VideoView尺寸的示例-但这是我的简单版本:

public class ScalableVideoView extends VideoView {

    private int mVideoWidth;
    private int mVideoHeight;

    public ScalableVideoView(Context context) {
        super(context);
    }

    public ScalableVideoView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ScalableVideoView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        mVideoWidth = 0;
        mVideoHeight = 0;
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        if (mVideoWidth > 0 && mVideoHeight > 0) {
            // If a custom dimension is specified, force it as the measured dimension
            setMeasuredDimension(mVideoWidth, mVideoHeight);
        } else {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        }
    }

    public void changeVideoSize(int width, int height) {
        mVideoWidth = width;
        mVideoHeight = height;

        getHolder().setFixedSize(width, height);

        requestLayout();
        invalidate();
    }

}

当包含VideoView的 fragment 从DraggablePanel库接收到有关缩放比例变化的通知时,负责在其上调用changeVideoSize。此时,我将根据所提供的比例值来计算一对新的宽度和高度。 (比例从0f到1f)
public void setVideoViewScale(float scaleX, float scaleY) {
        if (mMaxVideoWidth == 0) {
            mMaxVideoWidth = mVideoView.getWidth();
        }

        if (mMaxVideoHeight == 0) {
            mMaxVideoHeight = mVideoView.getHeight();
        }

        if (mMaxVideoWidth > 0) {

            mVideoView.changeVideoSize((int) (scaleX * mMaxVideoWidth),
                    (int) (scaleY * mMaxVideoHeight));
        }
    }

不幸的是,这会导致一些非常有趣的结果。似乎VideoView的Video部分正在适当缩放-但是VideoView的边界似乎缩放得太快(导致视频缩小和裁剪)。

为了进一步演示,下面是两个视频:
  • https://github.com/npike/so_scalevideoview/blob/master/demo_videos/so_videoview_noscale.mp4
  • https://github.com/npike/so_scalevideoview/blob/master/demo_videos/so_videoview_scale.mp4

  • 我还将该示例项目上传到了GitHub,以便您可以看到完整的代码:
    https://github.com/npike/so_scalevideoview

    最佳答案

    我的应用程序遇到了同样的问题,因此我以您的示例为例,该示例要简单得多,并试图对其进行修复。
    这是解决该问题的代码。将您的changeVideoSize(int width,int height)方法编辑为:

    public void changeVideoSize(int width, int height){
        mVideoWidth = width;
        mVideoHeight = height;
    
        RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(width, height);
        lp.addRule(RelativeLayout.CENTER_HORIZONTAL, RelativeLayout.TRUE);
        lp.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE);
        setLayoutParams(lp);
    
        requestLayout();
        invalidate();
    }
    

    使用无效的 View ,您可以强制VideoView使用新的布局参数重新绘制整个View。

    关于android - VideoView无法缩放内容以匹配其父项,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23663580/

    10-11 20:09