美文网首页程序员
改变Surface视图大小

改变Surface视图大小

作者: 世外大帝 | 来源:发表于2020-04-22 10:38 被阅读0次

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

我一开始用了 "最聪明" 的一种,直接用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视图大小

    要改变一个视频流窗口的大小有几种方法。 我一开始用了 "最聪明" 的一种,直接用scale动画放大,然而这种方法虽...

  • Masonry小结

    multipliedBy(约束值为约束对象的百分比)用法: 动态布局,根据内容的大小,父视图大小根据子视图大小改变...

  • frame和bounds浅析

    一、frame 改变的始终是自己的位置大小,是以父视图的坐标为参照,从而确定在父视图中的位置大小。 二、bound...

  • MediaPlayer不拉伸全屏/满屏播放

    MediaPlayer播放区域是由Surface的区域决定的,如果需要全屏/满屏播放,请注意Surface大小的设...

  • UIView的布局更新和重绘机制

    Laying out Subviews -layoutSubviews 此函数用于,父视图的布局、大小等发生了改变...

  • ios 子视图随父视图改变大小

  • SurfaceView

    SurfaceView 字面来看是一个“表面视图”的意思,其实跟字面意思差不多,它就是一个表面视图,Surface...

  • Swift UI 13. frame、bounds、center

    1 frame :(大小,位置) 表示一个视图控件的大小和位置. 2 bounds : (大小) 只用来描述视图的...

  • iOS 使用CGAffineTransform 使视图平移|旋转

    在日常开发中,经常要改变改变视图的位置或者大小,但是我经常只想到改变frame去实现.但是实际也可以使用trans...

  • drawable,视图大小

    获取屏幕宽高Rect r = new Rect();//Rect(0, 60 - 1080, 1920)h=r.h...

网友评论

    本文标题:改变Surface视图大小

    本文链接:https://www.haomeiwen.com/subject/lcbbihtx.html