2017-11-22 19 views
0

나는 서피스 홀더에서 반환 된 캔버스에 그리려고합니다. lockCanvas()하지만 렌더링 된 캔버스는 단순히 흰색입니다.아무 것도 SurfaceHolder에서 Canvas에 표시하지 않습니다. lockCanvas() [Android]

MySurface extends SurfaceViewimplements SurfaceHolder 생성자 :

MySurface(Context context){ 
      super(context); 
      surfaceHolder = getHolder(); 
      surfaceHolder.addCallback(this); 
      displayThread = new MyDisplayThread(surfaceHolder); 
     } 

surfaceCreated() 재정

public void surfaceCreated(SurfaceHolder sH){ 
      displayThread.start(); 
     } 

surfaceDestroyed() 재정

public void surfaceDestroyed(SurfaceHolder sH){ 
      boolean reset = true; 
      while(reset){ 
       try{ 
        displayThread.join(); 
        reset = false; 
       }catch (InterruptedException e){} 
      } 
     } 

내가 그림에 사용하는 스레드 : 클래스 변수는 다음과 같습니다

SurfaceHolder surfaceHolder, 
Paint paint, 
boolean isRunning, 
Canvas canvas = null 


class MyDisplayThread extends Thread { 

     MyDisplayThread(SurfaceHolder sH){ 
      surfaceHolder = sH; 
      isRunning = true; 
      paint = new Paint(); 
     } 

     @Override 
     public void run(){ 
      while(isRunning){ 
       canvas = surfaceHolder.lockCanvas(); 
       try{ 
        myDraw(); 
       }finally { 
        if(canvas != null) surfaceHolder.unlockCanvasAndPost(canvas); 
       } 
      } 
     } 

     public void myDraw(){ 
      paint.setARGB(255,152,54,12); 
      canvas.drawText("RSFDS",100,100,paint); 
      canvas.drawRect(120,150,300,300,paint); 
      paint.setARGB(255,255,255,255); 
     } 
    } 

답변

0

가 (이 과거에 나를 위해 일한) 다음을 시도해보십시오

각 프레임을 그리기 전에 SurfaceHolder에 개체에 전화 postInvalidate();

surfaceCreated

내부 setWillNotDraw(false);를 넣습니다.

+0

시도해 주셔서 감사합니다. – dev

0

surfaceCreated()이 호출 된 후 getHolder()에 다시 전화해야합니다. 그것은 당신의 문제를 해결해야합니다.

@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    surfaceHolder = getHolder(); 
} 
+0

시도해 주셔서 감사하지만 도움이되지 않았다. – dev