aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAurelien Hubert <aurel.hubert@gmail.com>2016-04-07 14:22:37 +0200
committerAurelien Hubert <aurel.hubert@gmail.com>2016-04-07 14:22:37 +0200
commit717cda35f653829f9eb09d2e4f66a608a87912d2 (patch)
treeac2848ad4486ce01f06dd6973d215a574ad91fcc
parent91be429bbdb7b863389d3b2fbb873c8d5ac1b062 (diff)
downloadandroid_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
-rw-r--r--ahbottomnavigation/src/main/java/com/aurelhubert/ahbottomnavigation/AHBottomNavigationBehavior.java68
-rw-r--r--ahbottomnavigation/src/main/java/com/aurelhubert/ahbottomnavigation/AHHelper.java20
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) {