react-native-navigation的迁移库

ElementTransitionManager.kt 3.3KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package com.reactnativenavigation.views.element
  2. import android.animation.AnimatorSet
  3. import android.view.View
  4. import androidx.core.view.doOnLayout
  5. import com.facebook.react.uimanager.util.ReactFindViewUtil.OnViewFoundListener
  6. import com.facebook.react.uimanager.util.ReactFindViewUtil.findView
  7. import com.reactnativenavigation.parse.AnimationOptions
  8. import com.reactnativenavigation.parse.NestedAnimationsOptions
  9. import com.reactnativenavigation.utils.Functions.Func1
  10. import com.reactnativenavigation.viewcontrollers.ViewController
  11. open class ElementTransitionManager {
  12. private val animatorCreator: TransitionAnimatorCreator = TransitionAnimatorCreator()
  13. fun createTransitions(animation: NestedAnimationsOptions, fromScreen: ViewController<*>, toScreen: ViewController<*>, onAnimatorsCreated: Func1<TransitionSet?>) {
  14. val sharedElements = animation.sharedElements
  15. val elementTransitions = animation.elementTransitions
  16. if (!sharedElements.hasValue() && !elementTransitions.hasValue) {
  17. onAnimatorsCreated.run(TransitionSet())
  18. return
  19. }
  20. val transitionSet = TransitionSet()
  21. for (transitionOptions in sharedElements.get()) {
  22. val transition = SharedElementTransition(toScreen, transitionOptions!!)
  23. findView(fromScreen.view, transition.fromId)?.let { transition.from = it }
  24. findView(toScreen.view, object : OnViewFoundListener {
  25. override fun getNativeId(): String {
  26. return transition.toId
  27. }
  28. override fun onViewFound(view: View) {
  29. view.doOnLayout {
  30. transition.to = view
  31. if (transition.isValid()) transitionSet.add(transition)
  32. if (transitionSet.size() == sharedElements.get().size + elementTransitions.transitions.size) {
  33. onAnimatorsCreated.run(transitionSet)
  34. }
  35. }
  36. }
  37. })
  38. }
  39. for (transitionOptions in elementTransitions.transitions) {
  40. val transition = ElementTransition(transitionOptions)
  41. findView(fromScreen.view, transition.id)?.let {
  42. transition.view = it
  43. transition.viewController = fromScreen
  44. transitionSet.add(transition)
  45. }
  46. if (transition.isValid()) continue
  47. findView(toScreen.view, object : OnViewFoundListener {
  48. override fun getNativeId(): String {
  49. return transition.id
  50. }
  51. override fun onViewFound(view: View) {
  52. view.doOnLayout {
  53. transition.view = view
  54. transition.viewController = toScreen
  55. transitionSet.add(transition)
  56. if (transitionSet.size() == sharedElements.get().size + elementTransitions.transitions.size) {
  57. onAnimatorsCreated.run(transitionSet)
  58. }
  59. }
  60. }
  61. })
  62. }
  63. }
  64. fun createAnimators(fadeAnimation: AnimationOptions?, transitionSet: TransitionSet?): AnimatorSet {
  65. return animatorCreator.create(fadeAnimation!!, transitionSet!!)
  66. }
  67. }