被SurfaceView搞死了的搞后感

这几天遇到一个问题:java

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

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

@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以后,并不必定是当即生效的。生效时间取决于调用它的方法还要作多久。若是时间长了,可能就不会变大小了。post

因而很简单的改了一下:this

@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跑一遍。这样就不会有问题了!spa

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

相关文章
相关标签/搜索