2012-11-12 15 views
29

सीमा से बाहर स्वाइप करने का प्रयास कर रहा है, मैं कुछ डेटा प्रदर्शित करने के लिए 6 पेजों वाले व्यूपेजर का उपयोग कर रहा हूं। मैं एक विधि को कॉल करने में सक्षम होना चाहता हूं जब उपयोगकर्ता 0 स्थिति पर होता है और दाएं (पीछे की तरफ) या स्थिति 5 पर स्वाइप करने की कोशिश करता है और बाएं (आगे) पर स्वाइप करने का प्रयास करता है, भले ही इनके लिए कोई और पृष्ठ मौजूद न हो दिशाओं। क्या इन परिदृश्यों के लिए मैं कोई तरीका सुन सकता हूं?व्यूपार्जर पता लगाता है कि उपयोगकर्ता

+0

हाय सब, मैं कोड का इस्तेमाल किया है, लेकिन onSwipeOutLister विधि मेरी गतिविधि में नहीं बुलाया जाता है, भले ही मैं विधि कॉल: इस कोड मैं यह काम, दोनों onSwipeOutAtStart और onSwipeOutAtEnd साथ बनाने के लिए प्रयोग किया जाता है। कृपया मेरा प्रश्न पोस्ट करें http://stackoverflow.com/questions/25889115/android-viewpager-detect-swipe-beyond-the-bounds –

उत्तर

43

ViewPager बढ़ाएँ और onInterceptTouchEvent() इस तरह ओवरराइड:

public class CustomViewPager extends ViewPager { 

    float mStartDragX; 
    OnSwipeOutListener mListener; 


    public void setOnSwipeOutListener(OnSwipeOutListener listener) { 
     mListener = listener; 
    } 


    @Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) { 
     float x = ev.getX(); 
     switch (ev.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      mStartDragX = x; 
      break; 
     case MotionEvent.ACTION_MOVE: 
      if (mStartDragX < x && getCurrentItem() == 0) { 
       mListener.onSwipeOutAtStart(); 
      } else if (mStartDragX > x && getCurrentItem() == getAdapter().getCount() - 1) { 
       mListener.onSwipeOutAtEnd(); 
      } 
      break; 
     } 
     return super.onInterceptTouchEvent(ev); 
    } 

    public interface OnSwipeOutListener { 
     public void onSwipeOutAtStart(); 
     public void onSwipeOutAtEnd(); 
    } 

} 
+0

मैंने कस्टमव्यूपेजर नामक एक क्लास बनाई है और उपर्युक्त विधि लागू की है। अगर किसी कथन की शर्तों को पूरा किया जाता है तो मैं अपनी गतिविधि के साथ कैसे संवाद कर सकता हूं? क्या ViewPager ऑब्जेक्ट का उपयोग करके मेरी गतिविधि में श्रोता या कुछ स्थापित करने का कोई तरीका है? – Nicklas

+0

मैंने अपना जवाब अपडेट किया। आपको बस अपनी गतिविधि में 'setOnSwipeOutListener()' को कॉल करने की आवश्यकता है। मैंने यह कोड नहीं चलाया, इसलिए इसे कुछ समायोजन करने की आवश्यकता हो सकती है। –

+0

बहुत बहुत धन्यवाद। – Nicklas

14

कैसे अपने ViewPager पर एक OnPageChangeListener स्थापना के बारे में? फिर आप अपने नेविगेशन तीर या ऑन पेज पर स्क्रॉल किए गए संशोधित कर सकते हैं।

viewPager.setOnPageChangeListener(new OnPageChangeListener() { 
    @Override 
    public void onPageSelected(int position) { 
    } 

    @Override 
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 
      updateNavigationArrows(); 
    } 

    @Override 
    public void onPageScrollStateChanged(int state) { 
    } 
}); 
+4

कहा जाता है विधि 'setOnPageChangeListener() 'को नए एसडीके में बहिष्कृत किया गया है और इसे' addOnPageChangeListener() 'के साथ बदल दिया गया है। – Leukipp

