diff options
author | Aurelien Hubert <aurel.hubert@gmail.com> | 2016-04-07 14:22:37 +0200 |
---|---|---|
committer | Aurelien Hubert <aurel.hubert@gmail.com> | 2016-04-07 14:22:37 +0200 |
commit | 717cda35f653829f9eb09d2e4f66a608a87912d2 (patch) | |
tree | ac2848ad4486ce01f06dd6973d215a574ad91fcc | |
parent | 91be429bbdb7b863389d3b2fbb873c8d5ac1b062 (diff) | |
download | android_external_ahbottomnavigation-717cda35f653829f9eb09d2e4f66a608a87912d2.tar.gz android_external_ahbottomnavigation-717cda35f653829f9eb09d2e4f66a608a87912d2.tar.bz2 android_external_ahbottomnavigation-717cda35f653829f9eb09d2e4f66a608a87912d2.zip |
Added behavior to manage snack bar with bottom bar
2 files changed, 83 insertions, 5 deletions
diff --git a/ahbottomnavigation/src/main/java/com/aurelhubert/ahbottomnavigation/AHBottomNavigationBehavior.java b/ahbottomnavigation/src/main/java/com/aurelhubert/ahbottomnavigation/AHBottomNavigationBehavior.java index f7724b6..f828876 100644 --- a/ahbottomnavigation/src/main/java/com/aurelhubert/ahbottomnavigation/AHBottomNavigationBehavior.java +++ b/ahbottomnavigation/src/main/java/com/aurelhubert/ahbottomnavigation/AHBottomNavigationBehavior.java @@ -2,13 +2,15 @@ package com.aurelhubert.ahbottomnavigation; import android.content.Context; import android.content.res.TypedArray; +import android.os.Build; import android.support.design.widget.CoordinatorLayout; +import android.support.design.widget.Snackbar; import android.support.design.widget.TabLayout; import android.support.v4.view.ViewCompat; import android.support.v4.view.ViewPropertyAnimatorCompat; +import android.support.v4.view.ViewPropertyAnimatorUpdateListener; import android.support.v4.view.animation.LinearOutSlowInInterpolator; import android.util.AttributeSet; -import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.view.animation.Interpolator; @@ -17,13 +19,18 @@ import android.view.animation.Interpolator; * Created by Nikola D. on 3/15/2016. */ public class AHBottomNavigationBehavior<V extends View> extends VerticalScrollingBehavior<V> { - + private static final Interpolator INTERPOLATOR = new LinearOutSlowInInterpolator(); + private static final int ANIM_DURATION = 300; + private int mTabLayoutId; private boolean hidden = false; private ViewPropertyAnimatorCompat mTranslationAnimator; private TabLayout mTabLayout; + private Snackbar.SnackbarLayout snackbarLayout; private View mTabsHolder; + private int mSnackbarHeight = -1; + private float targetOffset = 0; public AHBottomNavigationBehavior() { super(); @@ -62,6 +69,12 @@ public class AHBottomNavigationBehavior<V extends View> extends VerticalScrollin } @Override + public boolean layoutDependsOn(CoordinatorLayout parent, V child, View dependency) { + updateSnackbar(child, dependency); + return super.layoutDependsOn(parent, child, dependency); + } + + @Override public void onNestedVerticalOverScroll(CoordinatorLayout coordinatorLayout, V child, @ScrollDirection int direction, int currentOverScroll, int totalOverScroll) { } @@ -91,19 +104,38 @@ public class AHBottomNavigationBehavior<V extends View> extends VerticalScrollin ensureOrCancelAnimator(child); mTranslationAnimator.translationY(offset).start(); animateTabsHolder(offset); + animateSnackBar(offset); } private void animateTabsHolder(int offset) { if (mTabsHolder != null) { offset = offset > 0 ? 0 : 1; - ViewCompat.animate(mTabsHolder).alpha(offset).setDuration(300).start(); + ViewCompat.animate(mTabsHolder).alpha(offset).setDuration(ANIM_DURATION).start(); + } + } + + private void animateSnackBar(int offset) { + if (snackbarLayout != null) { + AHHelper.updateBottomMargin(snackbarLayout, offset > 0 ? 0 : offset, + offset > 0 ? offset : 0, ANIM_DURATION); } } private void ensureOrCancelAnimator(V child) { if (mTranslationAnimator == null) { mTranslationAnimator = ViewCompat.animate(child); - mTranslationAnimator.setDuration(300); + mTranslationAnimator.setDuration(ANIM_DURATION); + mTranslationAnimator.setUpdateListener(new ViewPropertyAnimatorUpdateListener() { + @Override + public void onAnimationUpdate(View view) { + targetOffset = view.getTranslationY(); + if (snackbarLayout != null && snackbarLayout.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) { + ViewGroup.MarginLayoutParams p = (ViewGroup.MarginLayoutParams) snackbarLayout.getLayoutParams(); + p.setMargins(p.leftMargin, p.topMargin, p.rightMargin, (int) targetOffset); + snackbarLayout.requestLayout(); + } + } + }); mTranslationAnimator.setInterpolator(INTERPOLATOR); } else { mTranslationAnimator.cancel(); @@ -135,7 +167,33 @@ public class AHBottomNavigationBehavior<V extends View> extends VerticalScrollin } public void resetOffset(V view) { - Log.d("AHBottomNavigation", "restoreBottomNavigation"); animateOffset(view, 0); } + + /** + * Update Snackbar position + */ + public void updateSnackbar(View child, View dependency) { + if (dependency != null && dependency instanceof Snackbar.SnackbarLayout) { + + snackbarLayout = (Snackbar.SnackbarLayout) dependency; + + if (mSnackbarHeight == -1) { + mSnackbarHeight = dependency.getHeight(); + } + + int targetMargin = (int) (mSnackbarHeight + child.getMeasuredHeight() - child.getTranslationY()); + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { + child.bringToFront(); + } + + if (dependency.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) { + ViewGroup.MarginLayoutParams p = (ViewGroup.MarginLayoutParams) dependency.getLayoutParams(); + p.setMargins(p.leftMargin, p.topMargin, p.rightMargin, targetMargin); + dependency.requestLayout(); + } + } + } + + }
\ No newline at end of file diff --git a/ahbottomnavigation/src/main/java/com/aurelhubert/ahbottomnavigation/AHHelper.java b/ahbottomnavigation/src/main/java/com/aurelhubert/ahbottomnavigation/AHHelper.java index a88a563..aa66325 100644 --- a/ahbottomnavigation/src/main/java/com/aurelhubert/ahbottomnavigation/AHHelper.java +++ b/ahbottomnavigation/src/main/java/com/aurelhubert/ahbottomnavigation/AHHelper.java @@ -65,6 +65,26 @@ public class AHHelper { } /** + * Update bottom margin with animation + */ + public static void updateBottomMargin(final View view, int fromMargin, int toMargin, int duration) { + ValueAnimator animator = ValueAnimator.ofFloat(fromMargin, toMargin); + animator.setDuration(duration); + animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { + @Override + public void onAnimationUpdate(ValueAnimator valueAnimator) { + float animatedValue = (float) valueAnimator.getAnimatedValue(); + if (view.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) { + ViewGroup.MarginLayoutParams p = (ViewGroup.MarginLayoutParams) view.getLayoutParams(); + p.setMargins(p.leftMargin, p.topMargin, p.rightMargin, (int) animatedValue); + view.requestLayout(); + } + } + }); + animator.start(); + } + + /** * Update left margin with animation */ public static void updateLeftMargin(final View view, int fromMargin, int toMargin) { |