Advertisement
Guest User

Untitled

a guest
Sep 13th, 2019
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 11.57 KB | None | 0 0
  1. package com.merseyside.admin.merseylibrary.presentation
  2.  
  3. import android.animation.Animator
  4. import android.animation.AnimatorSet
  5. import android.animation.ValueAnimator
  6. import android.annotation.TargetApi
  7. import android.os.Build
  8. import android.util.Log
  9. import android.view.View
  10. import java.util.*
  11.  
  12. class ValueAnimatorHelper {
  13.     companion object {
  14.         private val TAG: String = "ValueAnimatorHelper"
  15.     }
  16.  
  17.     enum class AnimAxis {X_AXIS, Y_AXIS}
  18.  
  19.     enum class MainPoint {CENTER, TOP_LEFT, TOP_RIGHT, DOWN_LEFT, DOWN_RIGHT}
  20.  
  21.     //Add percentage implementation
  22.  
  23.     val animationsList : MutableList<Animator> = ArrayList()
  24.     val animatorSet: AnimatorSet = AnimatorSet()
  25.  
  26.  
  27.     class Builder(val view: View) {
  28.  
  29.         lateinit var valueAnimator: ValueAnimator
  30.             private set
  31.  
  32.         private fun recalculateValues(values: FloatArray, mainPoint: MainPoint, animAxis: AnimAxis) : FloatArray {
  33.             if (mainPoint != MainPoint.TOP_LEFT) {
  34.                 val viewSize = when (animAxis) {
  35.                     AnimAxis.X_AXIS -> {
  36.                         view.width
  37.                     }
  38.                     AnimAxis.Y_AXIS -> {
  39.                         view.height
  40.                     }
  41.                 }
  42.  
  43.                 var i = 1
  44.                 while (i < values.size) {
  45.  
  46.                     when (mainPoint) {
  47.                         MainPoint.CENTER -> {
  48.                             values[i] = values[i] - viewSize / 2
  49.                         }
  50.  
  51.                         MainPoint.TOP_RIGHT -> {
  52.                             when (animAxis) {
  53.                                 AnimAxis.X_AXIS ->
  54.                                     values[i] = values[i] + viewSize
  55.                                 AnimAxis.Y_AXIS -> {}
  56.                             }
  57.                         }
  58.  
  59.                         MainPoint.DOWN_LEFT -> {
  60.                             when (animAxis) {
  61.                                 AnimAxis.X_AXIS -> {}
  62.  
  63.                                 AnimAxis.Y_AXIS -> {
  64.                                     values[i] = values[i] - viewSize
  65.                                 }
  66.                             }
  67.                         }
  68.  
  69.                         MainPoint.DOWN_RIGHT -> {
  70.                             when (animAxis) {
  71.                                 AnimAxis.X_AXIS -> {
  72.                                     values[i] = values[i] - viewSize
  73.                                 }
  74.                                 AnimAxis.Y_AXIS -> {
  75.                                     values[i] = values[i] - viewSize
  76.                                 }
  77.                             }
  78.                         }
  79.                         else -> {}
  80.                     }
  81.                     i++
  82.                 }
  83.             }
  84.  
  85.             return values
  86.         }
  87.  
  88.         fun translateAnimationPercent(vararg percents: Float, mainPoint: MainPoint = MainPoint.CENTER,
  89.                                       animAxis: AnimAxis, duration: Long, updateListener : ValueAnimator.AnimatorUpdateListener? = null,
  90.                                       animatorListener: Animator.AnimatorListener? = null) : Builder {
  91.  
  92.             val newValues = FloatArray(percents.size)
  93.  
  94.             val viewSize = when (animAxis) {
  95.                 AnimAxis.X_AXIS -> {
  96.                     (view.parent as View).width
  97.                 }
  98.                 AnimAxis.Y_AXIS -> {
  99.                     (view.parent as View).height
  100.                 }
  101.             }
  102.  
  103.             var i = 0
  104.             while (i < percents.size) {
  105.  
  106.                 newValues[i] = viewSize * percents[i]
  107.                 i++
  108.             }
  109.  
  110.             return translateAnimation(*newValues, mainPoint = mainPoint, animAxis = animAxis,
  111.                 duration = duration, listener = updateListener, animatorListener = animatorListener)
  112.         }
  113.  
  114.         fun translateAnimation(vararg floats: Float, mainPoint: MainPoint = MainPoint.CENTER, animAxis: AnimAxis,
  115.                                duration: Long, listener : ValueAnimator.AnimatorUpdateListener? = null,
  116.                                animatorListener: Animator.AnimatorListener? = null) : Builder {
  117.  
  118.             var array = floats.toMutableList()
  119.  
  120.             if (floats.size == 1) {
  121.  
  122.                 when (animAxis) {
  123.                     AnimAxis.Y_AXIS ->
  124.                         array.add(0, view.y)
  125.                     AnimAxis.X_AXIS ->
  126.                         array.add(0, view.x)
  127.                 }
  128.             }
  129.  
  130.             array = recalculateValues(array.toFloatArray(), mainPoint, animAxis).toMutableList()
  131.  
  132.             valueAnimator = ValueAnimator.ofFloat(*array.toFloatArray()).apply {
  133.                 this.duration = duration
  134.                 if (listener == null) {
  135.                     addUpdateListener { valueAnimator ->
  136.                         val value = valueAnimator.animatedValue as Float
  137.  
  138.                         when (animAxis) {
  139.                             AnimAxis.X_AXIS ->
  140.                                 view.x = value
  141.  
  142.                             AnimAxis.Y_AXIS ->
  143.                                 view.y = value
  144.                         }
  145.  
  146.                         view.requestLayout()
  147.                     }
  148.                 } else {
  149.                     addUpdateListener(listener)
  150.                 }
  151.             }
  152.  
  153.             if (animatorListener != null)
  154.                 valueAnimator.addListener(animatorListener)
  155.  
  156.             return this
  157.         }
  158.  
  159.         fun changeSizeAnimationPercent(vararg percents: Float, animAxis: AnimAxis, duration: Long,
  160.                                        listener : ValueAnimator.AnimatorUpdateListener? = null,
  161.                                        animatorListener: Animator.AnimatorListener? = null) : Builder {
  162.  
  163.             val newValues = IntArray(percents.size)
  164.  
  165.             val viewSize = when (animAxis) {
  166.                 AnimAxis.X_AXIS -> {
  167.                     view.width
  168.                 }
  169.                 AnimAxis.Y_AXIS -> {
  170.                     view.height
  171.                 }
  172.             }
  173.  
  174.             var i = 0
  175.             while (i < percents.size) {
  176.  
  177.                 newValues[i] = (viewSize * percents[i]).toInt()
  178.                 i++
  179.             }
  180.  
  181.             return changeSizeAnimation(*newValues, animAxis = animAxis, duration = duration, listener = listener, animatorListener = animatorListener)
  182.         }
  183.  
  184.         fun changeSizeAnimation(vararg ints: Int, animAxis: AnimAxis, duration: Long,
  185.                                 listener : ValueAnimator.AnimatorUpdateListener? = null,
  186.                                 animatorListener: Animator.AnimatorListener? = null) : Builder {
  187.  
  188.             var array = ints.toMutableList()
  189.  
  190.             if (ints.size == 1) {
  191.  
  192.                 when (animAxis) {
  193.                     AnimAxis.Y_AXIS ->
  194.                         array.add(0, view.height)
  195.                     AnimAxis.X_AXIS -> {
  196.                         array.add(0, view.width)
  197.                         Log.d(TAG, "${view.layoutParams.width}")
  198.                     }
  199.  
  200.                 }
  201.             }
  202.  
  203.             valueAnimator = ValueAnimator.ofInt(*array.toIntArray()).apply {
  204.                 this.duration = duration
  205.                 if (listener == null) {
  206.                     addUpdateListener { valueAnimator ->
  207.                         val value = valueAnimator.animatedValue as Int
  208.  
  209.                         when (animAxis) {
  210.                             AnimAxis.X_AXIS -> {
  211.                                 view.layoutParams.width = value
  212.                             }
  213.  
  214.                             AnimAxis.Y_AXIS -> {
  215.                                 view.layoutParams.height = value
  216.                             }
  217.                         }
  218.                     }
  219.                 }
  220.             }
  221.  
  222.             return this
  223.         }
  224.  
  225.         fun scaleAnimation(vararg floats: Float, animAxis: AnimAxis, duration: Long,
  226.                            listener : ValueAnimator.AnimatorUpdateListener? = null,
  227.                            animatorListener: Animator.AnimatorListener? = null) : Builder {
  228.             valueAnimator = ValueAnimator.ofFloat(*floats).apply {
  229.                 this.duration = duration
  230.                 if (listener == null) {
  231.                     addUpdateListener { valueAnimator ->
  232.                         val value = valueAnimator.animatedValue as Float
  233.  
  234.                         when (animAxis) {
  235.                             AnimAxis.X_AXIS -> {
  236.                                 view.scaleX = value
  237.                                 view.requestLayout()
  238.                             }
  239.  
  240.                             AnimAxis.Y_AXIS -> {
  241.                                 view.scaleY = value
  242.                                 view.requestLayout()
  243.                             }
  244.                         }
  245.                     }
  246.                 } else {
  247.                     addUpdateListener(listener)
  248.                 }
  249.             }
  250.  
  251.             if (animatorListener != null)
  252.                 valueAnimator.addListener(animatorListener)
  253.  
  254.             return this
  255.         }
  256.  
  257.         fun alphaAnimation(vararg floats: Float, duration: Long,
  258.                            listener : ValueAnimator.AnimatorUpdateListener? = null,
  259.                            animatorListener: Animator.AnimatorListener? = null) : Builder {
  260.             valueAnimator = ValueAnimator.ofFloat(*floats).apply {
  261.                 this.duration = duration
  262.                 if (listener == null) {
  263.                     addUpdateListener { valueAnimator ->
  264.                         val value = valueAnimator.animatedValue as Float
  265.  
  266.                         view.alpha = value
  267.                     }
  268.                 } else {
  269.                     addUpdateListener(listener)
  270.                 }
  271.             }
  272.  
  273.             if (animatorListener != null)
  274.                 valueAnimator.addListener(animatorListener)
  275.  
  276.             return this
  277.         }
  278.  
  279.         @TargetApi(Build.VERSION_CODES.LOLLIPOP)
  280.         fun rgbsAnimation(vararg ints: Int, duration: Long, listener : ValueAnimator.AnimatorUpdateListener? = null,
  281.                           animatorListener: Animator.AnimatorListener? = null) : Builder {
  282.             valueAnimator = ValueAnimator.ofArgb(*ints).apply {
  283.                 this.duration = duration
  284.                 if (listener == null) {
  285.                     addUpdateListener { valueAnimator ->
  286.                         val value = valueAnimator.animatedValue as Int
  287.  
  288.                         view.setBackgroundColor(value)
  289.                     }
  290.                 } else {
  291.                     addUpdateListener(listener)
  292.                     valueAnimator.repeatMode
  293.                 }
  294.             }
  295.  
  296.             if (animatorListener != null)
  297.                 valueAnimator.addListener(animatorListener)
  298.  
  299.             return this
  300.         }
  301.  
  302.         fun build() : ValueAnimator {
  303.             return valueAnimator
  304.         }
  305.     }
  306.  
  307.     fun addAnimation(valueAnimator: ValueAnimator) : ValueAnimator {
  308.         animationsList.add(valueAnimator)
  309.         return valueAnimator
  310.     }
  311.  
  312.     fun reverse() {
  313.         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
  314.             animatorSet.reverse()
  315.         } else {
  316.             for (animator in animatorSet.childAnimations) {
  317.                 (animator as ValueAnimator).reverse()
  318.             }
  319.         }
  320.     }
  321.  
  322.     fun playSequentially() {
  323.         animatorSet.playSequentially(animationsList)
  324.         animatorSet.start()
  325.     }
  326.  
  327.     fun playTogether() {
  328.         animatorSet.playTogether(animationsList)
  329.         animatorSet.start()
  330.  
  331.     }
  332.  
  333.     fun isEmpty() : Boolean {
  334.         return animationsList.isEmpty()
  335.     }
  336. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement