2012-02-14 2 views
0

Je souhaite qu'une action soit effectuée lorsque la vue est touchée. Cependant, les touches ne répondent pas. L'application ne plante pas, elle semble juste l'ignorer.Android: OnTouch ne répond pas.

public class CustomDrawableView extends View implements OnTouchListener 
{ 
    static final int width = 100; 
    static final int height = 50; 

    public CustomDrawableView(Context context) 
    { 
     super(context); 
     setFocusable(true); 
     setOnTouchListener(mCustomDrawableView);    
     mDrawable = new ShapeDrawable(new OvalShape()); 
     mDrawable.getPaint().setColor(0xff74AC23); 
     mDrawable.setBounds(x, y, x + width, y + height); 
    } 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     if(event.getAction()==MotionEvent.ACTION_DOWN) 
     { 

     x = 400; 
     return true; 
     } 
     else { 
      x = 300; 
      return false; 
     } 
    } 

    protected void onDraw(Canvas canvas) 
    {  
     int mCanvasHeight = canvas.getHeight(); 
     int mCanvasWidth = canvas.getWidth(); 
     canvas.save(); 
     canvas.rotate(R,x,y); 


     if (y >= mCanvasHeight-100) { 
      y = 0; 
     } 
     RectF oval = new RectF(x, y, x + width, y 
       + height); // set bounds of rectangle 
     Paint p = new Paint(); // set some paint options 
     p.setColor(Color.BLUE); 
     canvas.drawOval(oval, p); 
     canvas.restore(); 

     invalidate(); 


    } 
} 

J'ai essayé un tas de code différent pour le réparer. Rien de tout cela ne fait rien sauf si je change setOnTouchListener (mCustomDrawable) en mCustomDrawableView.setOnTouchListener (this) l'application se bloque. Il y a beaucoup plus de code dans l'activité que je n'ai pas mis en place.

+0

Que dit logcat? – poitroae

Répondre

1

Je suppose que vous croyez que le onTouch() ne se déclenche pas parce que vous ne voyez pas vos graphiques changer en réponse aux changements dans x ou autre. Si c'est le cas, il semblerait que vous manquiez un appel à invalidate() dans votre gestionnaire de touches pour que le View se redessine à nouveau (via un appel à onDraw()).

En outre, vous avez un invalidate() lui-même réellement onDraw() lui-même qui ne devrait pas vraiment être là. Il faudrait certainement que votre View se redessine encore et encore - je suppose - donc en fait, je suppose que vous devrait voir voir des mises à jour parce que c'est là. Mais ce n'est pas la façon dont vous devriez animer un View; vous devriez plutôt utiliser un Thread ou Handler pour programmer un invalidate() régulier ou périodique - ou d'autres moyens de planifier régulièrement une mise à jour.

De même, il ne devrait pas être nécessaire d'implémenter 'OnTouchListener' lorsque vous pouvez simplement surcharger onTouch() comme vous l'avez fait. Il existe plusieurs façons de détecter les événements tactiles pour un View: (1) Remplacez onTouch() comme vous l'avez fait, pour obtenir des événements tactiles sur ce View. (2) Enregistrez un auditeur en utilisant setOnTouchListener(). Cette dernière option vous permet d'avoir un écouteur qui écoute les événements tactiles d'un View ou de plusieurs View s, et il voit également les événements tactiles avant qu'un View enregistré les voit.

Une autre chose que je vois est que vous définissez x à 400 lorsque vous obtenez un événement ACTION_DOWN mais que vous définissez à 300 pour tout autre type d'événement tel qu'un ACTION_MOVE. Considérant qu'il est en fait assez difficile de garder votre doigt assez fort pour ne jamais provoquer une série d'événements ACTION_MOVE immédiatement après un ACTION_DOWN, peut-être que vous ne voyez jamais les graphiques quand x est à 400 ou quelque chose.

Vous avez vraiment besoin de poster un exemple complet (par exemple, votre code tel que vous avez posté a setOnTouchListener(mCustomDrawableView)mCustomDrawableView n'a été défini nulle part) avec des erreurs spécifiques de Logcat. En outre, vous devez utiliser le débogueur pour voir si votre onTouch s'exécute (y coller un point d'arrêt).

En outre, vous devez accepter certaines réponses.