2012-12-21 4 views
1

J'ai essayé de démarrer un nouveau projet et quand je suis partie, je n'ai rien pu faire. J'ai regardé le code pendant quelques heures et j'ai joué avec, mais je ne me souviens pas comment j'ai réparé cette dernière fois.Toile ne dessine pas Android

package org.waldev.canvascollisiontest; 

import android.app.Activity; 
import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.PixelFormat; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 

public class CollisionTest extends Activity { 
private Panel game; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    game = new Panel(this); 
    setContentView(game); 
} 

public class Panel extends SurfaceView implements SurfaceHolder.Callback{ 
    Threads thread; 

    public Panel(Context context) { 
     super(context); 
     thread = new Threads(this.getHolder(), this); 
     setFocusable(true); 
    } 

    public void onDraw(Canvas c) 
    { 
     c.drawColor(Color.BLUE); 
    } 
    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, 
      int height) { 
     // TODO Auto-generated method stub 
    } 

    //when the game starts, run the thread\ 
    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 
     holder.setFormat(PixelFormat.RGB_565); 
     thread.setRunning(true); 
     thread.start(); 
    } 

    //if its destroyed, then destroy the thread 
    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 
     boolean retry = true; 
     thread.setRunning(false); 
     while (retry) { 
      try { 
       thread.join(); 
       //     bitmaps.recycleAll(); 
       retry = false; 
      } catch (InterruptedException e) { 
       // we will try it again and again... 
      } 
     } 
    } 

} 
} 

Et le fil:

package org.waldev.canvascollisiontest; 

import org.waldev.canvascollisiontest.CollisionTest.Panel; 

import android.graphics.Canvas; 
import android.view.SurfaceHolder; 

public class Threads extends Thread{ 
SurfaceHolder surfaceHolder; 
private Panel game; 

private Canvas c; 
private boolean isRunning = true; 

// desired fps 
private final static int MAX_FPS = 24; 
// maximum number of frames to be skipped 
private final static int MAX_FRAME_SKIPS = 0; 
// the frame period 
private final static int FRAME_PERIOD = 1000/MAX_FPS; 


public Threads(SurfaceHolder surfaceHolder, Panel panel){ 
    this.surfaceHolder = surfaceHolder; 
    game = panel; 
} 

public void setRunning(boolean run){ 
    isRunning = run; 
} 

public boolean getRunning(){ 
    return isRunning(); 
} 

public SurfaceHolder getSurface(){ 
    return surfaceHolder; 
} 

@Override 
public void run() { 
    Canvas canvas; 

    long beginTime;  // the time when the cycle begun 
    long timeDiff;  // the time it took for the cycle to execute 
    int sleepTime;  // ms to sleep (<0 if we're behind) 
    int framesSkipped; // number of frames being skipped 
    boolean updated = false; 

    sleepTime = 0; 

    while (isRunning) { 
     canvas = null; 
     try { 
      canvas = this.surfaceHolder.lockCanvas(); 
      synchronized (surfaceHolder) { 
       beginTime = System.currentTimeMillis(); 
       framesSkipped = 0; 
       if(canvas != null) 
       { 
        game.onDraw(canvas); 
       } 
       timeDiff = System.currentTimeMillis() - beginTime; 
       sleepTime = (int)(FRAME_PERIOD - timeDiff); 

       if (sleepTime > 0) { 
        try { 
         Thread.sleep(sleepTime); 
        } catch (InterruptedException e) {} 
       } 
       else 
       { 
        updated = false; 
       } 
      } 
     } finally { 
      // in case of an exception the surface is not left in 
      // an inconsistent state 
      if (canvas != null) { 
       surfaceHolder.unlockCanvasAndPost(canvas); 
      } 
     } // end finally 
    } 
} 
public boolean isRunning() { 
    return isRunning; 
} 
} 

je jette quelques points de rupture là-bas et il est jamais surfaceCreated en appellent CollisionTest. Je sais que c'est quelque chose de stupide qui me manque ici, alors si vous le voyez, faites le moi savoir. Merci!

William

+0

Votre bloc synchronisé ne peut pas aider. Vous appelez déjà lockCanvas() - Cela fait la synchronisation pour vous. BTW, surfaceview est double buffered, donc vous aurez besoin de redessiner l'état sur chaque image pour éviter le scintillement. En outre, si ce thread est interrompu, vous devez sortir de la boucle while. Ne pas simplement rouler sur cette exception. Utilisez une pause déclaration. –

+0

Très bien ... Je vais devoir travailler dessus ... les deux que j'ai copiés d'un autre projet qui fonctionne. J'essaye juste de l'obtenir pour dessiner la couleur encore, et je sais que le fil fonctionne quand il est utilisé correctement, je n'arrive pas à comprendre pourquoi il n'est pas appelé, ce que j'imagine que j'ai oublié de quelque chose dans la surface –

Répondre

2

Je l'ai travail, j'ai oublié d'ajouter:

getHolder().addCallback(this); 

au constructeur pour le panneau, qui est ce qui cause cela fonctionne pas. Merci!

+0

Psst. Marquez votre réponse comme réponse. – user314104