2015-04-21 1 views
0

Je fais une application qui affiche des cercles au hasard sur l'écran. Les cercles sont rouges ou verts. Le but de l'application est de faire en sorte que lorsque quelqu'un touche un cercle vert, il se passe quelque chose de bien, comme s'ils obtenaient des points ajoutés à leur score. Quand un cercle rouge est cliqué quelque chose de mal arrive comme une nouvelle activité est commencée et la page indique que vous avez échoué ou quelque chose. Voici mon code pour cette application. Dans ce code, je ne reçois aucune erreur, rien dans logcat, tout fonctionne très bien. Les cercles s'affichent au hasard sur l'écran ainsi que le score qui est par défaut 0. Le problème que j'ai avec cette application est que quand un cercle rouge ou vert est cliqué rien ne se passe.Lorsque quelqu'un touche un cercle rouge sur mon application rien ne se passe

public DrawingView(Context context) { 
     super(context); 
     // TODO Auto-generated constructor stub 

    } 
    RectF rectf = new RectF(0, 0, 200, 0); 

    private static final int w = 100; 
    public static int lastColor = Color.BLACK; 
    private final Random random = new Random(); 
    private final Paint paint = new Paint(); 
    private final int radius = 230; 
    private final Handler handler = new Handler(); 
    public static int redColor = Color.RED; 
    public static int greenColor = Color.GREEN; 
    int randomWidth = 0; 
    int randomHeight = 0; 
    public static int addPoints = 0; 


    private final Runnable updateCircle = new Runnable() { 
     @Override 
     public void run() { 
      lastColor = random.nextInt(2) == 1 ? redColor : greenColor; 
      paint.setColor(lastColor); 
      invalidate(); 
      handler.postDelayed(this, 1000); 

     } 
    }; 

    @Override 
    protected void onAttachedToWindow() { 
     super.onAttachedToWindow(); 
     handler.post(updateCircle); 
    } 

    @Override 
    protected void onDetachedFromWindow() { 
     super.onDetachedFromWindow(); 
     handler.removeCallbacks(updateCircle); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     // your other stuff here 
     if(random == null){ 
      randomWidth =(int) (random.nextInt(Math.abs(getWidth()-radius/2)) + radius/2f); 
      randomHeight = (random.nextInt((int)Math.abs((getHeight()-radius/2 + radius/2f)))); 
     }else { 
      randomWidth =(int) (random.nextInt(Math.abs(getWidth()-radius/2)) + radius/2f); 
      randomHeight = (random.nextInt((int)Math.abs((getHeight()-radius/2 + radius/2f)))); 
     } 

     canvas.drawCircle(randomWidth, randomHeight, radius, paint); 

     paint.setColor(Color.BLACK); 
     paint.setTextSize(150); 
     canvas.drawText("Score: " + addPoints, 120, 300, paint); 
    } 

    public boolean onTouch(View v, MotionEvent event) { 
    int x = (int) event.getX(); 
    int y = (int) event.getY(); 
    if(isInsideCircle(x, y) == true){ 
     //Do your things here 
     if(redColor == lastColor){ 
      Intent i = new Intent(v.getContext(), YouFailed.class); 
      v.getContext().startActivity(i); 
     } else { 
      addPoints++; 
     } 
    }else { 

    } 
    return true; 
} 

public boolean isInsideCircle(int x, int y){ 
    if ((((x - randomWidth)*(x - randomWidth)) + ((y - randomHeight)*(y - randomHeight))) < ((radius)*(radius))){ 
    return true; 
    } 
    return false; 
} 


} 
+0

Etes-vous sûr que votre contact (x, y) sont cercle à l'intérieur? Et pourquoi ne vérifiez-vous pas quelle est l'action, c'est-à-dire 'DOWN', 'MOVE' ou 'UP'. @Paul – Pooja

+1

mettre le point de débogage ici "int x = (int) event.getX();" et assurez-vous qu'il est exécuté –

Répondre

0
  1. Votre vue ne pourrait pas être implémentant l'interface View.OnTouchListener, par conséquent, il ne pas appeler la méthode onTouch().

  2. Votre vue n'est pas définie comme View.OnTouchListener via la méthode View.setOnTouchListener(View.OnTouchListener) de la vue.

Android Developer Reference - View.OnTouchListener

De toute façon, il se sent mal à faire une vue de mettre en œuvre cette interface pour écouter lui-même. Au lieu de cela, vous pouvez jeter un oeil à la méthode View.onTouchEvent(MotionEvent event); peut-être qu'il sert votre but (ou devrait dans ce cas). Les interfaces d'écoute sont supposées être implémentées par des composants externes. Supposons, par exemple, que si vous voulez que votre TextView soit écouté à chaque fois qu'un bouton ou ImageView est touché, vous pouvez étendre TextView/Button et les implémenter dans l'interface du Listener, puis le passer en paramètre de setOnTouchListener(View.OnTouchListener). Toutefois, toutes les vues ont une méthode appelée onTouchEvent().

Cette méthode View.onTouchEvent() doit être utilisée si vous voulez écouter les événements au sein de la vue elle-même, car il est par défaut appelé chaque fois que la vue est, bien touché. Si vous avez besoin d'une référence à la vue elle-même avec cette approche, vous appelez this puisque la vue elle-même serait votre portée actuelle.

Android Developer Reference - View.onTouchEvent(MotionEvent event)

Si vous le faites comme ça, tout ce que vous devez faire pour rendre votre travail de code est de changer votre méthode onTouch() à une substitution de onTouchEvent() comme ceci: (vérification également ajoutée de l'action tactile comme suggérée par Pooja et Tom afin que vous ne prenez pas en compte MOVE ou UP événements. le changement DOWN pour UP selon le moment où vous voulez déclencher l'événement)

@Override 
public boolean onTouchEvent(MotionEvent event) { 

    if (event.getAction() == MotionEvent.ACTION_DOWN) { 
     int x = (int) event.getX(); 
     int y = (int) event.getY(); 

     if(isInsideCircle(x, y) == true) { 
      //Do your things here 
      if(redColor == lastColor){ 
       Intent i = new Intent(v.getContext(), YouFailed.class); 
       this.getContext().startActivity(i); 
      } else { 
       addPoints++; 
      } 
     } else { 
      //Handle case not inside the circle 
     } 
    } 

    return true; 
} 
+0

Merci beaucoup! Je pensais que l'extension de la classe de vue a pris ses interfaces avec elle? J'ai essayé de l'implémenter, mais éclipse ne me laissait pas –

0

leLa méthode 210 est destinée à être utilisée avec OnTouchListener et devrait normalement être définie en dehors de votre classe de vue personnalisée. Par exemple:

this.setOnTouchListener(new OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      // touch handling code 
      return true; 
     } 
    }); 

Dans le cas où vous êtes à la recherche pour les événements tactiles à l'intérieur de votre vue personnalisée, vous devez implémenter la méthode onTouchEvent. Vous pouvez également vérifier pour ACTION_UP ou ACTION_DOWN ou vous allez traiter plusieurs événements tactiles.

@Override 
public boolean onTouchEvent(MotionEvent event) { 

    boolean result = false; 

    if (event.getAction() == MotionEvent.ACTION_DOWN) { 

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

     if(isInsideCircle(x, y) == true) { 
      //Do your things here 
      if(redColor == lastColor){ 
       Intent i = new Intent(v.getContext(), YouFailed.class); 
       v.getContext().startActivity(i); 
      } else { 
       addPoints++; 
      } 
      result = true; 
     } 
    } 

    return result; 
} 

Voir ce qui suit pour plus de détails: Input Events