2016-04-18 7 views
-1

Aus irgendeinem Grund kann ich nicht scheinen, um das richtig zu bekommen. Ich möchte, dass eines der drei Bilder alle 3 Sekunden erscheint, aber aus irgendeinem Grund gibt es mir ein zufälliges Bild und dann erscheint ein anderes plötzlich und verschwindet. Insgesamt möchte ich, dass es alle 3 Sekunden ein Bild erzeugt, aber aus irgendeinem Grund nicht funktioniert. Unten ist der Code für meine VGameView:Anzeigen zufälliges Bild alle 3 Sekunden - Android Studio

public class VGameView extends View { 
private Bitmap parrot; 
private Bitmap moneyChest; 
private Bitmap bomb; 

Random randy; 
int savedTime = 0; 
long lastTime; 
int rndImg; 

private String score = "Score: "; 
private int scoreCounter = 0; 
private Paint scorePaint = new Paint(); 

public VGameView(Context context) { 
    super(context); 

    parrot = BitmapFactory.decodeResource(getResources(), R.drawable.parrot); 

    moneyChest = BitmapFactory.decodeResource(getResources(), R.drawable.moneychest); 

    bomb = BitmapFactory.decodeResource(getResources(), R.drawable.bomb); 

    scorePaint.setColor(Color.BLACK); 
    scorePaint.setTextSize(50); 
} 

public boolean onTouchEvent(MotionEvent event) { 
    int eventAction = event.getAction(); 

    int x = (int) event.getX(); 
    int y = (int) event.getY(); 

    switch (eventAction) { 
     case MotionEvent.ACTION_DOWN: 
      break; 
    } 
    invalidate(); 
    return true; 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    String.valueOf(scoreCounter); 
    canvas.drawText(score + scoreCounter, 10, 100, scorePaint); 

    long now = System.currentTimeMillis(); 
    savedTime += now - lastTime; 
    lastTime = now; 

    if (savedTime > 3000) { 
     savedTime = 0; 
     Random randy = new Random(); 
     rndImg = (int) (3 * Math.random()) + 1; 
     if (rndImg == 1) { 
      canvas.drawBitmap(parrot, 200, 500, null); 
     } 

     if (rndImg == 2) { 
      canvas.drawBitmap(moneyChest, 600, 200, null); 
     } 

     if (rndImg == 3) { 
      canvas.drawBitmap(bomb, 30, 30, null); 
     } 
    } 
} 

Antwort

0

einen Handler mit postdelayed

private Handler mHandler; 

Runnable imageChecker = new Runnable() { 
@Override 
public void run() { 
     try { 
      //update your image here 
     } finally { 
      mHandler.postDelayed(imageChecker, 3000); 
     } 
} 
}; 

onCreate

Implement
mHandler = new Handler(); 
imageChecker.run(); 
+0

Nicht ganz sicher, wie man dies an der Arbeit, da es nur eine Java-Klasse und nicht ein XML und nur ein GameView und ich benutze kein onCreate. Ich werde weiter schauen, wie man es implementiert, aber danke für die Hilfe! Sehr geschätzt! – AlanW

1

onDraw() wird einmal aufgerufen werden, wenn Ansicht erstellt wird, und danach wird es sein, wird nur aufgerufen, wenn die Ansicht zurückgesetzt werden muss. Dies geschieht, wenn Sie invalidate() Methode aufrufen.

Also, ich empfehle Ihnen, einen Thread oder einen Handler in der Aktivität erstellen Sie die Ansicht erstellen und dann die Ansicht alle 3 Sekunden zurücksetzen.

innen VGameView:

@Override 
protected void onDraw(Canvas canvas) { 
    String.valueOf(scoreCounter); 
    canvas.drawText(score + scoreCounter, 10, 100, scorePaint); 

     rndImg = (int) (3 * Math.random()) + 1; 
     if (rndImg == 1) { 
      canvas.drawBitmap(parrot, 200, 500, null); 
     } 

     if (rndImg == 2) { 
      canvas.drawBitmap(moneyChest, 600, 200, null); 
     } 

     if (rndImg == 3) { 
      canvas.drawBitmap(bomb, 30, 30, null); 
     } 
    } 

public void reset(){ 
    invalidate(); 
} 

innen Aktivität:

Handler mHandler = new Handler(); 
Runnable changeImage = new Runnable() { 
@Override 
public void run() { 
     mview.reset(); 
     mHandler.postDelayed(changeImage, 3000); 
    } 
}; 

mHandler.postDelayed(changeImage, 3000); 

Sag mir, ob das funktioniert ..