2017-11-22 16 views
0

私はサーフェスホルダーから返されたキャンバスに描画しようとしています。 lockCanvas()が機能しますが、レンダリングされるキャンバスは単に白です。SurfaceHolderのキャンバスに何も表示されません。 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オブジェクト上setWillNotDraw(false);

surfaceCreated内部コール postInvalidate();を入れてください。

+0

お試しいただきありがとうございました。 – dev

0

surfaceCreated()が呼び出された後でgetHolder()に再度電話する必要があります。それはあなたの問題を解決するはずです。

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

お試しいただきありがとうございました。 – dev

関連する問題