2017-11-22 3 views
0

Ich versuche, auf der Leinwand, die von den Oberflächenhalter zurückgegeben wird, zu zeichnen. lockCanvas() Funktion, aber die Leinwand, die gerendert wird, ist einfach weiß.Nichts wird auf dem Canvas von SurfaceHolder angezeigt. lockCanvas() [Android]

Mein MySurface extends SurfaceView und implements SurfaceHolder Der Konstruktor:

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

Meine surfaceCreated() Überschreibung

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

Meine surfaceDestroyed() Überschreibung

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

Und der Faden, den ich für das Zeichnen verwendet werden: die Klassenvariablen sind:

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); 
     } 
    } 

Antwort

0

Versuchen Sie, die folgenden (diese haben für mich in der Vergangenheit gearbeitet):

Put setWillNotDraw(false); innen surfaceCreated

Anruf postInvalidate(); auf Ihrem SurfaceHolder Objekt vor jeder Frame zeichnen.

+0

Hat nicht geholfen, aber danke für den Versuch. – dev

0

Sie müssen getHolder() erneut aufrufen, nachdem surfaceCreated() aufgerufen wird. Das sollte dein Problem beheben.

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

Hat nicht geholfen, aber danke für den Versuch. – dev

Verwandte Themen