2016-10-13 24 views
13

मैं स्क्रॉलिंग परिवर्तनों पर AppBarLayout.ScrollingViewBehavior में offsetChildAsNeeded विधि का गणित प्रवाह देखता हूं।कैसे AppBarLayout.ScrollingViewBehavior का गणित काम करता है?

चूंकि यह निजी विधि है और निजी mOffsetDelta है, प्रोग्रामेटिक रूप से उन पर निगरानी कैसे कर सकता है?

(यह स्पष्ट कैसे विधि offset भी उपयोग करता है नहीं है।)

private void offsetChildAsNeeded(CoordinatorLayout parent, View child, View dependency) { 
    final CoordinatorLayout.Behavior behavior = 
       ((CoordinatorLayout.LayoutParams) dependency.getLayoutParams()).getBehavior(); 
    if (behavior instanceof Behavior) { 
     // Offset the child, pinning it to the bottom the header-dependency, maintaining 
     // any vertical gap, and overlap 
     final Behavior ablBehavior = (Behavior) behavior; 
     final int offset = ablBehavior.getTopBottomOffsetForScrollingSibling(); 
     ViewCompat.offsetTopAndBottom(child, (dependency.getBottom() - child.getTop()) 
       + ablBehavior.mOffsetDelta 
       + getVerticalLayoutGap() 
       - getOverlapPixelsForOffset(dependency)); 
     } 
    } 

नोट: स्वागत कर रहे हैं और यह भी जो कि getTopBottomOffsetForScrollingSibling() के गणित के तर्क पर विवरण की व्याख्या, (dependency.getBottom() - child.getTop()) के उत्तर में स्वीकार किया जा सकता है, और mOffsetDelta

+0

यदि आप इसे प्राप्त करने की योजना बना रहे हैं, तो आप अपने अंतिम लक्ष्य की व्याख्या करते हुए बेहतर होगा। – natario

+0

अंतिम लक्ष्य सीख रहा है कि स्क्रॉल परिवर्तन के दौरान व्यवहार कैसे काम करता है – GPack

+0

'AppBarLayout की प्रतिलिपि बनाएँ।अपनी प्रोजेक्ट में स्क्रॉलिंग व्यूबीवियर 'क्लास, बदलाव करें, अपने' ऐपबारलाउट 'के ऐप को इंगित करें: लेआउट_बीवियरर', लाभ। –

उत्तर

2

की सामग्री पर आप इस कोड रिवर्स इंजीनियर सकता है, लेकिन अंत में यह शैक्षिक है, क्योंकि हमें मात्र नश्वर (यानी गैर- Google) प्रोग्रामर va उपयोग नहीं कर सकते यहां दिखाए गए संकेत और तरीके। मुझे लगता है कि वे समझते हैं कि उनकी लाइब्रेरी में से कम हम वास्तव में का उपयोग कर सकते हैं, कम बग रिपोर्ट हम फाइल करेंगे। आह।

कि सभी कोड लाइन पहले

final int offset = ablBehavior.getTopBottomOffsetForScrollingSibling(); 

, एक पहले संशोधन के एक अल्पविकसित बचे हुए हैं, क्योंकि offset वास्तव में इस्तेमाल कभी नहीं किया है प्रकट होता है:

लेकिन यहाँ एक संक्षिप्त व्याख्या है। अधिक अभिव्यक्ति में नई अभिव्यक्ति थोड़ा और सटीक होना चाहिए।

ViewCompat.offsetTopAndBottom() एक सेट (पूर्ण) ऑपरेशन नहीं है, लेकिन एक योजक (रिश्तेदार) ऑपरेशन है। तो आइए सामान्य तर्क मान लें और मान लें कि यह व्यवहार अनिवार्य रूप से ऐप बार लेआउट के नीचे स्क्रॉलिंग दृश्य डालता है। आमतौर पर, फिर, ऐप बार के नीचे और स्क्रॉलिंग दृश्य के शीर्ष पर एक ही मान होता है। चूंकि ऐप्लिकेशन बार लेआउट (निर्भरता) बदल गया है और स्क्रॉलिंग दृश्य (बच्चे) (अभी तक) नहीं है, तो

dependency.getBottom() - child.getTop() 

रिश्तेदार राशि है कि समायोजित करने की बच्चे की खड़ी ऑफसेट की जरूरत है।

यदि कोड का मेरा पठन सही है, तो ऐप बार लेआउट के व्यवहार में mOffsetDelta केवल उस स्थिति में गैर-शून्य है जब ऐप बार लेआउट में ऑफ़सेट इंटरपोलेटर होता है। आम तौर पर ऐप बार स्वयं एक लंबन फैशन में नहीं चलेगा, इसलिए mOffsetDelta व्यावहारिक रूप से उन सभी मामलों के लिए शून्य है जिनकी हम परवाह करते हैं। getVerticalLayoutGap और getOverlapPixelsForOffsetoverlapTop जैसे लेआउट पैराम के साथ सौदा करें।

लेकिन यह पता चला है कि आप अपने खुद के व्यवहार उपवर्ग में उन लोगों के किनारे मामलों के बिना इस का सबसे कर सकते हैं बस ऐसा करने से:

@Override 
    public boolean onDependentViewChanged(CoordinatorLayout parent, View child, 
              View dependency) { 
     // get the bottom of the app bar layout 
     int bottom = dependency.getBottom(); 

     // position the top of the scrolling view there 
     return setTopAndBottomOffset(bottom); 
    } 

मुझे लगता है यह रिश्तेदार के बजाय निरपेक्ष ऑफसेट के साथ काम करने के लिए थोड़ा आसान है ऑफसेट। इसलिए स्क्रॉलिंग व्यवहार को लागू करना ज्यादातर यह निर्धारित करने का विषय है कि निर्भर दृश्य कहां है और जहां स्क्रॉलिंग दृश्य उस पर आधारित होना चाहिए।

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