2015-06-01 3 views
10

आईडी Google Play store में एक जैसा प्रभाव देख सकता है, जहां सामग्री स्क्रॉल करके Toolbar स्क्रॉल करते समय ऑफ-स्क्रीन चला जाता है।कोऑर्डिनेटरआउटआउट: छुपा/आधा दृश्य टूलबार दिखा रहा है?

यह CoordinatorLayout (1) के साथ ठीक काम करता है # io15 में पेश किया है, हालांकि: आप पुस्तक "बीच में ही" रोक कि टूलबार स्क्रीन पर रहता है, लेकिन आधे में कट जाता है: मैं इसे बंद चेतन करना चाहते हैं -स्क्रीन, जैसे कि Google Play store में। मैं इसे कैसे प्राप्त कर सकता हूं?

उत्तर

3

अब एंड्रॉइड सपोर्ट लाइब्रेरी 23.1.0 में एक नया स्क्रॉल ध्वज SCROLL_FLAG_SNAP है जो आपको इस प्रभाव को प्राप्त करने की अनुमति देता है।

ऐपबारलाउट कई स्क्रॉल झंडे का समर्थन करता है जो बच्चों को स्क्रॉलिंग पर प्रतिक्रिया करता है (उदाहरण के लिए स्क्रीन को स्क्रॉल करना)। इस रिलीज के लिए नया SCROLL_FLAG_SNAP है, यह सुनिश्चित करना कि जब स्क्रॉलिंग समाप्त होती है, तो दृश्य आंशिक रूप से दिखाई नहीं देता है। इसके बजाए, इसे स्क्रीन के पूरी तरह से दृश्यमान या पूरी तरह से स्क्रॉल करके, अपने निकटतम किनारे पर स्क्रॉल किया जाएगा।

1

गतिविधि लेआउट फ़ाइल:

<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/recyclerView" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:paddingTop="?attr/actionBarSize" 
     android:clipToPadding="false"/> 

    <android.support.v7.widget.Toolbar 
     android:id="@+id/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="?attr/actionBarSize" 
     android:background="?attr/colorPrimary"/> 

</FrameLayout> 

अब गतिविधि के अंदर, सेटअप टूलबार और RecyclerView। निरुपित OnScrollListener RecyclerView को

recyclerView.setOnScrollListener(new MyScrollListener(this)); 

RecyclerView.OnScrollListener से MyScrollListerner बढ़ाएँ।

public abstract class MyScrollListener extends RecyclerView.OnScrollListener { 

    private static final float TOOLBAR_HIDE_THRESHOLD = 10; 
    private static final float TOOLBAR_SHOW_THRESHOLD = 70; 

    private int mToolbarOffset = 0; 
    private boolean mControlsVisible = true; 
    private int mToolbarHeight; 
    private int mTotalScrolledDistance; 

    public MyScrollListener(Context context) { 

     final TypedArray styledAttributes = context.getTheme().obtainStyledAttributes(
       new int[]{R.attr.actionBarSize}); 
     mToolbarHeight = (int) styledAttributes.getDimension(0, 0); 
     styledAttributes.recycle(); 

     return toolbarHeight; 
     mToolbarHeight = Utils.getToolbarHeight(context); 
    } 

    @Override 
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) { 
     super.onScrollStateChanged(recyclerView, newState); 

     if(newState == RecyclerView.SCROLL_STATE_IDLE) { 
      if(mTotalScrolledDistance < mToolbarHeight) { 
       setVisible(); 
      } else { 
       if (mControlsVisible) { 
        if (mToolbarOffset > TOOLBAR_HIDE_THRESHOLD) { 
         setInvisible(); 
        } else { 
         setVisible(); 
        } 
       } else { 
        if ((mToolbarHeight - mToolbarOffset) > TOOLBAR_SHOW_THRESHOLD) { 
         setVisible(); 
        } else { 
         setInvisible(); 
        } 
       } 
      } 
     } 
    } 

     @Override 
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
     super.onScrolled(recyclerView, dx, dy); 
     clipToolbarOffset(); 
     onMoved(mToolbarOffset); 

     if((mToolbarOffset <mToolbarHeight && dy>0) || (mToolbarOffset >0 && dy<0)) { 
      mToolbarOffset += dy; 
     } 
     if (mTotalScrolledDistance < 0) { 
      mTotalScrolledDistance = 0; 
     } else { 
      mTotalScrolledDistance += dy; 
     } 
    } 

    private void clipToolbarOffset() { 
    if(mToolbarOffset > mToolbarHeight) { 
     mToolbarOffset = mToolbarHeight; 
     } else if(mToolbarOffset < 0) { 
      mToolbarOffset = 0; 
     } 
    } 

    private void setVisible() { 
     if(mToolbarOffset > 0) { 
      onShow(); 
      mToolbarOffset = 0; 
     } 
     mControlsVisible = true; 
    } 

    private void setInvisible() { 
     if(mToolbarOffset < mToolbarHeight) { 
      onHide(); 
      mToolbarOffset = mToolbarHeight; 
     } 
     mControlsVisible = false; 
    } 

    public abstract void onMoved(int distance); 
    public abstract void onShow(); 
    public abstract void onHide(); 
} 
+0

@zoltish मुझे बताएं कि यह आपके लिए काम करता है और अगर ऐसा होता है तो उत्तर के रूप में स्वीकार करते हैं। :) – nishantapatil

+0

ऐपबार/टूलबार को RecyclerView स्क्रॉल किए बिना स्क्रॉल किया जा सकता है, जिस स्थिति में श्रोता कोड ट्रिगर नहीं किया जाएगा। ऐसा तब होता है जब RecyclerView शीर्ष पर है और इसमें स्क्रॉल करने के लिए कुछ भी नहीं है, और उपयोगकर्ता नीचे खींचता है, इससे पूरे समन्वयक के स्क्रॉलिंग का कारण बन जाएगा – marmor

0

AppBarLayout ओवरराइड के रूप में दो संभावित स्क्रॉल घटनाओं कर रहे हैं, एक बेहतर समाधान हो रहा है - पूरे CoordinatorLayout की, और RecyclerView/NestedScrollView

के संभावित काम कर कोड के रूप में इस सवाल का जवाब देखें: https://stackoverflow.com/a/32110089/819355

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