Driics

Untitled

Jul 19th, 2023
1,243
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 2.83 KB | None | 0 0
  1. class PfpChartSegmentAnimator(
  2.     animatorFactory: AnimatorFactory,
  3.     observableWrapper: ObservableWrapper<List<AnimationFilter>, Payload>
  4. ) {
  5.     private val animationWrapper: ObservableWrapper<List<AnimationFilter>, Payload> = observableWrapper
  6.     private val animator: Animation = animatorFactory.createAnimator(0.5f, 0.0f, AccelerateDecelerateInterpolator())
  7.  
  8.     private val currentFilters: MutableList<AnimationFilter> = mutableListOf()
  9.     private val targetFilters: MutableList<AnimationFilter> = mutableListOf()
  10.     private val customFilters: MutableList<CustomAnimationFilter> = mutableListOf()
  11.  
  12.     private val animationData: ObservableData<List<AnimationFilter>, Unit> = ObservableData(emptyList())
  13.  
  14.     init {
  15.         observableWrapper.registerObserver { filters, payload ->
  16.             onDataSetChanged(filters, payload)
  17.         }
  18.     }
  19.  
  20.     private fun onDataSetChanged(filters: List<AnimationFilter>, payload: Payload) {
  21.         if (!payload.animate) {
  22.             animator.stop()
  23.             updateAnimationData()
  24.             return
  25.         }
  26.  
  27.         currentFilters.clear()
  28.         currentFilters.addAll(animationWrapper.getData())
  29.  
  30.         filters.sortedBy { it.startTime }
  31.  
  32.         targetFilters.clear()
  33.         targetFilters.addAll(filters)
  34.  
  35.         if (currentFilters.size < targetFilters.size) {
  36.             val firstFilter = targetFilters.first()
  37.             val newFilter = createAnimationFilter(firstFilter.endTime, firstFilter.startValue)
  38.             targetFilters.add(0, newFilter)
  39.         } else {
  40.             val lastFilter = currentFilters.last()
  41.             val newFilter = createAnimationFilter(lastFilter.startTime, lastFilter.endValue)
  42.             currentFilters.add(newFilter)
  43.         }
  44.  
  45.         customFilters.clear()
  46.         for (i in targetFilters.indices) {
  47.             val currentFilter = currentFilters[i]
  48.             val targetFilter = targetFilters[i]
  49.             customFilters.add(CustomAnimationFilter(currentFilter, targetFilter))
  50.         }
  51.  
  52.         animator.start(0.0f, 1.0f, payload.animate)
  53.     }
  54.  
  55.     private fun createAnimationFilter(time: Long, value: Double): AnimationFilter {
  56.         return AnimationFilter(time, value)
  57.     }
  58.  
  59.     private fun updateAnimationData() {
  60.         val data = if (animator.isRunning()) customFilters else animationWrapper.getData()
  61.         animationData.updateData(data)
  62.     }
  63.  
  64.     fun getAnimationData(): ObservableData<List<AnimationFilter>, Unit> {
  65.         return animationData
  66.     }
  67.  
  68.     fun isAnimating(): Boolean {
  69.         return animator.isRunning()
  70.     }
  71.  
  72.     fun onAnimationUpdate() {
  73.         if (animator.isRunning()) {
  74.             val progress = animator.getProgress()
  75.             for (filter in customFilters) {
  76.                 filter.setProgress(progress)
  77.             }
  78.             updateAnimationData()
  79.         }
  80.     }
  81. }
Advertisement
Add Comment
Please, Sign In to add comment