2015-12-07 8 views
8

मेरे पास क्षैतिज रूप से एकाधिक relativelayout विचारों के साथ एक स्क्रॉलव्यू है ... डेटाबेस में प्रत्येक रिकॉर्ड के लिए ... जो प्रोग्रामेटिक रूप से बनाए जाते हैं।निर्धारित करें कि एकाधिक दृश्यों में कौन से दृश्य में इशारा है (डबल क्लिक करें, बाएं स्वाइप करें, दाएं स्वाइप करें, आदि)?

मुझे यह निर्धारित करने की आवश्यकता है कि कुछ संकेतों से कौन सा दृश्य प्रभावित होता है ... क्लिक करें, डबलक्लिक करें, और बाएं/दाएं स्वाइप करें।

 RelativeLayout rlView = new RelativeLayout(this); 
    rlView.setId(10000+myrecordid); 
    rlView.setOnClickListener(myviewclick); 

और myviewclick:

बेशक क्लिक मैं साथ प्राप्त करने में सक्षम था

:

private View.OnClickListener myviewclick = new View.OnClickListener() { 
    public void onClick(View v) { 
     Integer i=v.getId()-10000; 
     // Do some processing on this view 
    } 
}; 

मैं ऑनलाइन क्या मिला से, मैं इशारा इस तरह से प्राप्त करने की कोशिश

rlView.setOnTouchListener(myviewtouch); 

इस कोड के साथ:

private View.OnTouchListener myviewtouch = new View.OnTouchListener(){ 
    public boolean onTouch(View v, MotionEvent event) { 
     return gestureDetector.onTouchEvent(event); 
    } 

    GestureDetector gestureDetector = new GestureDetector(new GestureDetector.SimpleOnGestureListener() { 
     @Override 
     public boolean onDoubleTap(MotionEvent e) { 
      Log.i("MYLOG","double tap"); 
      return true; 
     } 
     @Override 
     public boolean onSingleTapConfirmed(MotionEvent e) { 
      Log.i("MYLOG","SingleTapConfirmed"); 
      return true; 
     } 
     @Override 
     public void onLongPress(MotionEvent e) { 
      Log.i("MYLOG","LongPress"); 
     } 

     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
      if (e1.getX()<e2.getX()) 
       Log.i("MYLOG","Fling Right"); 
      else 
       Log.i("MYLOG","Fling Left"); 
      return true; 
     } 
    }); 
}; 

MYLOG के मुताबिक, मुझे जरूरी उचित इशारा मिल रहा है। समस्या यह है कि, मुझे नहीं पता कि इशारा आईडी आईडी कैसे प्राप्त करें। मुझे पता है कि यह onTouch में है, लेकिन इसे गति निर्धारित करने के लिए gestureDetector.OnTouchEvent कहा जाता है ... और मैं इस बिंदु पर खो गया हूं।

मैंने सभी स्टैक ओवरफ्लो और कई साइटों के लिए कई घंटों की खोज की ... वे सभी इशारा कैसे निर्धारित करें इस पर भिन्नता दिखाते हैं ... लेकिन कई विचारों के साथ उपयोग करने में मुझे परेशानी हो रही है।

किसी भी मदद की सराहना की जाएगी।

+0

मैं संदर्भ के बारे में बताता हूं कि मैं [इस प्रश्न] में बक्षीस क्यों जोड़ रहा हूं (https://stackoverflow.com/questions/45070129/detecting-common-gestures-on-multiple-views-in-android)। – Suragch

उत्तर

5

मुझे लगता है कि मैंने इसे समझ लिया। शायद इसे करने का सबसे शानदार तरीका नहीं है, और इस तरह से इसे संभालने के कारण अन्य "मुद्दे" हो सकते हैं, लेकिन अभी यह काम करता है। लेकिन अगर दूसरों को यह समस्या मिलती है, तो यहां मैंने इसके आसपास काम किया है:

यहां बताया गया है कि मेरा संशोधित कोड कैसे काम करता है। मैं एक सार्वजनिक चर कहा vTouch कहा:

private View.OnTouchListener myviewtouch = new View.OnTouchListener(){ 
    public View vTouch; 
    public boolean onTouch(View v, MotionEvent event) { 
     vTouch=v; 
     return gestureDetector.onTouchEvent(event); 
    } 

    GestureDetector gestureDetector = new GestureDetector(new GestureDetector.SimpleOnGestureListener() { 
     @Override 
     public boolean onDoubleTap(MotionEvent e) { 
      Integer viewId=vTouch.getId(); 
      Log.i("MYLOG","double tap in view: "+viewId); 
      return true; 
     } 
     @Override 
     public boolean onSingleTapConfirmed(MotionEvent e) { 
      Integer viewId=vTouch.getId(); 
      Log.i("MYLOG","SingleTapConfirmed in view: "+viewId); 
      return true; 
     } 
     @Override 
     public void onLongPress(MotionEvent e) { 
      Integer viewId=vTouch.getId(); 
      Log.i("MYLOG","LongPress in view: "+viewId); 
     } 

     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
      Integer viewId=vTouch.getId(); 
      if (e1.getX()<e2.getX()) 
       Log.i("MYLOG","Fling Right in view: "+viewId); 
      else 
       Log.i("MYLOG","Fling Left in view: "+viewId); 
      return true; 
     } 
    }); 
}; 

आंतरिक सार्वजनिक चर vTouch का उपयोग कर मैं अब प्रत्येक इशारा घटना जहां कभी "दृश्य" की जरूरत है कि इशारा में हुआ भीतर दृश्य संदर्भित कर सकते हैं तक

+0

इसके लिए धन्यवाद। यह विश्वास करना मुश्किल है कि एंड्रॉइड में स्वाइप का पता लगाना मुश्किल हो सकता है! – Fattie

+0

['जेस्चरडेटेक्टर (जेस्चरडेटेक्टर.ऑनजेस्टर लिस्टनर श्रोता) ': इस कन्स्ट्रक्टर को एपीआई लेवल 3 में बहिष्कृत किया गया था। इसके बजाय' जेस्चर डिटेक्टर (android.content.Context, android.view.GestureDetector.OnGestureListener) 'का उपयोग करें।] (Https: // developer। android.com/reference/android/view/GestureDetector.html#GestureDetector(android.view.GestureDetector.OnGestureListener)) – Suragch

+0

कई विचारों पर इसका परीक्षण करना, 'ऑन लोंगप्रेस' प्रत्येक ईवेंट (रोक के बाद) के लिए फायरिंग कर रहा था। [इस सवाल] के समान (https://stackoverflow.com/q/24326530/3681880)। मुझे 'ऑन ड्रा' ओवरराइड करने और सबकुछ काम करने के लिए 'सत्य' वापस करने की आवश्यकता थी। – Suragch

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