2009-12-15 13 views
11

मेरे ऐप में मैं एक दृश्य पर एक फ़्लिंग इवेंट कैप्चर करने का प्रयास करता हूं (ScrollView सटीक होने के लिए, लेकिन LinearLayout के साथ भी प्रयास किया गया)।एंड्रॉइड: फ़्लिंग जेस्चर का पता लगाना

ब्रेकपॉइंट्स सेट करके मैं देख सकता हूं कि MotionEvents उस बिंदु तक सही ढंग से होता है जहां onFling() आग लगनी चाहिए।

घटना प्रवाह इस प्रकार है:

  1. देखने के onTouchEvent
  2. OnGestureListener's onDown
  3. OnGestureListener's onShowPress
  4. OnGestureListener's onLongPress

मैं पर कैसे करने के लिए एक नुकसान में हूँ ऐसा कुछ डीबग करने की कोशिश पर जाएं और Google खोज चालू नहीं होती है बहुत ज्यादा कोई संकेतक?

import android.content.Context; 
import android.content.Intent; 
import android.view.GestureDetector; 
import android.view.MotionEvent; 
import android.widget.ScrollView; 

public class GestureScrollView extends ScrollView { 
    private static int MAJOR_MOVE = 60; 
    private GestureDetector gd; 

    public GestureScrollView(final Context context) { 
     super(context); 
     gd = new GestureDetector(context, 
       new GestureDetector.OnGestureListener() { 

        @Override 
        public boolean onSingleTapUp(MotionEvent e) { 
         // TODO Auto-generated method stub 
         return false; 
        } 

        @Override 
        public void onShowPress(MotionEvent e) { 
         // TODO Auto-generated method stub 

        } 

        @Override 
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, 
          float distanceY) { 
         // TODO Auto-generated method stub 
         return false; 
        } 

        @Override 
        public void onLongPress(MotionEvent e) { 
         // TODO Auto-generated method stub 

        } 

        @Override 
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
          float velocityY) { 
         int dx = (int) (e2.getX() - e1.getX()); 
         if (Math.abs(dx) > MAJOR_MOVE 
           && Math.abs(velocityX) > Math.abs(velocityY)) { 
          if (velocityX < 0) { 
           Intent intent = new Intent(context, Main.class); 
           context.startActivity(intent); 
          } 
         } 
         return false; 
        } 

        @Override 
        public boolean onDown(MotionEvent e) { 
         // TODO Auto-generated method stub 
         return false; 
        } 
       }); 
    } 

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

उत्तर

2

अपने दृश्य से नहीं की गतिविधि से MotionEvent लें:

मैं भी आंकड़े देख सकते हैं कि इशारों संभाल चाहिए देते हैं। जब आपका इशारा डिटेक्टर मोशनवेन्ट पर आधारित होता है जो गतिविधि से आता है तो आपको ऑनफ्लिंग ईवेंट मिल जाएगा। तो आपको अपने GestureScrollView से अपनी गतिविधि कक्षा में टचएवेंट() पर जाना होगा। सम्मान!

+2

उत्तर देने के लिए समय निकालने के लिए धन्यवाद। असल में यह उससे कहीं अधिक जटिल था। एंड्रॉइड का इवेंट बबलिंग तंत्र थोड़ा अजीब है। यह क्या हल के लिए मुझे onTouchEvent हो रही थी() हमेशा इतनी तरह सच लौटने के लिए: @Override सार्वजनिक बूलियन onTouchEvent (MotionEvent घटना) { gd.onTouchEvent (घटना); सच वापसी; } और एक अतिरिक्त पद्धति जोड़ें: @Override सार्वजनिक बूलियन onInterceptTouchEvent (MotionEvent EV) { \t वापसी gd.onTouchEvent (EV); } सम्मान। – javito

+0

@javito क्या आप सही उत्तर को उत्तर के रूप में पोस्ट नहीं कर सकते हैं - कृपया एक मुश्किल मामला जो अच्छी तरह से प्रलेखित नहीं है – Elemental

+0

@javito +1 अपने प्रश्न पर यह पता लगाने के लिए। इससे मुझे अपने स्क्रॉल व्यू से भी घटनाओं को चुरा लेने में मदद मिली –

संबंधित मुद्दे