2017-04-19 1 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

하지만 난이 같은 changeSize()View.post() 방법을 사용하므로보기에 Activity을 통과하고 싶지 않았다 내가 Activity.runOnUiThread() 방법을 사용할 수 있습니다

:

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

업데이트 :

아마 UI 스레드를 사용하는 적절한 방법에 대해 모르겠지만 무엇을 시도해도 뷰 매개 변수를 부드럽게 변경할 수는 없습니다. - 당신은 예를 들어, restictions 함께 custiomize 수

  1. 마 [안드로이드 네비게이션 서랍] [4] :

    일부 해결 방법은 슬라이드 메뉴를 구현하는 탐색 서랍을 위로부터 이동할 수 없습니다.

  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의 레이아웃 매개 변수가 변경됩니다. 그러나 SurfaceHolder을 소유하고있는 Canvas에 그림을 그리는 중입니다. 보통 View에서 제공하는 그림이 아닙니다.

그래서, SurfaceView의 크기를 변경하려면, 당신은 SurfaceHolder와 상호 작용할 수 있습니다

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

이전에'setLayoutParams (...) '다음에'changeSize()'와'draw()'메서드에서 2) 두 곳에서 시도해 보았습니다. 레이아웃과 같은 크기를 제공 할 수있는 [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

관련 문제