2011-03-29 4 views
0

je laisse à l'utilisateur de faire de la peinture dans mon application app.The montrera quelques options sur l'écran une fois l'écran entier est peint.détecter si l'utilisateur a peint tout l'écran

Je pense à garder un tableau de pixels d'écran par exemple. pixel = new int[width][height]; et le marquer chaque fois que le pixel est peint, mais je suppose que c'est une mauvaise solution à mon problème.

est-il un moyen de détecter si l'utilisateur a peint tout l'écran?

@Override 
public boolean onTouchEvent(MotionEvent ev) { 
    switch (ev.getAction()) { 
    case MotionEvent.ACTION_DOWN: { 
     X = (int) ev.getX(); 
     Y = (int) ev.getY(); 
     break; 
    } 
    case MotionEvent.ACTION_MOVE: { 
     X = (int) ev.getX(); 
     Y = (int) ev.getY(); 
     break; 
    } 
    return true; 
} 
@Override 
public void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    canvas.drawCircle(X, Y, 50, paint); 
} 
+0

Au lieu d'un tableau, qu'en est-il d'un compteur? Pixel ++ pour chaque pixel retourné puis vérifiez quand il atteint la limite supérieure. –

+0

L'utilisateur peut peindre au même endroit rendant ainsi la méthode pixel ++ invalide – SteD

Répondre

1

Je ne peux pas penser à autre chose que d'utiliser un tableau pour garder la trace de l'état des pixels. Un réseau 2D est cependant plus lent que l'utilisation de deux réseaux 1D parallèles. Mais qu'en est-il de mettre tous les pixels dans un seul tableau et quand il est peint, retirer son élément du tableau? Au lieu de boucle à travers tout le tableau, vous pouvez simplement vérifier la longueur du tableau à 0.

0

Je pense que votre approche (en gardant une matrice) est probablement la bonne, mais si la taille de la brosse est beaucoup plus grand que 1 pixel, il peut être judicieux de garder une matrice basse résolution: vous probablement pas besoin de précision au pixel près. Oui, de cette façon, vous pourriez laisser l'utilisateur s'en tirer en ne remplissant pas tous les pixels à l'écran, mais cela prendrait beaucoup moins de mémoire.

0

La réponse est peut-être de créer un Bitmap. Toutes les peintures se produisent dans l'image bitmap et sont mélangées à la toile pour le garder synchronisé.

La vérification est effectuée à partir d'une minuterie et d'un fil d'arrière-plan qui appelle périodiquement Bitmap.copyPixelsToBuffer pour copier les données dans un IntBuffer. Ensuite, vous pouvez parcourir le tampon d'un pixel (un int32) à la fois. Si tous les pixels ont la même valeur, vous savez que l'écran est rempli et vous pouvez faire ce que vous voulez en réponse. Une implémentation plus efficace peut utiliser le dessin de l'utilisateur comme déclencheur pour le temporisateur d'arrière-plan et se limiter à l'union des limites que l'utilisateur a dessinées depuis le dernier contrôle plutôt que de vérifier à nouveau tout l'écran.

0

Utilisez une couleur d'arrière-plan non disponible pour l'utilisateur. Ajouter un au compteur (voir la suggestion de AD) chaque fois qu'un pixel change de la couleur de fond à une nouvelle couleur.

Questions connexes