checkpoint: transition animation is acceptable. barely.

This commit is contained in:
Kevin Gorham 2019-02-02 17:47:08 -05:00 committed by Kevin Gorham
parent 969af030db
commit 12c7c162f2
7 changed files with 103 additions and 36 deletions

View File

@ -38,7 +38,7 @@ class MainActivity : BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main) setContentView(R.layout.activity_main)
synchronizer.start(this) if(!DEV_MODE)synchronizer.start(this)
} }
override fun onDestroy() { override fun onDestroy() {
@ -54,6 +54,11 @@ class MainActivity : BaseActivity() {
} }
} }
override fun onResume() {
super.onResume()
if(DEV_MODE) navController.navigate(R.id.nav_send_fragment)
}
/** /**
* Let the navController override the default behavior when the drawer icon or back arrow are clicked. This * Let the navController override the default behavior when the drawer icon or back arrow are clicked. This
* automatically takes care of the drawer toggle behavior. Note that without overriding this method, the up/drawer * automatically takes care of the drawer toggle behavior. Note that without overriding this method, the up/drawer
@ -85,6 +90,12 @@ class MainActivity : BaseActivity() {
} }
companion object { companion object {
/**
* A simple flag that helps with removing shortcuts in the code used during development.
* TODO: either elevate this to a real thing (based off a system property or some such) or delete it!
*/
const val DEV_MODE = true
// TODO: placeholder until we have a network service for this // TODO: placeholder until we have a network service for this
const val USD_PER_ZEC = 49.07 const val USD_PER_ZEC = 49.07
init { init {

View File

@ -1,5 +1,6 @@
package cash.z.android.wallet.ui.fragment package cash.z.android.wallet.ui.fragment
import android.animation.Animator
import android.app.Activity import android.app.Activity
import android.os.Bundle import android.os.Bundle
import android.text.SpannableString import android.text.SpannableString
@ -8,6 +9,8 @@ import android.util.Log
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.view.animation.AccelerateDecelerateInterpolator
import android.view.animation.AccelerateInterpolator
import androidx.annotation.ColorRes import androidx.annotation.ColorRes
import androidx.annotation.DrawableRes import androidx.annotation.DrawableRes
import androidx.annotation.IdRes import androidx.annotation.IdRes
@ -55,32 +58,37 @@ class HomeFragment : BaseFragment(), HomePresenter.HomeView {
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View? { ): View? {
viewsInitialized = false viewsInitialized = false
val enterTransitionSet = TransitionInflater.from(mainActivity).inflateTransition(R.transition.transition_zec_sent).apply { setupSharedElementTransitions()
duration = 350L
}.addListener(object : Transition.TransitionListener {
override fun onTransitionEnd(transition: Transition) {
// fixes a bug where the translation gets lost, during animation. As a nice side effect, visually, it makes the view appear to settle in to position
header_active_transaction.translationZ = 10.0f
}
override fun onTransitionResume(transition: Transition) { return inflater.inflate(R.layout.fragment_home, container, false)
} }
override fun onTransitionPause(transition: Transition) { private fun setupSharedElementTransitions() {
} val enterTransitionSet =
TransitionInflater.from(mainActivity).inflateTransition(R.transition.transition_zec_sent).apply {
duration = 300L
}.addListener(object : Transition.TransitionListener {
override fun onTransitionEnd(transition: Transition) {
// fixes a bug where the translation gets lost, during animation. As a nice side effect, visually, it makes the view appear to settle in to position
header_active_transaction.translationZ = 10.0f
}
override fun onTransitionCancel(transition: Transition) { override fun onTransitionResume(transition: Transition) {
} }
override fun onTransitionStart(transition: Transition) { override fun onTransitionPause(transition: Transition) {
} }
}) override fun onTransitionCancel(transition: Transition) {
}
override fun onTransitionStart(transition: Transition) {
}
})
this.sharedElementEnterTransition = enterTransitionSet this.sharedElementEnterTransition = enterTransitionSet
this.sharedElementReturnTransition = enterTransitionSet this.sharedElementReturnTransition = enterTransitionSet
return inflater.inflate(R.layout.fragment_home, container, false)
} }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
@ -90,7 +98,6 @@ class HomeFragment : BaseFragment(), HomePresenter.HomeView {
mainActivity.setupNavigation() mainActivity.setupNavigation()
mainActivity.supportActionBar?.setTitle(R.string.destination_title_home) mainActivity.supportActionBar?.setTitle(R.string.destination_title_home)
} }
header_active_transaction.isActivated = true
headerFullViews = arrayOf(text_balance_usd, text_balance_includes_info, text_balance_zec, image_zec_symbol_balance_shadow, image_zec_symbol_balance) headerFullViews = arrayOf(text_balance_usd, text_balance_includes_info, text_balance_zec, image_zec_symbol_balance_shadow, image_zec_symbol_balance)
headerEmptyViews = arrayOf(text_balance_zec_info, text_balance_zec_empty, image_zec_symbol_balance_shadow_empty, image_zec_symbol_balance_empty) headerEmptyViews = arrayOf(text_balance_zec_info, text_balance_zec_empty, image_zec_symbol_balance_shadow_empty, image_zec_symbol_balance_empty)
@ -100,10 +107,13 @@ class HomeFragment : BaseFragment(), HomePresenter.HomeView {
group_empty_view_items.visibility = View.GONE group_empty_view_items.visibility = View.GONE
group_full_view_items.visibility = View.GONE group_full_view_items.visibility = View.GONE
image_logo.setOnClickListener { if (MainActivity.DEV_MODE) {
// forceRedraw() image_logo.setOnClickListener {
// toggleViews(false) mainActivity.navController.navigate(R.id.nav_send_fragment)
header_active_transaction.isActivated = !header_active_transaction.isActivated // forceRedraw()
// toggleViews(false)
}
} }
button_active_transaction_cancel.setOnClickListener { button_active_transaction_cancel.setOnClickListener {
@ -258,7 +268,27 @@ class HomeFragment : BaseFragment(), HomePresenter.HomeView {
private fun onCancelActiveTransaction() { private fun onCancelActiveTransaction() {
button_active_transaction_cancel.isEnabled = false button_active_transaction_cancel.isEnabled = false
button_active_transaction_cancel.text = "canceled" button_active_transaction_cancel.text = "canceled"
header_active_transaction.isActivated = false header_active_transaction.animate().apply {
translationZ(0f)
duration = 200L
interpolator = AccelerateInterpolator()
setListener(object : Animator.AnimatorListener {
override fun onAnimationRepeat(animation: Animator?) {
}
override fun onAnimationEnd(animation: Animator?) {
header_active_transaction.setBackgroundResource(0)
}
override fun onAnimationCancel(animation: Animator?) {
}
override fun onAnimationStart(animation: Animator?) {
}
} )
}
homePresenter.onCancelActiveTransaction() homePresenter.onCancelActiveTransaction()
} }

View File

@ -11,6 +11,9 @@ import android.view.ViewGroup
import androidx.core.text.toSpannable import androidx.core.text.toSpannable
import androidx.databinding.DataBindingUtil import androidx.databinding.DataBindingUtil
import androidx.navigation.fragment.FragmentNavigatorExtras import androidx.navigation.fragment.FragmentNavigatorExtras
import androidx.transition.Fade
import androidx.transition.Transition
import androidx.transition.TransitionInflater
import cash.z.android.wallet.R import cash.z.android.wallet.R
import cash.z.android.wallet.databinding.FragmentSendBinding import cash.z.android.wallet.databinding.FragmentSendBinding
import cash.z.android.wallet.extention.afterTextChanged import cash.z.android.wallet.extention.afterTextChanged
@ -20,6 +23,7 @@ import cash.z.android.wallet.ui.activity.MainActivity
import cash.z.android.wallet.ui.presenter.SendPresenter import cash.z.android.wallet.ui.presenter.SendPresenter
import dagger.Module import dagger.Module
import dagger.android.ContributesAndroidInjector import dagger.android.ContributesAndroidInjector
import kotlinx.android.synthetic.main.include_home_content.*
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import java.text.DecimalFormat import java.text.DecimalFormat
@ -41,6 +45,16 @@ class SendFragment : BaseFragment(), SendPresenter.SendView {
inflater: LayoutInflater, container: ViewGroup?, inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View? { ): View? {
val enterTransitionSet = TransitionInflater.from(mainActivity).inflateTransition(R.transition.transition_zec_sent).apply {
duration = 3500L
}
this.sharedElementReturnTransition = enterTransitionSet
this.sharedElementEnterTransition = enterTransitionSet
this.allowReturnTransitionOverlap = false
allowEnterTransitionOverlap = false
0
return DataBindingUtil.inflate<FragmentSendBinding>( return DataBindingUtil.inflate<FragmentSendBinding>(
inflater, R.layout.fragment_send, container, false inflater, R.layout.fragment_send, container, false
).let { ).let {
@ -107,6 +121,7 @@ class SendFragment : BaseFragment(), SendPresenter.SendView {
launch { launch {
sendPresenter.start() sendPresenter.start()
} }
if(MainActivity.DEV_MODE) showSendDialog()
} }
override fun onPause() { override fun onPause() {
@ -115,11 +130,17 @@ class SendFragment : BaseFragment(), SendPresenter.SendView {
} }
override fun submit(){ override fun submit(){
val extras = FragmentNavigatorExtras( var extras = with(binding) {
binding.dialogSendContents to getString(R.string.transition_active_transaction_background), listOf(dialogSendBackground, dialogSendContents, dialogTextTitle, dialogTextAddress)
binding.dialogTextTitle to getString(R.string.transition_active_transaction_title), .map{ it to it.transitionName }
binding.dialogTextAddress to getString(R.string.transition_active_transaction_address) .let { FragmentNavigatorExtras(*it.toTypedArray()) }
) }
// val extras = FragmentNavigatorExtras(
// binding.dialogSendContents to binding.dialogSendContents.transitionName,
// binding.dialogTextTitle to getString(R.string.transition_active_transaction_title),
// binding.dialogTextAddress to getString(R.string.transition_active_transaction_address),
// binding.dialogSendBackground to getString(R.string.transition_active_transaction_background)
// )
mainActivity.navController.navigate(R.id.nav_home_fragment, mainActivity.navController.navigate(R.id.nav_home_fragment,
null, null,

View File

@ -278,6 +278,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="@color/zcashBlack_54" android:background="@color/zcashBlack_54"
android:transitionName="@string/transition_active_transaction_background"
android:visibility="gone" android:visibility="gone"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
@ -291,7 +292,7 @@
android:backgroundTint="@color/zcashWhite" android:backgroundTint="@color/zcashWhite"
android:clickable="true" android:clickable="true"
android:focusable="true" android:focusable="true"
android:transitionName="@string/transition_active_transaction_background" android:transitionName="@string/transition_active_transaction_card"
android:visibility="gone" android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"

View File

@ -10,23 +10,24 @@
app:layout_behavior="@string/appbar_scrolling_view_behavior"> app:layout_behavior="@string/appbar_scrolling_view_behavior">
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/content_home"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:paddingStart="16dp" android:paddingStart="16dp"
android:paddingTop="30dp" android:paddingTop="30dp"
android:paddingEnd="16dp" android:paddingEnd="16dp"
android:paddingBottom="16dp"> android:paddingBottom="16dp"
android:transitionName="@string/transition_active_transaction_background">
<!-- Active Transaction - primary --> <!-- Active Transaction - primary -->
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/header_active_transaction" android:id="@+id/header_active_transaction"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="70dp" android:layout_height="70dp"
android:background="@drawable/background_rounded_corners" android:background="@drawable/background_rounded_corners_opaque"
android:clipToPadding="false" android:clipToPadding="false"
android:padding="16dp" android:padding="16dp"
android:stateListAnimator="@animator/selector_active_raise" android:transitionName="@string/transition_active_transaction_card"
android:transitionName="@string/transition_active_transaction_background"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">

View File

@ -3,7 +3,9 @@
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
android:transitionOrdering="together"> android:transitionOrdering="together">
<changeBounds/> <changeBounds>
<arcMotion/>
</changeBounds>
<changeTransform/> <changeTransform/>
<changeClipBounds/> <changeClipBounds/>
<changeImageTransform/> <changeImageTransform/>

View File

@ -30,6 +30,7 @@
<string name="transition_active_transaction_background">transition_active_transaction_background</string> <string name="transition_active_transaction_background">transition_active_transaction_background</string>
<string name="transition_active_transaction_title">transition_active_transaction_title</string> <string name="transition_active_transaction_title">transition_active_transaction_title</string>
<string name="transition_active_transaction_address">transition_active_transaction_address</string> <string name="transition_active_transaction_address">transition_active_transaction_address</string>
<string name="transition_active_transaction_card">transition_active_transaction_card</string>
<!-- Screen copy --> <!-- Screen copy -->
<string name="receive_address_title">Your Zcash shielded address</string> <string name="receive_address_title">Your Zcash shielded address</string>