這幾天遇到一個問題: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