被SurfaceView搞死了的搞后感

这几天遇到一个问题:

视频播放时,为了保持视频的宽高比,就需要在surfaceView的父view的大小改变的时候,改变SurfaceView的大小。

父View的大小改变的时候,会走View的onSizeChanged回调。所以,复写了这个方法:

 @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        Log.d(TAG, "onSizeChanged w = " + w + " , h = " + h + " , oldw = " + oldw + " , oldh = " + oldh);
        //当界面大小有变化的时候,需要改变surfaceView的大小。
        resizeSurfaceView();
    }

private void resizeSurfaceView()
{
     int width = mediaPlayer.getVideoWidth();
     int height = mediaPlayer.getVideoHeight();
//根据视频宽高和父View的宽高计算SurfaceView的宽高
     Point surfaceViewSize = measureSurfaceViewSize(width, height);
     RelativeLayout.LayoutParams surfaceLayoutParams = (LayoutParams) mSurfaceView.getLayoutParams();

     surfaceLayoutParams.width = surfaceViewSize.x;
     surfaceLayoutParams.height = surfaceViewSize.y;

     Log.d("size", " new size = " + surfaceViewSize);
     surfaceLayoutParams.addRule(RelativeLayout.CENTER_IN_PARENT);
//重新设置布局
     mSurfaceView.setLayoutParams(surfaceLayoutParams);
}

//根据视频宽高和父View的宽高计算SurfaceView的宽高
  private Point measureSurfaceViewSize(int width, int height) {
        float parentWh = getMeasuredWidth() * 1.0f / getMeasuredHeight();
        float videoWh = width * 1.0f / height;
        Point surfaceViewSize = new Point();
        if (parentWh >= videoWh) {
            surfaceViewSize.y = getMeasuredHeight();
            surfaceViewSize.x = (int) (surfaceViewSize.y * videoWh);
        } else {
            surfaceViewSize.x = getMeasuredWidth();
            surfaceViewSize.y = (int) (surfaceViewSize.x / videoWh);
        }

        return surfaceViewSize;
    }

结果在运行的时候发现,有时候设置了大小,但是SurfaceView的大小还是没有变化。

在网络上一片寻找,终于找到原因:SurfaceView在setLayoutParams之后,并不一定是立即生效的。生效时间取决于调用它的方法还要做多久。如果时间长了,可能就不会变大小了。

于是很简单的改了一下:

 @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        Log.d(TAG, "onSizeChanged w = " + w + " , h = " + h + " , oldw = " + oldw + " , oldh = " + oldh);
        //当界面大小有变化的时候,需要改变surfaceView的大小。

        //post是为了防止修改surfaceView的宽高导致的阻塞,从而导致转屏时出问题.
        this.post(new Runnable() {
            @Override
            public void run() {
                resizeSurfaceView();
            }
        });
    }

将resizeSurfaceView()方法,通过post跑一遍。这样就不会有问题了!

我花了一天的时间去找解决办法,没想到是它搞的鬼!

转载于:https://my.oschina.net/lifj/blog/749350

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值