How to make the Toolbar snap into view or out of view when using Google Design Library?

前端 未结 3 1405
渐次进展
渐次进展 2020-12-05 03:23

I am trying to achieve an effect like WhatsApp has, where the Toolbar (when scrolled) will clip into view magnetlike, or out of view magnetlike.

What I have im my Ma

3条回答
  •  青春惊慌失措
    2020-12-05 03:40

    EDIT: as of support 23.1.0 this is no longer needed. See this answer instead.

    One possible way to solve this is customizing the Behavior set to your AppBarLayout.

    
        ...
    

    Your AppBarLayoutSnapBehavior would change the default behavior of AppBarLayout.Behavior, by adding the snap logic when the scroll stops. Hopefully, the code below is self explanatory.

    package com.myapp;
    
    public class AppBarLayoutSnapBehavior extends AppBarLayout.Behavior {
    
        private ValueAnimator mAnimator;
        private boolean mNestedScrollStarted = false;
    
        public AppBarLayoutSnapBehavior(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        @Override
        public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child,
                                           View directTargetChild, View target, int nestedScrollAxes) {
            mNestedScrollStarted = super.onStartNestedScroll(coordinatorLayout, child, directTargetChild, target, nestedScrollAxes);
            if (mNestedScrollStarted && mAnimator != null) {
                mAnimator.cancel();
            }
            return mNestedScrollStarted;
        }
    
        @Override
        public void onStopNestedScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target) {
            super.onStopNestedScroll(coordinatorLayout, child, target);
    
            if (!mNestedScrollStarted) {
                return;
            }
    
            mNestedScrollStarted = false;
    
            int scrollRange = child.getTotalScrollRange();
            int topOffset = getTopAndBottomOffset();
    
            if (topOffset <= -scrollRange || topOffset >= 0) {
                // Already fully visible or fully invisible
                return;
            }
    
            if (topOffset < -(scrollRange / 2f)) {
                // Snap up (to fully invisible)
                animateOffsetTo(-scrollRange);
            } else {
                // Snap down (to fully visible)
                animateOffsetTo(0);
            }
        }
    
        private void animateOffsetTo(int offset) {
            if (mAnimator == null) {
                mAnimator = new ValueAnimator();
                mAnimator.setInterpolator(new DecelerateInterpolator());
                mAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                    @Override
                    public void onAnimationUpdate(ValueAnimator animation) {
                        setTopAndBottomOffset((int) animation.getAnimatedValue());
                    }
                });
            } else {
                mAnimator.cancel();
            }
    
            mAnimator.setIntValues(getTopAndBottomOffset(), offset);
            mAnimator.start();
        }
    }
    

    The only thing is, the scroll view (in my case a RecyclerView) snaps along with the Toolbar. I actually like it this way, but I'm not sure that's what you want.

提交回复
热议问题