这几天遇到一个问题:
视频播放时,为了保持视频的宽高比,就需要在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跑一遍。这样就不会有问题了!
我花了一天的时间去找解决办法,没想到是它搞的鬼!