2010-11-04 4 views
1

J'ai une classe nommée dot et de nombreuses instances de cette même classe sont créées lors de l'exécution de l'application. Le problème est que je dois être capable de cliquer sur l'une des instances de cette classe et que l'instance cliquée ne change que les couleurs. Le problème est que chaque fois que je clique sur l'une des instances de points, tous changent de couleur au lieu de simplement celui sur lequel j'ai cliqué.privé dispatchTouchEvent?

Voici le code:

package com.ewebapps; 
import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Paint; 
import android.view.MotionEvent; 
import android.view.View; 

public class Dot extends View { 
    private final float x; 
    private final float y; 
    private final int r; 
    private final Paint mBlack = new Paint(Paint.ANTI_ALIAS_FLAG); 
    private final Paint mWhite = new Paint(Paint.ANTI_ALIAS_FLAG); 
    private final Paint mGreen = new Paint(Paint.ANTI_ALIAS_FLAG); 
    private boolean touched; 

    public Dot(Context context, float x, float y, int r) { 
     super(context); 
     mBlack.setColor(0xFF000000); //Black 
     mWhite.setColor(0xFFFFFFFF); //White 
     mGreen.setColor(0xFF00FF00); //Green 
     this.x = x; 
     this.y = y; 
     this.r = r; 
    } 

    @Override 
    public boolean dispatchTouchEvent(MotionEvent event) { // On touch. 
     touched = true; 
     //mPaint.setColor(0xFF00FF00); // Turn dot green. 
     this.invalidate(); 
     return super.dispatchTouchEvent(event); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     canvas.drawCircle(x, y, r+2, mWhite); //White stroke. 

     if(!touched) 
     { 
      canvas.drawCircle(x, y, r, mBlack); //Black circle. 
     } 
     else 
     { 
      canvas.drawCircle(x, y, r, mGreen); //Green circle. 
     } 
    } 

} 

Répondre

2

On ne sait pas comment vous déclarer ou d'appeler ou la création de ces points de vue, nous avons donc aucune idée de comment vous aider.

La seule chose que je peux dire est que dispatchTouchEvent n'est pas la même chose que onTouchEvent

Il ressemble à dispatchTouchEvent est appelé à chaque fois il y a un événement tactile à l'écran, pas sur vous. Ainsi, toutes vos vues reçoivent l'événement tactile, puis définissent sur true.

Called to process touch screen events. You can override this to intercept all touch screen events before they are dispatched to the window. Be sure to call this implementation for touch screen events that should be handled normally.

+0

C'est le code qui est appelé dans une classe séparée pour créer un cet objet « point », il est appelé plusieurs fois à travers une boucle créant un grand nombre d'entre eux: FrameLayout principal = (FrameLayout) findViewById (R .id.main_view); main.addView (nouveau point (this, x, y, 25)); – Eweb

+0

Merci beaucoup, j'ai compris la plupart de ce que vous avez expliqué se passait mais je me demandais si vous pouviez me donner une brève description de ce que je devrais faire pour le réparer? Peut-être un petit exemple de code et où devrait-il être placé? Si ce n'est pas correct mais ça aiderait beaucoup! Merci! – Eweb

+0

Vous devez faire en sorte que votre classe de vues implémente OnTouchListener – Falmarri