15

फ्लैवियो फरिया का उत्तर मेरे लिए काम नहीं करता है। IterceptTouchEvent() पर मिलने वाली एकमात्र घटना ACTION_DOWN घटना है। तो मैं इसे काम करने के लिए onTouchEvent() विधि को ओवरराइड करता हूं।

यहां कोड है। ध्यान दें कि मेरे पास श्रोता में केवल SwipeOutAtEnd() है। आप पहले कोड पर बाएं स्वाइपिंग का समर्थन करने के लिए अपना कोड जोड़ सकते हैं।

public class CustomViewPager extends ViewPager { 

float mStartDragX; 
OnSwipeOutListener mListener; 


public void setOnSwipeOutListener(OnSwipeOutListener listener) { 
    mListener = listener; 
} 

@Override 
public boolean onTouchEvent(MotionEvent ev){ 
    if(getCurrentItem()==getAdapter().getCount()-1){ 
     final int action = ev.getAction(); 
     float x = ev.getX(); 
     switch(action & MotionEventCompat.ACTION_MASK){ 
     case MotionEvent.ACTION_DOWN: 
      mStartDragX = x; 
      break; 
     case MotionEvent.ACTION_MOVE: 
      break; 
     case MotionEvent.ACTION_UP: 
      if (x<mStartDragX){ 
       mListener.onSwipeOutAtEnd(); 
      }else{ 
       mStartDragX = 0; 
      } 
      break; 
     } 
    }else{ 
     mStartDragX=0; 
    } 
    return super.onTouchEvent(ev); 
}  
public interface OnSwipeOutListener { 
    public void onSwipeOutAtEnd(); 
} 
+0

धन्यवाद आप यह भी मेरे लिए काम किया है! –

+0

यदि आप उस विधि से 'सत्य' वापस करते हैं तो आपको'InterterTouchEvent() 'में केवल 'ACTION_DOWN' प्राप्त होगा। –

+0

हाय सब, मैंने कोड का उपयोग किया है, लेकिन अगर मैं विधि को कॉल करता हूं तो भी मेरी गतिविधि में ऑनस्वाइपऑललिस्टर विधि नहीं कहा जाता है। कृपया मेरा प्रश्न पोस्ट करें http://stackoverflow.com/questions/25889115/android-viewpager-detect-swipe-beyond-the-bounds –

3

मुझे आश्चर्य है कि यह दूसरों के लिए कैसे काम करता है, यह मेरे लिए काम नहीं कर रहा है।

onInterceptTouchEvent() केवल ACTION_DOWN ईवेंट लेता है। जबकि onTouchEvent() केवल एक समय में ACTION_DOWN, ACTION_UP और अन्य में एक ईवेंट लेता है।

मुझे इसे ठीक से काम करने के लिए onInterceptTouchEvent() और onTouchEvent() दोनों को ओवरराइड करना पड़ा। ACTION_DOWNonInterceptTouchEvent प्रारंभिक X स्पर्श बिंदु, और OnTouchEvent अंतिम X2 बिंदु पकड़ लेता है। स्वाइप दिशा का पता लगाने के लिए मैंने इसकी तुलना की।

स्पर्श की प्रारंभिक एक्स मूल्य प्राप्त करें:

float x1 = 0; 
@Override 
public boolean onInterceptTouchEvent(MotionEvent ev) { 
     switch(ev.getAction() & MotionEventCompat.ACTION_MASK){ 
     case MotionEvent.ACTION_DOWN: 
      x1 = ev.getX(); 
      break; 
     } 
     return super.onInterceptTouchEvent(ev); 
    } 

tjlian616 के कोड से, onTouchEvent()ACTION_UP को सुनता है और यह पिछले X मूल्य है हो जाता है। जबकि मैंने प्रारंभिक श्रोता पर स्वाइप करने के लिए अपना वर्तमान आइटम का मान 0 होना निर्धारित किया है। इसकी तुलना की और श्रोता को निकाल दिया।

@Override 
public boolean onTouchEvent(MotionEvent ev){ 
     if(getCurrentItem()==0){ 
      final int action = ev.getAction(); 
      switch(action & MotionEventCompat.ACTION_MASK){ 
      case MotionEvent.ACTION_MOVE: 
       break; 
      case MotionEvent.ACTION_UP: 
       mStartDragX = ev.getX(); 
       if (x1<mStartDragX){ 
        Log.i("TOUCH: ", "ACTION UP " + x1 + " : " + mStartDragX); 
        mListener.onSwipeOutAtStart(); 
       }else{ 
        Log.i("TOUCH ELSE : ", "ACTION UP " + x1 + " : " + mStartDragX); 
        mStartDragX = 0; 
       } 
       break; 
      } 
     }else{ 
      mStartDragX=0; 
     } 
     return super.onTouchEvent(ev); 
    }  
14

धन्यवाद @Flavio के लिए बहुत कुछ है, हालांकि मैं क्योंकि कॉलबैक तरीकों दो बार फायरिंग कर रहे थे उसकी कोड के लिए कुछ परिवर्तन करना ही था, यह भी मैं कोड की जाँच करने के लिए जोड़ा अगर कोई पंजीकृत श्रोता था, दुर्घटनाग्रस्त एप्लिकेशन से बचने के लिए जब पंजीकृत कोई श्रोता नहीं है।

public class CustomViewPager extends android.support.v4.view.ViewPager { 

