2010-11-30 20 views
0

Je suis nouveau à Android, mais pas à la programmation. Et le code ci-dessous rend le icon.png qui est disponible par défaut dans android, va à travers l'écran ou du moins il est censé le faire. Cela ne fonctionne pas. Quelqu'un peut-il aider?Android problème de boucle

> package com.android.test; import 
> android.app.Activity; import 
> android.content.Context; import 
> android.graphics.Bitmap; import 
> android.graphics.BitmapFactory; import 
> android.graphics.Canvas; import 
> android.graphics.Color; import 
> android.os.Bundle; 
> 
> 
> import android.view.View; import 
> android.view.Window; 
> 
> public class Android extends Activity 
> { int x,y=10; 
> 
> @Override public void onCreate(Bundle 
> savedInstanceState) { 
> super.onCreate(savedInstanceState); 
> requestWindowFeature(Window.FEATURE_NO_TITLE); 
> setContentView(new Panel(this)); } 
> 
> class Panel extends View { public 
> Panel(Context context) { 
> super(context); } 
> 
> @Override public void onDraw(Canvas 
> canvas) { Bitmap _scratch = 
> BitmapFactory.decodeResource(getResources(), 
> R.drawable.icon); 
> canvas.drawColor(Color.BLACK); int 
> n=1; while (n==1){ try { 
> Thread.sleep(30); } catch 
> (InterruptedException e) { } 
> canvas.drawBitmap(_scratch, x, y, 
> null); x+=2; y+=2; 
> 
> canvas.drawBitmap(_scratch, x, y, 
> null); } } } } 
+4

Pouvez-vous retirer les caractères '>' et formater votre code correctement? – elevine

Répondre

0

Je suis trop Android Dev amateur, et je pense que je me souviens avoir lu que son une mauvaise habitude d'appeler Thread.Sleep() comme solution de contournement. Mais je peux me tromper.

2

Votre méthode onDraw() ne retourne jamais. Cela doit Est-ce que votre application force la fermeture après quelques secondes? Vous allez devoir envoyer un message au thread d'interface utilisateur à redessiner après 30 millisecondes au lieu de boucler dans onDraw(). Du haut de ma tête, essayez ceci:

class Panel extends View { 
    public Panel(Context context) { 
    super(context); 
    } 

    int x = 0; 
    int y = 0; 
    Bitmap _scratch = BitmapFactory.decodeResource(getResources(), R.drawable.icon); 

    @Override public void onDraw(Canvas canvas) { 
    canvas.drawColor(Color.BLACK); 
    canvas.drawBitmap(_scratch, x, y, null); 
    x+=2; y+=2; 
    this.postInvalidateDelayed(30); 
    } 
} 

Bien sûr, vous devez ajouter un peu de code pour arrêter de boucler une fois que l'icône a disparu du bord.

+0

O, l'homme ...... merci beaucoup. Ça marche. Mais pourriez-vous s'il vous plaît expliquer ce que "this.postInvalidateDelayed (30);" Est-ce que? – efa

+0

Les activités sont exécutées par un thread principal (c'est-à-dire le thread de l'interface utilisateur), et ce thread tourne autour d'une file d'attente de messages pour trouver des choses à faire. postInvalidateDelayed() ajoute un message à la file d'attente de 30 ms, cette vue doit être redessinée. Après 30 ms, le thread principal récupère ce message et appelle votre méthode onDraw(). Qui publie un autre message, et ainsi de suite. –

+0

C'est également de là que provient l'erreur Application Not Responding. Si le thread principal met plus de 5 secondes à traiter un message, Android considère qu'il s'agit d'un problème. C'est pourquoi vous ne pouvez pas faire une boucle dans onDraw(). –

0

OnDraw est conçu pour afficher l'affichage une fois. C'est probablement une mauvaise idée d'essayer et de faire cette boucle dans onDraw. Plutôt que d'utiliser une boucle, vous pouvez essayer d'utiliser une animation. Faites une recherche google pour "tutoriel d'animation Android" ou quelque chose de similaire.