Driics

Untitled

Jul 20th, 2023
1,200
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 2.57 KB | None | 0 0
  1. class ChartAnimator(
  2.     private val animatorFactory: AnimatorFactory,
  3.     private val animationFilters: ObservableWrapper<List<AnimationFilter>, AnimatePayload>
  4. ) {
  5.  
  6.     private val animator = animatorFactory.createFloatAnimator(duration = 500L, valueStart = 0f, valueEnd = 1f)
  7.  
  8.     private val currentFilters = mutableListOf<AnimationFilter>()
  9.     private val previousFilters = mutableListOf<AnimationFilter>()
  10.     private val customFilters = mutableListOf<CustomAnimationFilter>()
  11.  
  12.     private val filteredData = ObservableData(emptyList<AnimationFilter>())
  13.  
  14.     init {
  15.         animationFilters.registerObserver(::onAnimationFiltersChanged)
  16.     }
  17.  
  18.     fun getFilteredData() = filteredData
  19.  
  20.     fun isAnimating() = animator.isRunning
  21.  
  22.     fun onAnimationFiltersChanged(filters: List<AnimationFilter>, payload: AnimatePayload) {
  23.         if (!payload.animate) {
  24.             animator.stopAnimation(1f)
  25.             updateFilteredData()
  26.             return
  27.         }
  28.  
  29.         previousFilters.clear()
  30.         previousFilters.addAll(filteredData.value)
  31.  
  32.         currentFilters.clear()
  33.         currentFilters.addAll(filters.sortedBy { it.startTime })
  34.  
  35.         // Add start/end filters if sizes differ
  36.         val (shorter, longer) = if (previousFilters.size < currentFilters.size) {
  37.             previousFilters to currentFilters
  38.         } else {
  39.             currentFilters to previousFilters
  40.         }
  41.  
  42.         val startFilter = if (shorter.isEmpty()) {
  43.             createStartFilter(longer.first())
  44.         } else {
  45.             createEndFilter(shorter.last())
  46.         }
  47.  
  48.         while (shorter.size < longer.size) {
  49.             shorter.add(startFilter)
  50.         }
  51.  
  52.         customFilters.clear()
  53.         longer.forEachIndexed { i, filter ->
  54.             customFilters.add(CustomAnimationFilter(previousFilters[i], currentFilters[i]))
  55.         }
  56.  
  57.         animator.animate(0f, 1f, payload.animate)
  58.     }
  59.  
  60.     fun updateAnimation() {
  61.         if (animator.isRunning) {
  62.             val progress = animator.progress
  63.             customFilters.forEach { it.update(progress) }
  64.             updateFilteredData()
  65.         }
  66.     }
  67.  
  68.     private fun updateFilteredData() {
  69.         filteredData.value = customFilters
  70.     }
  71.  
  72.     private fun createStartFilter(base: AnimationFilter) =
  73.         ChartAnimationFilter(ChartData(listOf(ChartPoint(base.endTime, base.startValue))))
  74.  
  75.     private fun createEndFilter(base: AnimationFilter) =
  76.         ChartAnimationFilter(ChartData(listOf(ChartPoint(base.startTime, base.endValue))))
  77.  
  78. }
  79.  
  80. data class AnimatePayload(val animate: Boolean)
Advertisement
Add Comment
Please, Sign In to add comment