diff options
author | Harsh Shandilya <me@msfjarvis.dev> | 2020-04-19 12:48:40 +0530 |
---|---|---|
committer | Harsh Shandilya <me@msfjarvis.dev> | 2020-04-19 14:11:18 +0530 |
commit | eb5a30c3a9f1474e452d28032c238cc3738eb3d8 (patch) | |
tree | f368ef9fab91f5e09eafb96ad532b2aef1f856bd | |
parent | e5d178ea3ca29367593bfc92e8f95e17dcaba459 (diff) |
PasswordFragment: animate FAB in action mode
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
-rw-r--r-- | app/src/main/java/com/zeapo/pwdstore/PasswordFragment.kt | 29 | ||||
-rw-r--r-- | app/src/main/res/anim/scale_down.xml | 12 | ||||
-rw-r--r-- | app/src/main/res/anim/scale_up.xml | 12 |
3 files changed, 51 insertions, 2 deletions
diff --git a/app/src/main/java/com/zeapo/pwdstore/PasswordFragment.kt b/app/src/main/java/com/zeapo/pwdstore/PasswordFragment.kt index eb97f1b8..5e12697d 100644 --- a/app/src/main/java/com/zeapo/pwdstore/PasswordFragment.kt +++ b/app/src/main/java/com/zeapo/pwdstore/PasswordFragment.kt @@ -13,6 +13,8 @@ import android.view.Menu import android.view.MenuItem import android.view.View import android.view.ViewGroup +import android.view.animation.Animation +import android.view.animation.AnimationUtils import androidx.appcompat.view.ActionMode import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels @@ -156,7 +158,7 @@ class PasswordFragment : Fragment() { // Inflate a menu resource providing context menu items mode.menuInflater.inflate(R.menu.context_pass, menu) // hide the fab - binding.fab.visibility = View.GONE + animateFab(false) return true } @@ -202,7 +204,30 @@ class PasswordFragment : Fragment() { recyclerAdapter.requireSelectionTracker().clearSelection() actionMode = null // show the fab - binding.fab.visibility = View.VISIBLE + animateFab(true) + } + + private fun animateFab(show: Boolean) = with(binding.fab) { + val animation = AnimationUtils.loadAnimation( + context, if (show) R.anim.scale_up else R.anim.scale_down + ) + animation.setAnimationListener(object : Animation.AnimationListener { + override fun onAnimationRepeat(animation: Animation?) { + } + + override fun onAnimationEnd(animation: Animation?) { + if (!show) visibility = View.GONE + } + + override fun onAnimationStart(animation: Animation?) { + if (show) visibility = View.VISIBLE + } + }) + animate().rotationBy(if (show) -90f else 90f) + .setStartDelay(if (show) 100 else 0) + .setDuration(100) + .start() + startAnimation(animation) } } diff --git a/app/src/main/res/anim/scale_down.xml b/app/src/main/res/anim/scale_down.xml new file mode 100644 index 00000000..b6ece430 --- /dev/null +++ b/app/src/main/res/anim/scale_down.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<set xmlns:android="http://schemas.android.com/apk/res/android" > + <scale + android:duration="300" + android:fromXScale="1.0" + android:fromYScale="1.0" + android:interpolator="@android:anim/linear_interpolator" + android:pivotX="50%" + android:pivotY="50%" + android:toXScale="0" + android:toYScale="0" /> +</set> diff --git a/app/src/main/res/anim/scale_up.xml b/app/src/main/res/anim/scale_up.xml new file mode 100644 index 00000000..07dd5787 --- /dev/null +++ b/app/src/main/res/anim/scale_up.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<set xmlns:android="http://schemas.android.com/apk/res/android" > + <scale + android:duration="300" + android:fromXScale="0" + android:fromYScale="0" + android:interpolator="@android:anim/linear_interpolator" + android:pivotX="50%" + android:pivotY="50%" + android:toXScale="1.0" + android:toYScale="1.0" /> +</set> |