2017-04-19 126 views
2

我正在處理擴展SurfaceView的幻燈片菜單視圖,但是當我嘗試更改視圖的大小時畫布不會更改。爲什麼編輯LayoutParams尺寸時不具有畫布尺寸的效果

調試目的,我改變了看法調用方法的大小:平局功能

public void changeSize() { 
    width += 10; 
    getLayoutParams().width = width; 
    this.setLayoutParams(getLayoutParams()); 
} 

然後我畫在畫布上的白色和畫斜對面的觀點紅線:

public void draw() throws Exception { 
    SurfaceHolder surfaceHolder = getHolder(); 
    if (surfaceHolder.getSurface().isValid()) { 
    Canvas canvas = surfaceHolder.lockCanvas(); 
    Log.i(TAG, "draw > canvas size: " + canvas.getWidth() + " " + canvas.getHeight()); 
    paint.setColor(Color.rgb(255,0,0)); 
    paint.setStrokeWidth(5); 
    canvas.drawColor(Color.rgb(255, 255, 255)); 
    canvas.drawLine(0, getLayoutParams().height, getLayoutParams().width, 0, paint); 

    surfaceHolder.unlockCanvasAndPost(canvas); 
    } 
} 

我看到的是一個白色的矩形,它有固定的大小和紅線的一部分: demo

另外,當我撥打this.getWidth()時,寬度不變。 爲什麼視圖大小不變?這與畫布沒有改變的原因是一樣的嗎?我能做些什麼來解決它?

回答

1

我找到理由爲自己。

我沒有提到什麼 - 我認爲不重要 - 我通過其他線程調用了changeSize()而不是創建視圖,這是不允許的,因爲:Only the original thread that created a view hierarchy can touch its views。這個問題很多時候都解決了,例如here

我可以使用Activity.runOnUiThread()方法,但我不想給Activity傳遞給視圖,所以我在changeSize()這樣使用View.post()方法:

Runnable changeParams = new Runnable() { 
    @Override 
    public void run() { 
    getLayoutParams().width = width; 
    setLayoutParams(getLayoutParams()); 
    } 
}; 
this.post(changeParams); 

更新:

也許我不知道使用UI線程的正確方式,但無論我嘗試過什麼,我都無法順利地更改視圖參數。

一些解決方法來實現滑動菜單:

  1. DO [安卓導航抽屜] [4] - 你可以用restictions custiomize它例如您不能使導航抽屜從頂部移動。
  2. 使用[Android動畫] [5] - 使用它您可以移動或縮放視圖,但無法調整其大小。

我不能把超過2個鏈接我的名聲:

(4):developer.android.com/training/implementing-navigation/nav-drawer.html

( 5):developer.android.com/training/animation/index。html

0

通過做getLayoutParams().width = width;您正在更改View的佈局參數。但是您正在執行Canvas的繪圖,該圖擁有SurfaceHolder,而不是普通的View將提供給您的那個。

因此,爲了改變SurfaceView的大小,你必須與SurfaceHolder互動:

surfaceView.getHolder().setFixedSize(width, height); 
+0

我在兩個地方嘗試過:1)在'setLayoutParams(...)'後的'changeSize()'中,以及2)在'draw()'方法中。兩者不能像[setSizeFromLayout()](https://developer.android.com/reference/android/view/SurfaceHolder.html#setSizeFromLayout())一樣工作,它可以提供與佈局相同的大小。 – lvl7

+0

只要[SurfaceHolder#Callback#surfaceCreated(SurfaceHolder)](https://developer.android.com/reference/android/view/SurfaceHolder.Callback.html)被觸發,'SurfaceHolder'將被訪問。你從那裏試過了嗎? – azizbekian