react-native-navigation的迁移库

MatrixAnimator.kt 1.6KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. package com.reactnativenavigation.views.element.animators
  2. import android.animation.Animator
  3. import android.animation.ObjectAnimator
  4. import android.animation.TypeEvaluator
  5. import android.graphics.Rect
  6. import android.view.View
  7. import com.facebook.drawee.drawable.ScalingUtils.InterpolatingScaleType
  8. import com.facebook.react.views.image.ReactImageView
  9. import com.reactnativenavigation.parse.SharedElementTransitionOptions
  10. import com.reactnativenavigation.utils.ViewUtils
  11. class MatrixAnimator(from: View, to: View) : PropertyAnimatorCreator<ReactImageView>(from, to) {
  12. override fun shouldAnimateProperty(fromChild: ReactImageView, toChild: ReactImageView): Boolean {
  13. return !ViewUtils.areDimensionsEqual(from, to)
  14. }
  15. override fun create(options: SharedElementTransitionOptions): Animator {
  16. with(to as ReactImageView) {
  17. hierarchy.actualImageScaleType = InterpolatingScaleType(
  18. getScaleType(from),
  19. getScaleType(to),
  20. calculateBounds(from),
  21. calculateBounds(to)
  22. )
  23. return ObjectAnimator.ofObject(TypeEvaluator<Float> { fraction: Float, _: Any, _: Any ->
  24. hierarchy.actualImageScaleType?.let {
  25. (hierarchy.actualImageScaleType as InterpolatingScaleType?)!!.value = fraction
  26. to.invalidate()
  27. }
  28. null
  29. }, 0, 1).setDuration(options.getDuration())
  30. }
  31. }
  32. private fun getScaleType(child: View) = (child as ReactImageView).hierarchy.actualImageScaleType
  33. private fun calculateBounds(view: View): Rect = Rect(0, 0, view.width, view.height)
  34. }