2011-06-30 7 views
1

J'ai un ViewFlipper qui contient un seul ImageView. Je veux être capable de balayer pour changer l'image/vue, et cliquez sur l'image pour jouer un son.OnClick ImageView avec OnFling ViewFlipper

J'ai un GestureDetector qui gère OnFling pour changer la vue. J'ai essayé de mettre un onClickListener à l'imageview, qui a fonctionné mais a arrêté le fonctionnement d'OnFling.

Enfin, j'ai ajouté un onSingleTapConfirmed à mon GestureDetector. Cela a fonctionné, mais il enregistre un clic n'importe où dans l'activité et pas seulement dans ImageView.

Quelqu'un peut-il suggérer comment restreindre l'onSingleTapConfirmé pour qu'il fonctionne sur l'Imageview?

Voici mon code à ce jour:

class MyGestureDetector extends SimpleOnGestureListener { 
    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
     try { 
      if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) 
       return false; 
      // right to left swipe 
      if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
       Log.v("Swipe", "Right to Left"); 

       viewFlipper.setInAnimation(slideLeftIn); 
       viewFlipper.setOutAnimation(slideLeftOut); 
       viewFlipper.addView(nextImage(true)); 

       viewFlipper.showNext(); 

      } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
       Log.v("Swipe", "Left to Right"); 

       viewFlipper.setInAnimation(slideRightIn); 
       viewFlipper.setOutAnimation(slideRightOut); 
       viewFlipper.addView(nextImage(false)); 
       viewFlipper.showNext(); 
      } 
     } catch (Exception e) { 
      // nothing 
     } 
     return false; 
    } 

    @Override 
    public boolean onSingleTapConfirmed(MotionEvent e) 
    { 
     // TODO Auto-generated method stub 

     Log.v("SingleTap", "OnSingleTapConfirmed Run"); 

     return super.onSingleTapConfirmed(e); 

    }  

} 

private View nextImage(boolean righttoleft) { 
    ImageView imgv1 = new ImageView(this); 

    if(righttoleft == true) 
    { 

      Uri image = Uri.parse("android.resource://com.owentech.brainybaby/drawable/" + variables.letters[variables.currentpos]); 
      imgv1.setImageURI(image); 
      imgv1.setScaleType(ImageView.ScaleType.CENTER_INSIDE); 

    return imgv1; 
} 

Répondre

3

j'avais rencontré ce problème dans le passé. Peut-être que vous pouvez essayer de mettre en œuvre un seul tap en définissant un OnTouchListener à ViewFlipper, ainsi, ViewFlipper sera le seul récepteur d'événements tactiles. Ensuite, écrivez le code son en lecture dans la fonction onTouch. Enfin, définissez la valeur de retour de la fonction onTouch sur false pour préserver le fonctionnement de onFling.

viewFlipper.setOnTouchListener(new OnTouchListener() 
{ 
     @Override 
     public boolean onTouch(View view, MotionEvent e) { 
      // TODO Auto-generated method stub 
      switch(e.getActionMasked()) 
      { 
      case MotionEvent.ACTION_DOWN: 
        //put the playing sound code here. 
        break; 
      } 
      return false; //means that the listener dosen't consume the event 
     } 
} 
); 

C'est juste une solution simple pour résoudre ce problème. Si vous souhaitez obtenir une fonction plus compliquée, par exemple en évitant de jouer du son lorsque le doigt balaye l'écran pour modifier la vue, vous devez faire plus d'efforts pour distinguer les gestes, par ex. calculer l'intervalle entre l'événement ACTION_DOWN et l'événement ACTION_UP et lire le son s'il est inférieur à 300 ms.

J'espère que cela vous sera utile. :)

+0

Merci ... fonctionne comme vous l'avez dit – Tony

+0

Géré pour faire la distinction entre clic et lancer en mesurant la distance entre ACTION_DOWN et ACTION_UP ... merci encore pour votre aide. – Tony

+0

Vous êtes les bienvenus :) – Chickenrice