被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

相關文章
相關標籤/搜索