From 8ae9ccc9af16887b9bc69252029b57b2eba06657 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Thu, 8 Mar 2018 20:08:40 +0100 Subject: [PATCH] Add a nice bottom navigation animation Signed-off-by: Mario Danic --- .../BottomNavigationController.java | 8 ++- ...ottomNavigationViewBehaviourAnimation.java | 71 +++++++++++++++++++ .../layout/controller_bottom_navigation.xml | 7 +- 3 files changed, 80 insertions(+), 6 deletions(-) create mode 100644 app/src/main/java/com/nextcloud/talk/utils/animations/BottomNavigationViewBehaviourAnimation.java diff --git a/app/src/main/java/com/nextcloud/talk/controllers/base/bottomnavigation/BottomNavigationController.java b/app/src/main/java/com/nextcloud/talk/controllers/base/bottomnavigation/BottomNavigationController.java index 91b1ca9a3..f99c1538e 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/base/bottomnavigation/BottomNavigationController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/base/bottomnavigation/BottomNavigationController.java @@ -28,13 +28,13 @@ import android.os.Bundle; import android.support.annotation.MenuRes; import android.support.annotation.NonNull; import android.support.design.widget.BottomNavigationView; +import android.support.design.widget.CoordinatorLayout; import android.util.SparseArray; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; -import android.widget.LinearLayout; import com.bluelinelabs.conductor.ChangeHandlerFrameLayout; import com.bluelinelabs.conductor.Controller; @@ -44,6 +44,7 @@ import com.bluelinelabs.conductor.changehandler.FadeChangeHandler; import com.nextcloud.talk.R; import com.nextcloud.talk.controllers.base.BaseController; import com.nextcloud.talk.utils.BottomNavigationUtils; +import com.nextcloud.talk.utils.animations.BottomNavigationViewBehaviourAnimation; import com.nextcloud.talk.utils.bundle.BundleBuilder; import butterknife.BindView; @@ -77,7 +78,7 @@ public abstract class BottomNavigationController extends BaseController { private static final String KEY_STATE_CURRENTLY_SELECTED_ID = "key_state_currently_selected_id"; @BindView(R.id.bottom_navigation_root) - LinearLayout bottomNavigationRoot; + CoordinatorLayout bottomNavigationRoot; @BindView(R.id.navigation) BottomNavigationView bottomNavigationView; @@ -128,6 +129,9 @@ public abstract class BottomNavigationController extends BaseController { navigateTo(item.getItemId(), getControllerFor(item.getItemId())); return true; }); + + CoordinatorLayout.LayoutParams layoutParams = (CoordinatorLayout.LayoutParams) bottomNavigationView.getLayoutParams(); + layoutParams.setBehavior(new BottomNavigationViewBehaviourAnimation()); } @Override diff --git a/app/src/main/java/com/nextcloud/talk/utils/animations/BottomNavigationViewBehaviourAnimation.java b/app/src/main/java/com/nextcloud/talk/utils/animations/BottomNavigationViewBehaviourAnimation.java new file mode 100644 index 000000000..19095b041 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/utils/animations/BottomNavigationViewBehaviourAnimation.java @@ -0,0 +1,71 @@ +/* + * MIT License + * + * Copyright (c) 2016 Srijith Narayanan + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package com.nextcloud.talk.utils.animations; + +import android.support.design.widget.BottomNavigationView; +import android.support.design.widget.CoordinatorLayout; +import android.support.v4.view.ViewCompat; +import android.view.View; + +/** + * Created by Srijith on 22-12-2016. + * Copied for this project from https://github.com/sjthn/BottomNavigationViewBehavior/blob/master/app/src/main/java/com/example/srijith/bottomnavigationviewbehavior/BottomNavigationViewBehavior.java + */ + +public class BottomNavigationViewBehaviourAnimation extends CoordinatorLayout.Behavior { + + private int height; + + @Override + public boolean onLayoutChild(CoordinatorLayout parent, BottomNavigationView child, int layoutDirection) { + height = child.getHeight(); + return super.onLayoutChild(parent, child, layoutDirection); + } + + @Override + public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, BottomNavigationView child, View directTargetChild, View target, int nestedScrollAxes) { + return nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL; + } + + @Override + public void onNestedScroll(CoordinatorLayout coordinatorLayout, BottomNavigationView child, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) { + if (dyConsumed > 0) { + slideDown(child); + } else if (dyConsumed < 0) { + slideUp(child); + } + } + + private void slideUp(BottomNavigationView child) { + child.clearAnimation(); + child.animate().translationY(0).setDuration(200); + } + + private void slideDown(BottomNavigationView child) { + child.clearAnimation(); + child.animate().translationY(height).setDuration(200); + } + +} diff --git a/app/src/main/res/layout/controller_bottom_navigation.xml b/app/src/main/res/layout/controller_bottom_navigation.xml index 7d27cf978..392bbb45c 100644 --- a/app/src/main/res/layout/controller_bottom_navigation.xml +++ b/app/src/main/res/layout/controller_bottom_navigation.xml @@ -1,5 +1,5 @@ - - +