10

में स्क्रॉल पर दृश्य संकेत का संकेत, मैं कुछ दृश्य संकेत जोड़ने की कोशिश कर रहा हूं, कि ViewPager में वांछित फ़्लिंग दिशा में कोई और पृष्ठ नहीं हैं। हालांकि मैं एक जगह खोजने के लिए संघर्ष कर रहा हूं, जहां प्रासंगिक कोड डालना है।एंड्रॉइड

मैंने निम्नलिखित कोड के साथ व्यूपेजर क्लास को विस्तारित करने का प्रयास किया है, लेकिन टोस्ट प्रदर्शित नहीं हो रहा है (ev.getOrientation() हमेशा 0 देता है)। मैंने इतिहास बिंदुओं के साथ भी कोशिश की है, लेकिन ev.getHistorySize() भी 0 देता है 0.

मुझे क्या याद आ रही है?

कक्षा उदाहरण:

public class CustomViewPager extends ViewPager { 

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

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

    /** 
    * @see android.support.v4.view.ViewPager#onTouchEvent(android.view.MotionEvent) 
    */ 
    @Override 
    public boolean onTouchEvent(MotionEvent ev) { 
     boolean result = super.onTouchEvent(ev); 

     switch (ev.getAction() & MotionEventCompat.ACTION_MASK) { 
      case MotionEvent.ACTION_MOVE: 
       if (ev.getOrientation() > 0) { 
        Toast.makeText(getContext(), "left", 0).show(); 
       } 
     } 

     return result; 
    } 
} 

उत्तर

-1

ViewPager साथ आमतौर पर, एक एक PagerAdapter ऐसे FragmentPagerAdapter के रूप में या FragmentStatePagerAdapter का उपयोग करता है सामग्री के साथ ViewPager बाढ़ (अपनी सामग्री विचारों होने जा रहे हैं)।

अब, जब आप PagerAdapter का उपयोग करते हैं, तो आपके पास getCount(), http://developer.android.com/reference/android/support/v4/view/PagerAdapter.html#getCount%28%29 नामक एक विधि है, जो आपको सामग्री का आकार देगी।

चूंकि अब आप जानते हैं कि आकार आसानी से एक संदेश कथन के साथ एक संदेश प्रदर्शित कर सकते हैं। http://developer.android.com/reference/android/support/v4/view/ViewPager.html

नोट::

इस कोड का प्रयास करें मुझे लगता है कि आप एक कस्टम ViewPager आवश्यकता नहीं है। आपको ViewPager के लिए Fragments को समझने की भी आवश्यकता होगी। ApiDemos में नमूने देखें। यह एक महान स्रोत है।

+0

कि नहीं था क्या उसने पूछा। वह विशेष रूप से जानना चाहता था कि आईओएस पर रबर बैंड जैसे overscroll-effect कैसे करें, जो कम से कम आईसीएस तक ViewPager में गायब है। –

1

आपके पास बहुत सारे विकल्प हैं, आप टोस्ट दिखा सकते हैं, एक संवाद प्रदर्शित कर सकते हैं, अपने यूआई पर प्रदर्शित होने के लिए टेक्स्ट व्यू या छवि बना सकते हैं। या क्योंकि आप ViewPager में व्यू आइटम की मात्रा जानते हैं, तो आप जोड़ सकते हैं संदेश के साथ 0 और/या n + 1 पर अलग-अलग दृश्य देखें और इसे अंतिम दृश्य में उछाल दें जिसमें वास्तव में आपका डेटा शामिल है।

आप को लागू कर सकते हैं:

viewPager.setOnPageChangeListener(new OnPageChangeListener() { 
    public void onPageSelected(int position) { 
     //TODO If position is the 0 or n item, add a view at 0 or at n+1 to indicate there is no more pages with data. 
    } 

    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 
     // TODO Show a Toast, View or do anything you want when position = your first/last item; 
    } 

    public void onPageScrollStateChanged(int state) { 
    } 
}); 
+2