    float mStartDragX; 
    OnSwipeOutListener mOnSwipeOutListener; 

    public CustomViewPager(Context context) { 
     super(context); 
    } 

    public CustomViewPager(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public void setOnSwipeOutListener(OnSwipeOutListener listener) { 
     mOnSwipeOutListener = listener; 
    } 

    private void onSwipeOutAtStart() { 
     if (mOnSwipeOutListener!=null) { 
      mOnSwipeOutListener.onSwipeOutAtStart(); 
     } 
    } 

    private void onSwipeOutAtEnd() { 
     if (mOnSwipeOutListener!=null) { 
      mOnSwipeOutListener.onSwipeOutAtEnd(); 
     } 
    } 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) { 
     switch(ev.getAction() & MotionEventCompat.ACTION_MASK){ 
      case MotionEvent.ACTION_DOWN: 
       mStartDragX = ev.getX(); 
       break; 
     } 
     return super.onInterceptTouchEvent(ev); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent ev){ 

     if(getCurrentItem()==0 || getCurrentItem()==getAdapter().getCount()-1){ 
      final int action = ev.getAction(); 
      float x = ev.getX(); 
      switch(action & MotionEventCompat.ACTION_MASK){ 
       case MotionEvent.ACTION_MOVE: 
        break; 
       case MotionEvent.ACTION_UP: 
        if (getCurrentItem()==0 && x>mStartDragX) { 
         onSwipeOutAtStart(); 
        } 
        if (getCurrentItem()==getAdapter().getCount()-1 && x<mStartDragX){ 
         onSwipeOutAtEnd(); 
        } 
        break; 
      } 
     }else{ 
      mStartDragX=0; 
     } 
     return super.onTouchEvent(ev); 

    } 

    public interface OnSwipeOutListener { 
     void onSwipeOutAtStart(); 
     void onSwipeOutAtEnd(); 
    } 
} 
+2

एक इलाज करता है (प्रत्येक स्वाइप के लिए केवल एक कॉलबैक के साथ!)। बीटीडब्लू, आप अपनी गतिविधि को 'कस्टमव्यूपेजर लागू कर सकते हैं। ओनस्वाइपऑट लिस्टनर' और अपनी गतिविधि में भी, अपने कस्टम व्यूपेजर ऑब्जेक्ट पर 'myCustomViewPager.setOnSwipeOutListener (this);' को कॉल करना न भूलें। –

+0

@spacebiker यह मेरे लिए काम किया :) – NarendraJi

+0

@DroidWormNarendra, जानना अच्छा है;) – spacebiker

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