2011-02-08 17 views
9

तो, मैं जेस्चरऑवरलेव्यू और ऑनजेस्टर लिस्टनर का उपयोग करके उन्नत जेस्चर को पहचानने में सक्षम होना चाहता हूं और साथ ही जेस्चरडेक्टर का उपयोग करके डबल-टैप्स और लंबी प्रेस का पता लगाने में सक्षम होना चाहता हूं। मेरे पास दोनों अलग-अलग परियोजनाओं में अलग-अलग काम कर रहे हैं। हालांकि, मैं उन्हें गठबंधन करने की कोशिश कर रहा हूं और कुछ समस्याओं में भाग रहा हूं। ऐसा लगता है कि जब मैं डबल-टैप/लम्बी प्रेस का प्रयास करता हूं, तो यह पहचाना नहीं जा रहा है क्योंकि जेस्चरऑवरलेव्यू पूरी स्क्रीन को कवर कर रहा है और केवल जेस्चर बिल्डर में परिभाषित उन्नत संकेतों को पहचान लेगा। क्या किसी को पता है कि जेस्चरऑवरलेव्यू को कैसे सेट अप करें ताकि यह जेस्चरडेक्टर को अपना काम करने की अनुमति दे सके? मेरे कोड:जेस्चरऑवरले व्यू और डबल-टैप

public class HelloAndroid extends Activity implements OnGesturePerformedListener, OnDoubleTapListener, OnGestureListener { 
/** Called when the activity is first created. */ 
private GestureLibrary mLibrary; 
private GestureDetector detector; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    mLibrary = GestureLibraries.fromRawResource(this, R.raw.gestures); 
    if (!mLibrary.load()) { 
     finish(); 
    } 

    GestureOverlayView gestures = (GestureOverlayView) findViewById(R.id.gestures); 
    gestures.addOnGesturePerformedListener(this); 

    detector = new GestureDetector(this, this);\ 

और xml ...

<?xml version="1.0" encoding="utf-8"?> 

<android.gesture.GestureOverlayView xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/gestures" 
     android:layout_width="fill_parent" 
     android:visibility="invisible" 
     android:layout_height="fill_parent"> 
    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     > 
    <TextView 
     android:id="@+id/text1" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/hello" 
     /> 
    </LinearLayout>  
</android.gesture.GestureOverlayView> 

अग्रिम धन्यवाद!

उत्तर

3

मैंने यह किया, लेकिन यह सुनिश्चित नहीं है कि मेरा समाधान आपके लिए काम करेगा या नहीं। क्या आपको पूरी गतिविधि या केवल अपनी सूची में डबल टैप और लम्बाई का पता लगाने की आवश्यकता है?

मेरी प्रोजेक्ट में, मेरे पास जो कुछ है, निश्चित रूप से जेस्चरऑवरलेव्यू सब कुछ लपेट रहा है, लेकिन मेरा जेस्चर डिटेक्टर केवल उस कंटेनर पर असाइन किया गया था जिसे मैं उन घटनाओं को संभालना चाहता हूं, विशेष रूप से ग्रिड के साथ ग्रिड पर।

वास्तव में, मेरी इशारा डिटेक्टर एक View.OnTouchListener

public class TouchListener implements View.OnTouchListener { 

    Rect rect = new Rect(); 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     gestureDetector.onTouchEvent(event); 
     // We do not use the return value of 
     // mGestureDetector.onTouchEvent because we will not receive 
     // the "up" event if we return false for the "down" event. 
    // false is returned so children views can receive touch event too. 
     return false; 
} 

    private View getViewAt(int x, int y) { 
    // I need to know which thumbnail was selected 
    } 

    GestureDetector gestureDetector = new GestureDetector(new SimpleOnGestureListener() { 
     @Override 
     public void onLongPress(MotionEvent e) {…} 
     @Override 
     public boolean onSingleTapConfirmed(MotionEvent e) {…} 
     @Override 
     public boolean onDoubleTap(MotionEvent e) {...} 

}); 

}

तो मैं बस अपना ग्रिड को यह स्पर्श श्रोता आवंटित करने के लिए की जरूरत है अंदर है। आपके मामले में इसका उपयोग आपकी सूची में किया जा सकता है।

mGrid.setOnTouchListener(new TouchListener()); 

क्या होता है कि GesturOverlayView आंतरिक विचारों को स्पर्श घटनाओं का प्रचार होगा, जबकि एक इशारा नहीं पाया जाता है। समाधान टचलिस्टर बना रहा है, यह देखने के लिए कि आपको टच विधि पर श्रोता पर जेस्चरडिटेक्टर का उपयोग करके सरल संकेतों का पता लगाने की आवश्यकता है। उम्मीद है कि यह आपकी मदद कर सकता है।

+0

यह वास्तव में काम करता था। धन्यवाद ! –

0

यह समस्या आपकी गतिविधि के टचएवेंट (ईवेंट) पर विधि से आती है जिसे कॉल नहीं किया जाता है क्योंकि ईवेंट को जेस्चरऑवरले व्यू द्वारा अवरुद्ध किया जाता है।

यदि आप इस गतिविधि को अपनी गतिविधि में प्राप्त करना चाहते हैं तो आप प्रेषण टचएवेंट (ईवेंट) विधि को ओवरराइड करना चाहेंगे।

आपके मामले में, इस कोड को काम कर सकते हैं:

@Override 
public boolean dispatchTouchEvent(MotionEvent e) 
{ 
    detector.onTouchEvent(e); 

    return super.dispatchTouchEvent(e); 
} 
0

मैं एक ही समस्या हो रही थी।

जेस्चरऑवरले व्यू ऑन टचवेन्ट को रोक रहा है। तो बस

android:eventsInterceptionEnabled="false" 

परिणाम सेट कुछ इस तरह होना चाहिए:

<android.gesture.GestureOverlayView 
     android:id="@+id/gestures" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:eventsInterceptionEnabled="false" > 
0

मैं कुछ समस्या हो रही थी। मुझे एक समाधान मिला लेकिन मुझे नहीं पता कि यह क्यों काम करता है।

मैं dispathTouchEvent विधि का उपयोग करता हूं लेकिन मैं अपने GestureDetector उदाहरण के साथ टचएवेंट() पर कॉल करता हूं।

@Override 
public boolean dispatchTouchEvent(MotionEvent ev) 
{ 
    this.myGestureDetector.onTouchEvent(ev); 
    return super.dispatchTouchEvent(ev); 
} 
संबंधित मुद्दे