2011-04-22 6 views
5

J'essaie de détecter un événement onFling pour un objet TextView. Le code ci-dessous fonctionne parfaitement pour l'événement onDown, mais il n'obtient pas les événements onScroll ou onFling. Des pointeurs?onFling pour un TextView ne fonctionne pas

Merci

package rob.testapp; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.GestureDetector; 
import android.view.GestureDetector.SimpleOnGestureListener; 
import android.view.MotionEvent; 
import android.view.View; 
import android.widget.TextView; 

public class MainActivity extends Activity 
{ 
    private GestureDetector myGestDetector; 
    private TextView mainTextView; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     myGestDetector = new GestureDetector(this, new SimpleOnGestureListener() 
     { 
      @Override 
      public boolean onScroll(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) 
      { 
       mainTextView.setText("just scroll'n"); 
       return false; 
      } 

      @Override 
      public boolean onDown(MotionEvent e1) 
      { 
       mainTextView.setText("on down"); 
       return false; 
      } 

      @Override 
      public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) 
      { 
       mainTextView.setText("on fling"); 
       return false; 
      } 
     }); 

     mainTextView = (TextView)findViewById(R.id.MainText); 
     mainTextView.setText("Starting app..."); 
     mainTextView.setOnTouchListener(new View.OnTouchListener() 
     { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) 
      { 
       myGestDetector.onTouchEvent(event); 
       return false; 
      } 
     }); 
    } 
} 

La mise en page est juste un TextView dans un LinearLayout.

+0

est-ce dans l'émulateur? –

Répondre

3
public boolean onTouch(View v, MotionEvent event) 
    { 
     myGestDetector.onTouchEvent(event); 
     return false; 
    } 

Je pense que vous devriez retourner vrai ici. Vous voyez rejeter l'événement pointeur vers le bas en renvoyant false et ne recevez aucun événement suivant à cause de cela.

+0

En fait, je viens d'essayer ce qui suit, qui est plus ou moins ce que vous dites: 'OnTouch public boolean (Voir v, événement MotionEvent) \t \t \t { \t \t \t \t myGestDetector.onTouchEvent retour (événement); \t \t \t} 'Comment s'appelle-t-on? Pouvez-vous me montrer quelques références? Merci beaucoup! – Sandy

+0

http://developer.android.com/reference/android/view/View.OnTouchListener.html 'Renvoie True si l'écouteur a consommé l'événement, false sinon. ' –

+0

Maintenant, j'ai le problème que onDown et onFling sont à la fois appelé le même "événement" (d'un point de vue humain). Je veux que l'onDown définisse un texte aléatoire à partir d'un tableau, et que l'on lance pour définir le texte suivant (ce code n'est pas présent dans l'extrait ci-dessus). Comment puis-je obtenir juste le onDown ou juste le onFling ??? – Sandy

0

Mais dans mon cas cela fonctionne. Je renvoie true dans innerclass de textView mais je renvoie false à partir de mon TouchEvent.

public class FingureGesture extends Activity implements OnGestureListener,OnDoubleTapListener{ 
    GestureDetector detector; 
    File sdcard = Environment.getExternalStorageDirectory(); 
    TextView textView; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.fingure_gesture); 

     detector = new GestureDetector(this,this); 
     textView = (TextView) findViewById(R.id.editText1); 
     textView.setOnTouchListener(new OnTouchListener() { 

      public boolean onTouch(View v, MotionEvent event) { 
       Log.i("OnTouch", "Im here "); 
        detector.onTouchEvent(event); 
       return false; 
      } 
     });  
    }//end of onCreate 

    public boolean onDown(MotionEvent e) { 
     Log.i("onDown ", "x:: "+e.getX()+"\ny:: "+e.getY()); 
     return false; 
    } 

    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
      float velocityY) { 
     return false; 
    } 


    public boolean onTouchEvent(MotionEvent me){ 

     Log.i(" onTouchEvent", me.toString()); 
     this.detector.onTouchEvent(me); 
//  return super.onTouchEvent(me); 
     return true; 
    } 
    public void onLongPress(MotionEvent e) { 
     Log.i(" onLongPress", e.toString()); 

    } 

    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, 
      float distanceY) { 
     Log.i("On Scroll ","\n#e1 :: "+ e1.getX()+"\n#Histo e1.x"+"\n#e2 :: "+e2.getX()); 
     return false; 
    } 

    public void onShowPress(MotionEvent e) { 
     Log.i(" onShowPress", e.toString()); 

    } 

    public boolean onSingleTapUp(MotionEvent e) { 
     Log.i("onSingleTapUp ", e.toString()); 
     return false; 
    } 

    public boolean onDoubleTap(MotionEvent e) { 
     Log.i(" onDoubleTap", e.toString()); 
     return false; 
    } 

    public boolean onDoubleTapEvent(MotionEvent e) { 
     Log.i(" onDoubleTapEvent", e.toString()); 
     return false; 
    } 

    public boolean onSingleTapConfirmed(MotionEvent e) { 
     Log.i(" onSingleTapConfirmed", e.toString()); 
     return false; 
    } 
Questions connexes