From beeefb2be174f64da14865380327fe856e400b63 Mon Sep 17 00:00:00 2001 From: johan12345 Date: Fri, 9 Jul 2021 17:01:51 +0200 Subject: [PATCH] add some more animations to the new onboarding --- .../evmap/fragment/OnboardingFragment.kt | 102 +++++++++++++++++- .../fragment_onboarding_data_source.xml | 2 +- 2 files changed, 99 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/net/vonforst/evmap/fragment/OnboardingFragment.kt b/app/src/main/java/net/vonforst/evmap/fragment/OnboardingFragment.kt index 712c2abf..6cc8b71b 100644 --- a/app/src/main/java/net/vonforst/evmap/fragment/OnboardingFragment.kt +++ b/app/src/main/java/net/vonforst/evmap/fragment/OnboardingFragment.kt @@ -1,9 +1,13 @@ package net.vonforst.evmap.fragment +import android.animation.AnimatorSet +import android.animation.ObjectAnimator +import android.annotation.SuppressLint import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.view.animation.DecelerateInterpolator import androidx.fragment.app.Fragment import androidx.navigation.fragment.findNavController import androidx.viewpager2.adapter.FragmentStateAdapter @@ -70,12 +74,14 @@ class OnboardingViewPagerAdapter(fragment: Fragment, val goToNext: () -> Unit) : } class WelcomeFragment(val goToNext: () -> Unit) : Fragment() { + private lateinit var binding: FragmentOnboardingWelcomeBinding + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { - val binding = FragmentOnboardingWelcomeBinding.inflate(inflater, container, false) + binding = FragmentOnboardingWelcomeBinding.inflate(inflater, container, false) binding.btnGetStarted.setOnClickListener { goToNext() @@ -83,28 +89,84 @@ class WelcomeFragment(val goToNext: () -> Unit) : Fragment() { return binding.root } + + override fun onResume() { + super.onResume() + binding.animationView.playAnimation() + } + + override fun onPause() { + super.onPause() + binding.animationView.progress = 0f + } } class IconsFragment(val goToNext: () -> Unit) : Fragment() { + private lateinit var binding: FragmentOnboardingIconsBinding + + val labels + get() = listOf( + binding.iconLabel1, + binding.iconLabel2, + binding.iconLabel3, + binding.iconLabel4, + binding.iconLabel5 + ) + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { - val binding = FragmentOnboardingIconsBinding.inflate(inflater, container, false) + binding = FragmentOnboardingIconsBinding.inflate(inflater, container, false) binding.btnGetStarted.setOnClickListener { goToNext() } + labels.forEach { it.alpha = 0f } return binding.root } + + @SuppressLint("Recycle") + override fun onResume() { + super.onResume() + val animators = labels.flatMapIndexed { i, view -> + listOf( + ObjectAnimator.ofFloat(view, "translationY", -20f, 0f).apply { + startDelay = 40L * i + interpolator = DecelerateInterpolator() + }, + ObjectAnimator.ofFloat(view, "alpha", 0f, 1f).apply { + startDelay = 40L * i + interpolator = DecelerateInterpolator() + } + ) + } + AnimatorSet().apply { + playTogether(animators) + start() + } + } + + override fun onPause() { + super.onPause() + labels.forEach { it.alpha = 0f } + } } class DataSourceSelectFragment(val goToNext: () -> Unit) : Fragment() { private lateinit var prefs: PreferenceDataSource private lateinit var binding: FragmentOnboardingDataSourceBinding + val animatedItems + get() = listOf( + binding.rgDataSource.rbGoingElectric, + binding.rgDataSource.textView27, + binding.rgDataSource.rbOpenChargeMap, + binding.rgDataSource.textView28 + ) + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -116,14 +178,19 @@ class DataSourceSelectFragment(val goToNext: () -> Unit) : Fragment() { } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - binding.btnGetStarted.isEnabled = false + binding.btnGetStarted.visibility = View.INVISIBLE for (rb in listOf( binding.rgDataSource.rbGoingElectric, binding.rgDataSource.rbOpenChargeMap )) { rb.setOnCheckedChangeListener { _, _ -> - binding.btnGetStarted.isEnabled = true + if (binding.btnGetStarted.visibility == View.INVISIBLE) { + binding.btnGetStarted.visibility = View.VISIBLE + ObjectAnimator.ofFloat(binding.btnGetStarted, "alpha", 0f, 1f).apply { + interpolator = DecelerateInterpolator() + }.start() + } } } @@ -140,5 +207,32 @@ class DataSourceSelectFragment(val goToNext: () -> Unit) : Fragment() { prefs.welcomeDialogShown = true goToNext() } + animatedItems.forEach { it.alpha = 0f } + } + + @SuppressLint("Recycle") + override fun onResume() { + super.onResume() + val animators = animatedItems.flatMapIndexed { i, view -> + listOf( + ObjectAnimator.ofFloat(view, "translationY", 20f, 0f).apply { + startDelay = 40L * i + interpolator = DecelerateInterpolator() + }, + ObjectAnimator.ofFloat(view, "alpha", 0f, 1f).apply { + startDelay = 40L * i + interpolator = DecelerateInterpolator() + } + ) + } + AnimatorSet().apply { + playTogether(animators) + start() + } + } + + override fun onPause() { + super.onPause() + animatedItems.forEach { it.alpha = 0f } } } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_onboarding_data_source.xml b/app/src/main/res/layout/fragment_onboarding_data_source.xml index d1581570..3ddfdab4 100644 --- a/app/src/main/res/layout/fragment_onboarding_data_source.xml +++ b/app/src/main/res/layout/fragment_onboarding_data_source.xml @@ -51,7 +51,7 @@