2017-12-06 3 views
0

Ich verwende Surfaceview, um das Hintergrundbild zu ändern. Aber ich werde falsch auf holder.getSurface(). IsValid() und ich weiß nicht warum. Ich habe mir hier ähnliche Fragen angeschaut, konnte sie aber immer noch nicht lösen. Gibt es etwas fehlt, was ich bisher getan haben, oder gibt es etwas, das ichholder.getSurface(). IsValid() gibt false zurück

Dank

import android.content.Context; 

import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 

import android.view.SurfaceHolder; 
import android.view.SurfaceView; 


public class BrickSmasherView extends SurfaceView { 



    SurfaceHolder holder; 




    Canvas canvas; 
    Context context; 

    Thread back = null; 

    volatile boolean running = false; 

    public BrickSmasherView(Context context) { 
     super(context); 
     this.context = context; 
     holder = getHolder(); 

    } 
    public void runbackThread(){ 
     back = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       while (running){ 
        draw(); 
       } 
      } 
     }); 
     back.start(); 
    } 




    public void resumegame(){ 
     running = true; 
     runbackThread(); 

    } 

    public void pausegame(){ 

     running = false; 
     try 
     { 
      back.join(); 


     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 

public void draw(){ 
    if(holder.getSurface().isValid()){ 
     canvas = holder.lockCanvas(); 
     canvas.drawBitmap(BitmapFactory.decodeResource(getResources(),R.drawable.sky),0,0,null); 
     holder.unlockCanvasAndPost(canvas); 
    } 
} 

} 

Antwort

0

Sie haben sollten versuchen Callback im SurfaceView hinzufügen Veranstaltungen über Oberflächen Verfügbarkeit zu erhalten und tun Zeichnung von ein Thread.

Ein Rückruf Beispiel wird wie folgt aussehen:

public class MyCallback implements SurfaceHolder.Callback { 
    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, 
     int width, int height) {  
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     // you need to start your drawing thread here 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     // and here you need to stop it 
    } 
} 

Und als Sie diesen Rückruf SurfaceHolder festlegen müssen:

surface.getHolder().addCallback(new MyCallback()); 

die Sie interessieren bitte. Ich denke, es wird Ihnen helfen