जब आप ViewPager के अंत से पहले स्क्रॉल करने का प्रयास करते हैं, तो सिस्टम-मानक चमक प्रभाव होता है, जो तब होता है जब आप किसी सूची के नीचे के शीर्ष पर स्क्रॉल करते हैं। मुझे ऐसा कुछ चाहिए - लेकिन इसे सभी संस्करणों पर काम करना चाहिए (वर्तमान चमक केवल आईसीएस है)। आपके सुझाव एक छद्म यूआई के लिए बनाएंगे, और यदि वे वास्तव में एकमात्र विकल्प हैं तो मैं कोई संकेत नहीं रखूंगा। –

+0

मुझे पता है और यह मेरे ऐप के लिए पर्याप्त है, लेकिन अगर @ एर्रामस ने पूछा, तो मुझे लगता है क्योंकि उसे कुछ और चाहिए। :) –

0

आप अपने टुकड़े में setUserVisibleHint (बुलियन) समारोह को ओवरलोड कर सकते हैं। छद्म कोड:

void setUserVisibleHint(boolean isVisibleToUser) { 
     // If this fragment is becoming visible 
     if (isVisibleToUser == true) { 
      // Check if it is the last fragment in the viewpager 
      if (indexOfThis == getActivity().indexOfLast) { 
       // Display right limit reached 
       Toast(..., "No more Frags to right",...) 
       } 
      // Check if it is the first fragment in the viewpager 
      else if (indexOfThis == getActivity().indexOfFirst) { 
       // Display Left Limit reached 
       Toast(..., "No more Frags to left",...) 
      } 
     } 
    } 

मैं इस उद्देश्य के लिए इस समारोह का इस्तेमाल किया है नहीं है, लेकिन अन्य कारणों के लिए यह प्रयोग किया जाता है और यह उचित रूप से आग नहीं करता है। उम्मीद है कि यह मदद करता है ...

+0

इसमें ऑस्कर के उत्तर के समान यूआई प्रभाव हैं, सिवाय इसके कि यह एक ऐसी विधि को ओवरराइड करता है जो श्रोता का उपयोग करने के बजाय ओवरराइड करने के लिए नहीं है, जो खतरनाक लगता है। –

19

यदि आप v4 समर्थन लाइब्रेरी को देखते हैं तो आपको देखेंगे कि EdgeEffectCompat नामक व्यूपेजर द्वारा उपयोग की जाने वाली कक्षा है (यह आईसीएस + में दृश्य पेजर की शुरुआत या अंत तक पहुंचने पर चमक प्रभाव प्रदान करता है) आप कंपैट लाइब्रेरी में कार्यान्वयन को देखते हैं, आप देखेंगे कि यह देखने के लिए एक if-statement है कि बिल्ड संस्करण 14+ (आईसीएस) है या नहीं। यदि ऐसा है, तो यह आईसीएस में उत्पन्न होने वाली सामान्य EdgeEffect कक्षा का उपयोग करके अंततः समाप्त होता है (यदि आप लंबे समय तक पता लगाते हैं)। अन्यथा यह BaseEdgeEffectImpl का उपयोग करता है जिसमें मूल रूप से इसमें कुछ भी नहीं है।

यदि आप चाहते हैं, तो आप अपना खुद का कस्टम व्यूपेगर बना सकते हैं जो आपके स्वयं के EdgeEffect का उपयोग करता है। आप एंड्रॉइड स्रोत कोड को देख सकते हैं कि उन्होंने EdgeEffect here को कैसे कार्यान्वित किया है, जिसे आप बहुत अधिक प्रतिलिपि बना सकते हैं (केवल overscroll_edge और overscroll_glow को अपने स्वयं के प्रोजेक्ट में AOSP/res/drawable निर्देशिका में ड्रॉबल्स कॉपी करना सुनिश्चित करें क्योंकि वे एंड्रॉइड के लिए आंतरिक हैं) या आगे बढ़ें और अपना खुद का संस्करण बनाएं।

