改变Surface视图大小

要改变一个视频流窗口的大小有几种方法。

我一开始用了 "最聪明" 的一种,直接用scale动画放大,然而这种方法虽然方便,也有问题,就是视频窗口的画质明显也被拉伸了,很模糊,明显不符合要求。

mVideoSurface.animate().scaleX(3).scaleY(3);

使用 LayoutParams 改变布局大小,是没有问题的,但是布局变大了,然而视频显示部分并没有变化,这时候只要在监听中跟踪一下它的生命周期就会轻易的解决这个问题,生命周期中,正好有一个 onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) 方法,该方法需要3个参数,猜一下应该是变更surface以及它的宽高。

进入TextureView中看一下

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    if (mSurface != null) {
        mSurface.setDefaultBufferSize(getWidth(), getHeight());
        updateLayer();
        if (mListener != null) {
            mListener.onSurfaceTextureSizeChanged(mSurface, getWidth(), getHeight());
        }
    }
}

那么我也可以这样用

// 布局大小变更
ViewGroup.LayoutParams lp = mVideoSurface.getLayoutParams();
// 大小控制
if (mVideoHeight <= lp.height) break;
mVideoHeight = lp.height;
// 放大一倍
lp.height *= 2;
lp.width *= 2;
mVideoSurface.setLayoutParams(lp);
// 改变surface内容尺寸
mVideoSurface.getSurfaceTextureListener().onSurfaceTextureSizeChanged(
        mVideoSurface.getSurfaceTexture(),
        mVideoSurface.getLayoutParams().width,
        mVideoSurface.getLayoutParams().height
);

问题就这么解决了,

要考虑在 onSurfaceTextureSizeChanged 方法内部做的业务逻辑

你可能感兴趣的:(改变Surface视图大小)