From: Damyan Ivanov Date: Thu, 4 Feb 2021 20:26:19 +0000 (+0200) Subject: rework main activity fab show/hide to slide up/down X-Git-Tag: v0.17.0~164 X-Git-Url: https://git.ktnx.net/?a=commitdiff_plain;h=7d007e4633d4b2192230da39bfdb486707d08832;p=mobile-ledger.git rework main activity fab show/hide to slide up/down this is inspired by the HideBottomViewOnScrollBehaviour, which cannot be used directly, since it doesn't work for showing the fab when the recycler view is not tall enough to cause scrolling to reproduce the problem, make the fab hide in the transaction list, then switch to the account tree, which needs to be collapsed, and try to show the fab --- diff --git a/app/src/main/java/net/ktnx/mobileledger/ui/activity/MainActivity.java b/app/src/main/java/net/ktnx/mobileledger/ui/activity/MainActivity.java index d0517b8a..da86d3ae 100644 --- a/app/src/main/java/net/ktnx/mobileledger/ui/activity/MainActivity.java +++ b/app/src/main/java/net/ktnx/mobileledger/ui/activity/MainActivity.java @@ -17,6 +17,9 @@ package net.ktnx.mobileledger.ui.activity; +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.TimeInterpolator; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.ShortcutInfo; @@ -29,6 +32,7 @@ import android.os.Bundle; import android.text.format.DateUtils; import android.util.Log; import android.view.View; +import android.view.ViewPropertyAnimator; import android.view.animation.AnimationUtils; import android.widget.TextView; @@ -78,6 +82,8 @@ public class MainActivity extends ProfileThemedActivity { public static final String STATE_CURRENT_PAGE = "current_page"; public static final String BUNDLE_SAVED_STATE = "bundle_savedState"; public static final String STATE_ACC_FILTER = "account_filter"; + private static final boolean FAB_HIDDEN = false; + private static final boolean FAB_SHOWN = true; private SectionsPagerAdapter mSectionsPagerAdapter; private ProfilesRecyclerViewAdapter mProfileListAdapter; private int mCurrentPage; @@ -88,6 +94,9 @@ public class MainActivity extends ProfileThemedActivity { private MobileLedgerProfile profile; private MainModel mainModel; private ActivityMainBinding b; + private int fabVerticalOffset; + private ViewPropertyAnimator fabSlideAnimator; + private boolean wantedFabState = FAB_SHOWN; @Override protected void onStart() { super.onStart(); @@ -630,13 +639,58 @@ public class MainActivity extends ProfileThemedActivity { } } public void fabShouldShow() { - if ((profile != null) && profile.isPostingPermitted() && !b.drawerLayout.isOpen()) - b.btnAddTransaction.show(); + if (fabVerticalOffset <= 0) { + int top = b.btnAddTransaction.getTop(); + int parentHeight = b.mainAppLayout.getHeight(); + fabVerticalOffset = parentHeight - top; + } + if ((profile != null) && profile.isPostingPermitted() && !b.drawerLayout.isOpen()) { + fabShow(); + } else fabHide(); } + private void fabShow() { + if (wantedFabState == FAB_SHOWN) + return; + +// b.btnAddTransaction.show(); + if (this.fabSlideAnimator != null) { + this.fabSlideAnimator.cancel(); + b.btnAddTransaction.clearAnimation(); + } + + wantedFabState = FAB_SHOWN; + slideFabTo(b.btnAddTransaction, 0, 200L, + com.google.android.material.animation.AnimationUtils.LINEAR_OUT_SLOW_IN_INTERPOLATOR); + } public void fabHide() { - b.btnAddTransaction.hide(); + if (wantedFabState == FAB_HIDDEN) + return; + + if (fabVerticalOffset <= 0) + return; + +// b.btnAddTransaction.hide(); + if (this.fabSlideAnimator != null) { + this.fabSlideAnimator.cancel(); + b.btnAddTransaction.clearAnimation(); + } + + wantedFabState = FAB_HIDDEN; + slideFabTo(b.btnAddTransaction, fabVerticalOffset, 150L, + com.google.android.material.animation.AnimationUtils.FAST_OUT_LINEAR_IN_INTERPOLATOR); + } + private void slideFabTo(View view, int target, long duration, TimeInterpolator interpolator) { + fabSlideAnimator = view.animate() + .translationY((float) target) + .setInterpolator(interpolator) + .setDuration(duration) + .setListener(new AnimatorListenerAdapter() { + public void onAnimationEnd(Animator animation) { + fabSlideAnimator = null; + } + }); } public static class SectionsPagerAdapter extends FragmentStateAdapter {