2011-03-15 18 views
10

का पता नहीं लगा रहा है, मैं स्क्रीन के एक ब्लॉक में फ़्लिंग गति का पता लगाना चाहता हूं। मैं इसके लिए निम्नलिखित कोड का उपयोग कर रहा हूँ।एंड्रॉइड ऑनगेशर लिस्टनर फ़्लिंग

public class MyinfoActivity extends Activity implements OnGestureListener { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     .......... 
     .......... 
     gestureScanner = new GestureDetector(this); 
     resBlock = (TableRow) findViewById(R.id.ResBlock); 
     gestureScanner = new GestureDetector(this); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent me){ 
     Log.d(null,"Touch"); 
     if (gestureScanner.onTouchEvent(me)) 
      return gestureScanner.onTouchEvent(me); 
     else 
      return false; 
    } 

    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, 
         float velocityX, float velocityY) { 
     Log.d(null,"Fling"); 
     ............ 
     ............ 
    } 

    @Override 
    public boolean onDown(MotionEvent arg0) { 
     return false; 
    } 

    @Override 
    public void onLongPress(MotionEvent e) {} 

    @Override 
    public boolean onScroll(MotionEvent e1, MotionEvent e2, 
         float distanceX, float distanceY) { 
     return false; 
    } 

    @Override 
    public void onShowPress(MotionEvent e) {} 

    @Override 
    public boolean onSingleTapUp(MotionEvent e) { 
     return false; 
    } 
} 

यह टचवेन्ट का पता लगा रहा है, लेकिन यह किसी भी फ़्लिंग गति का पता नहीं लगा रहा है। मेरे कोड में समस्या क्या है?

उत्तर

14

मैं इस्तेमाल किया निम्नलिखित

@Override 
    public boolean onTouchEvent(MotionEvent me){ 
     Log.d(null,"Touch"); 
     if (gestureScanner.onTouchEvent(me)) 
      return true; 
     else 
      return super.onTouchEvent(event); // or false (it's what you whant). 
    } 

आप भी इस लाइन में दो बार है कोड और इस मुद्दे को हल किया।

public class MyinfoActivity extends Activity { 
    private GestureDetector gestureScanner; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.myinfotrackerinner); 
     gestureScanner = new GestureDetector(this,simpleOnGestureListener); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     return gestureScanner.onTouchEvent(event); 
    } 

    GestureDetector.SimpleOnGestureListener simpleOnGestureListener = 
         new GestureDetector.SimpleOnGestureListener() { 
     @Override 
     public boolean onDown(MotionEvent event) { 
      return true; 
     } 

     @Override 
     public boolean onFling(MotionEvent event1, MotionEvent event2, 
            float velocityX, float velocityY) { 
      Log.d(null,"Fling"); 
      int dx = (int) (event2.getX() - event1.getX()); 
      // don't accept the fling if it's too short 
      // as it may conflict with a button push 
      if (Math.abs(dx) > MAJOR_MOVE 
         && Math.abs(velocityX) > Math.abs(velocityY)) { 
       if (velocityX > 0) { 
        moveGraph("L"); 
       } else { 
        moveGraph("R"); 
       } 
       return true; 
      } else { 
       return false; 
      } 
     } 
    }; 
} 
+8

धन्यवाद। इस पोस्ट ने मुझे बहुत मदद की। यहां कुंजी 'ऑनडाउन (मोशनवेन्ट)' विधि में 'सत्य' वापस करने के लिए है! – garbagecollector

+1

और MAJOR_MOVE के पास क्या मूल्य होगा? ;) –

3

सबसे पहले आपके ऑन टचवेन्ट विधि गलत है और gestureScanner ऑब्जेक्ट द्वारा टचएवेंट पर 2 कॉल का कारण बन जाएगा। आप इस से बदलने की जरूरत है:

gestureScanner = new GestureDetector(this); 

तो इस तरह से अपनी onFling विधि बदलने की कोशिश:

@Override 
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) { 
    try{ 
     if(Math.abs(e1.getY()-e2.getY()) > 250) 
      return false;    
     if(e1.getX() - e2.getX() > 120 && Math.abs(velocityX) > 200){ 
      Log.d("Fling", "Move Next"); 
      //do something... 
     } 
     else if(e2.getX() - e1.getX() > 120 && Math.abs(velocityX) > 200){ 
      Log.d("Fling", "Move Previous"); 
      //do something... 
     } 
     return false; 
    } 
    catch(Exception e){ 
     return false; 
    } 
} 
+0

मैं प्रति दिशा और भी onFling पद्धति के रूप में onTouchEvent के कोड को बदलने के द्वारा की कोशिश की है। लेकिन परिणाम में कोई बदलाव नहीं है। यह अभी भी टच इवेंट का पता लगा रहा है, लेकिन कोई घटना नहीं है। –

3

वापसी true अपने onDown विधि में

@Override 
public boolean onDown(MotionEvent arg0) { 
    return true; 
} 
संबंधित मुद्दे