react-native-navigation的迁移库

ValueAnimationOptions.kt 3.4KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. package com.reactnativenavigation.parse
  2. import android.animation.Animator
  3. import android.animation.ObjectAnimator
  4. import android.util.Property
  5. import android.util.TypedValue
  6. import android.view.View
  7. import com.reactnativenavigation.parse.params.*
  8. import com.reactnativenavigation.parse.params.Number
  9. import com.reactnativenavigation.parse.parsers.FloatParser
  10. import com.reactnativenavigation.parse.parsers.InterpolationParser
  11. import com.reactnativenavigation.parse.parsers.NumberParser
  12. import com.reactnativenavigation.utils.UiUtils.dpToPx
  13. import org.json.JSONObject
  14. class ValueAnimationOptions {
  15. private var animProp: Property<View, Float>? = null
  16. private var animPropType: Int? = null
  17. private var animationValueAccessor: ((View) -> Float)? = null
  18. private var from: FloatParam = NullFloatParam()
  19. private var fromDelta = FloatParam(0f)
  20. private var to: FloatParam = NullFloatParam()
  21. private var toDelta = FloatParam(0f)
  22. var duration: Number = NullNumber()
  23. private var startDelay: Number = NullNumber()
  24. private var interpolation = Interpolation.NO_VALUE
  25. fun setFromDelta(fromDelta: Float) {
  26. this.fromDelta = FloatParam(fromDelta)
  27. }
  28. fun setToDelta(toDelta: Float) {
  29. this.toDelta = FloatParam(toDelta)
  30. }
  31. fun getAnimation(view: View): Animator {
  32. require(!(!from.hasValue() && !to.hasValue())) { "Params 'from' and 'to' are mandatory" }
  33. var from = fromDelta.get()
  34. var to = toDelta.get()
  35. if (animPropType == TypedValue.COMPLEX_UNIT_DIP) {
  36. from += dpToPx(view.context, this.from[animationValueAccessor!!(view)])
  37. to += dpToPx(view.context, this.to[animationValueAccessor!!(view)])
  38. } else {
  39. from += this.from[animationValueAccessor!!(view)]
  40. to += this.to[animationValueAccessor!!(view)]
  41. }
  42. val animator = ObjectAnimator.ofFloat(view,
  43. animProp,
  44. from,
  45. to
  46. )
  47. animator.interpolator = interpolation.interpolator
  48. if (duration.hasValue()) animator.duration = duration.get().toLong()
  49. if (startDelay.hasValue()) animator.startDelay = startDelay.get().toLong()
  50. return animator
  51. }
  52. override fun equals(o: Any?): Boolean {
  53. if (this === o) return true
  54. return if (o == null || javaClass != o.javaClass) false else animProp == (o as ValueAnimationOptions).animProp
  55. }
  56. fun equals(animationProperty: Property<View?, Float?>): Boolean {
  57. return animProp!!.name == animationProperty.name
  58. }
  59. override fun hashCode(): Int {
  60. return animProp.hashCode()
  61. }
  62. fun isAlpha(): Boolean = animProp == View.ALPHA
  63. companion object {
  64. fun parse(json: JSONObject?, property: Triple<Property<View, Float>?, Int?, (View) -> Float>): ValueAnimationOptions {
  65. val options = ValueAnimationOptions()
  66. options.animProp = property.first
  67. options.animPropType = property.second
  68. options.animationValueAccessor = property.third
  69. options.from = FloatParser.parse(json, "from")
  70. options.to = FloatParser.parse(json, "to")
  71. options.duration = NumberParser.parse(json, "duration")
  72. options.startDelay = NumberParser.parse(json, "startDelay")
  73. options.interpolation = InterpolationParser.parse(json, "interpolation")
  74. return options
  75. }
  76. }
  77. }