शुभकामनाएं।

(वैसे, यह है कि वे कैसे आईसीएस पर लांचर मेनू में शांत देख बढ़त झुकाव प्रभाव पैदा है ... ताकि आप काफी के रूप में आप इस के साथ चाहते हैं रचनात्मक रूप में हो सकता है;)

+0

ऐसा लगता है कि इसे करना चाहिए! धन्यवाद। –

7

मैं कोशिश कर रहा था इस सवाल में पूछे गए सटीक प्रभाव को प्राप्त करने के लिए। मैं इसके साथ संघर्ष करता हूं और फिर मैंने @wnafee जवाब पढ़ा (मैं इसे बाहर नहीं कर सका)।

लेकिन फिर मैं जवाब से बहुत आसान ध्वनि को लागू करने के लिए संघर्ष करता हूं। मुझे इसे लागू करने में बहुत परेशानी थी, कि मुझे सही ढंग से जवाब नहीं समझा, लेकिन पहुंच योग्य API के बहुत से मुद्दे थे क्योंकि मैं संगतता लाइब्रेरी के उसी पैकेज में काम नहीं कर रहा था।

कुछ दृष्टिकोणों की कोशिश करने के बाद (उनमें से कोई भी सफल नहीं हुआ, और वे बहुत जटिल थे) मैं थोड़ा अलग दिशा में गया, और अब यह एक आकर्षण की तरह काम करता है। मैंने कुछ प्रतिबिंब का उपयोग किया, जिन लोगों ने कभी इसका इस्तेमाल नहीं किया, चिंता न करें यह वास्तव में प्रतिबिंब का मूल है।

मुझे यकीन नहीं है कि यह सबसे अच्छा समाधान है, लेकिन यह मेरे लिए काम करता है, इसलिए यदि आप इसका उपयोग करना चाहते हैं तो आपका स्वागत है। कृपया Wnafee उदाहरण पढ़ें क्योंकि यह कुछ चीजें बताता है जो मैंने किया था।

इस कार्य को पूरा करने के लिए आपको बस मेरे तीन भागों के समाधान का पालन करना चाहिए। (3-10 मिनट के बीच ले जाएगा) का

भाग I:

रूप Wnafee कहा मैं सिर्फ नकल द्वारा अपने ही EdgeEffect वर्ग here से स्रोत कोड पेस्ट बना दिया,

(बस बनाने के अपने स्वयं के परियोजना बाद से वे एंड्रॉयड के लिए आंतरिक रहे हैं)

को AOSP/res/drawable निर्देशिका में overscroll_edge कॉपी और ड्रॉएबल overscroll_glow करने के लिए सुनिश्चित

  1. मैं घोषणा करता हूं कि वर्ग EdgeEffectCompat फैली (मैं अपने वर्ग EdgeEffectForEarlyVersions कहा जाता है):

    मैं केवल 2 वास्तव में छोटे परिवर्तन किया था। public class EdgeEffectForEarlyVersions extends EdgeEffectCompat। इस परिवर्तन को करने का कारण यह है कि mLeftEdge और mRightEdgeEdgeEffectCompat प्रकार के हैं।

  2. "मेरी" नई कक्षा के निर्माता की पहली पंक्ति में मैंने मूल निर्माता super(context); पर एक कॉल जोड़ा। चूंकि EdgeEffectCompat पर कोई डिफ़ॉल्ट कन्स्ट्रक्टर नहीं है, इसलिए आपको स्पष्ट रूप से निर्माता को कॉल करना होगा।

भाग द्वितीय

कि इसके अलावा मैं एक समारोह में लिखा था। फ़ंक्शन का उद्देश्य यह है कि प्रारंभिक संस्करण (आईसीएस से पहले) के मामले में हम EdgeEffectForEarlyVersions का उपयोग करना चाहते हैं जिसे हमने अभी कॉपी किया है। उस उद्देश्य को पाने के लिए मैंने प्रतिबिंब का उपयोग किया।

