react-native-navigation的迁移库

AnimationOptions.kt 4.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. package com.reactnativenavigation.parse
  2. import android.animation.Animator
  3. import android.animation.AnimatorSet
  4. import android.util.Property
  5. import android.util.TypedValue.COMPLEX_UNIT_DIP
  6. import android.util.TypedValue.COMPLEX_UNIT_FRACTION
  7. import android.view.View
  8. import android.view.View.*
  9. import com.reactnativenavigation.parse.params.Bool
  10. import com.reactnativenavigation.parse.params.NullBool
  11. import com.reactnativenavigation.parse.params.NullText
  12. import com.reactnativenavigation.parse.params.Text
  13. import com.reactnativenavigation.parse.parsers.BoolParser
  14. import com.reactnativenavigation.parse.parsers.TextParser
  15. import com.reactnativenavigation.utils.CollectionUtils
  16. import org.json.JSONObject
  17. import java.util.*
  18. import kotlin.math.max
  19. open class AnimationOptions(json: JSONObject?) {
  20. constructor() : this(null)
  21. private fun parse(json: JSONObject?) {
  22. json?.let {
  23. val iter = json.keys()
  24. while (iter.hasNext()) {
  25. when (val key = iter.next()) {
  26. "id" -> id = TextParser.parse(json, key)
  27. "enable", "enabled" -> enabled = BoolParser.parse(json, key)
  28. "waitForRender" -> waitForRender = BoolParser.parse(json, key)
  29. else -> valueOptions.add(ValueAnimationOptions.parse(json.optJSONObject(key), getAnimProp(key)))
  30. }
  31. }
  32. }
  33. }
  34. @JvmField
  35. var id: Text = NullText()
  36. @JvmField
  37. var enabled: Bool = NullBool()
  38. @JvmField
  39. var waitForRender: Bool = NullBool()
  40. private var valueOptions = HashSet<ValueAnimationOptions>()
  41. fun mergeWith(other: AnimationOptions) {
  42. if (other.id.hasValue()) id = other.id
  43. if (other.enabled.hasValue()) enabled = other.enabled
  44. if (other.waitForRender.hasValue()) waitForRender = other.waitForRender
  45. if (other.valueOptions.isNotEmpty()) valueOptions = other.valueOptions
  46. }
  47. fun mergeWithDefault(defaultOptions: AnimationOptions) {
  48. if (!id.hasValue()) id = defaultOptions.id
  49. if (!enabled.hasValue()) enabled = defaultOptions.enabled
  50. if (!waitForRender.hasValue()) waitForRender = defaultOptions.waitForRender
  51. if (valueOptions.isEmpty()) valueOptions = defaultOptions.valueOptions
  52. }
  53. fun hasValue(): Boolean {
  54. return id.hasValue() || enabled.hasValue() || waitForRender.hasValue()
  55. }
  56. fun getAnimation(view: View): AnimatorSet {
  57. return getAnimation(view, AnimatorSet())
  58. }
  59. fun getAnimation(view: View, defaultAnimation: AnimatorSet): AnimatorSet {
  60. if (!hasAnimation()) return defaultAnimation
  61. val animationSet = AnimatorSet()
  62. val animators: MutableList<Animator> = ArrayList()
  63. CollectionUtils.forEach(valueOptions) { options: ValueAnimationOptions -> animators.add(options.getAnimation(view)) }
  64. animationSet.playTogether(animators)
  65. return animationSet
  66. }
  67. val duration: Int
  68. get() = CollectionUtils.reduce(valueOptions, 0, { item: ValueAnimationOptions, currentValue: Int -> max(item.duration[currentValue], currentValue) })
  69. open fun hasAnimation(): Boolean = valueOptions.isNotEmpty()
  70. fun isFadeAnimation(): Boolean = valueOptions.size == 1 && valueOptions.find(ValueAnimationOptions::isAlpha) != null
  71. fun setValueDy(animation: Property<View?, Float?>?, fromDelta: Float, toDelta: Float) {
  72. CollectionUtils.first(valueOptions, { o: ValueAnimationOptions -> o.equals(animation) }) { param: ValueAnimationOptions ->
  73. param.setFromDelta(fromDelta)
  74. param.setToDelta(toDelta)
  75. }
  76. }
  77. companion object {
  78. private fun getAnimProp(key: String): Triple<Property<View, Float>, Int, (View) -> Float> {
  79. when (key) {
  80. "x" -> return Triple(X, COMPLEX_UNIT_DIP, View::getX)
  81. "y" -> return Triple(Y, COMPLEX_UNIT_DIP, View::getY)
  82. "translationX" -> return Triple(TRANSLATION_X, COMPLEX_UNIT_DIP, View::getTranslationX)
  83. "translationY" -> return Triple(TRANSLATION_Y, COMPLEX_UNIT_DIP, View::getTranslationY)
  84. "alpha" -> return Triple(ALPHA, COMPLEX_UNIT_FRACTION, View::getAlpha)
  85. "scaleX" -> return Triple(SCALE_X, COMPLEX_UNIT_FRACTION, View::getScaleX)
  86. "scaleY" -> return Triple(SCALE_Y, COMPLEX_UNIT_FRACTION, View::getScaleY)
  87. "rotationX" -> return Triple(ROTATION_X, COMPLEX_UNIT_FRACTION, View::getRotationX)
  88. "rotationY" -> return Triple(ROTATION_Y, COMPLEX_UNIT_FRACTION, View::getRotationY)
  89. "rotation" -> return Triple(ROTATION, COMPLEX_UNIT_FRACTION, View::getRotation)
  90. }
  91. throw IllegalArgumentException("This animation is not supported: $key")
  92. }
  93. }
  94. init {
  95. json?.let { parse(it) }
  96. }
  97. }