这几天遇到一个问题: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