इस समारोह है:

private static void changeEdgeEffectCompactOnEarlyVersions(ViewPager viewPager, Context context) 
{ 
    /* In case that the version is earlier than 14 there is only empty implementation for the edge effect, therefore we change it. 
    * for more information look on the following links: 
    * 1. http://stackoverflow.com/questions/10773565/visual-indication-of-over-scroll-in-android 
    * 2. http://grepcode.com/file/repo1.maven.org/maven2/com.google.android/support-v4/r7/android/support/v4/view/ViewPager.java#ViewPager.0mLeftEdge 
    * 3. http://grepcode.com/file/repo1.maven.org/maven2/com.google.android/support-v4/r7/android/support/v4/widget/EdgeEffectCompat.java#EdgeEffectCompat 
    */ 

    if (Build.VERSION.SDK_INT < 14) 
    { 
     try 
     { 
      Class<ViewPager> viewPagerClass = ViewPager.class; 
      //Get the left edge field, since it is private we used getDeclaredField and not getDeclared 
      Field leftEdge = viewPagerClass.getDeclaredField("mLeftEdge"); 
      leftEdge.setAccessible(true); 
      //Get the right edge field, since it is private we used getDeclaredField and not getDeclared 
      Field rightEdge = viewPagerClass.getDeclaredField("mRightEdge"); 
      rightEdge.setAccessible(true); 

      EdgeEffectForEarlyVersions leftEdgeEffect = new EdgeEffectForEarlyVersions(context); 
      EdgeEffectForEarlyVersions rightEdgeEffect = new EdgeEffectForEarlyVersions(context); 

      //Set the mLeftEdge memeber of viewPager not to be the default one, but to be "our" edgeEffect 
      leftEdge.set(viewPager, leftEdgeEffect); 
      //Set the mRightEdge memeber of viewPager not to be the default one, but to be "our" edgeEffect 
      rightEdge.set(viewPager, rightEdgeEffect);    
     } 
     catch (Exception ex) 
     { 
      Log.e("refelection", ex.getMessage()); 
     } 

    } 
} 

भाग III

अब सब वहाँ ऐसा करने के लिए छोड़ दिया जाता है, तो आप ViewPager उदाहरण और अधिक कुछ भी नहीं है के बाद कि समारोह कॉल करने के लिए है।

मुझे आशा है कि यह किसी की मदद करेगा।

+0

यह v4 compat lib का उपयोग कर एपीआई <= 8. (नवीनतम संशोधन 11 में) पर काम नहीं करेगा। क्योंकि यह baseViewCompatImpl का उपयोग करता है जो overscroll मोड के लिए पूछे जाने पर हमेशा OVER_SCROLL_NEVER लौटाता है। ऑनड्रा() में यह फिर स्क्रॉल के चित्र को छोड़ देता है ... – Nick

1

सिर्फ @goBeepit dev उत्तर के पूरक होने के लिए जब आप अपना खुद का एजफैक्ट वर्ग बनाते हैं और आप EdgeEffectCompat से विस्तार करते हैं तो कुछ विधियों को बुलियन होना आवश्यक है। आप उन तरीकों को बूलियन प्रकार में बदल सकते हैं और फिर किसी भी मामले में सच कर सकते हैं, इस तरह सब ठीक काम करता है

3

wnafee ने समाधान को अच्छी तरह से समझाया लेकिन हमारे बीच आलसी के लिए, मैंने कुछ समय पहले वास्तविक कार्य कार्यान्वयन किया था।

https://github.com/inovex/ViewPager3D

और तुम सिर्फ ओवरस्क्रॉल यहाँ एक बार देख ले चाहते हैं:

https://github.com/inovex/ViewPager3D/issues/1