У меня есть функция, которая создает градиент на фоне моего MainActivity
.Градиент создается программно как GradientDrawable
.Определенные взаимодействия в приложении меняют цвет градиента.
Градиент и цвета отображаются правильно, и они меняются соответствующим образом, однако мне бы хотелось, чтобы эффект изменения цвета менялся.Прямо сейчас цвета переходят мгновенно, без перекрестного затухания.
fun createGradient() {
gd.shape = GradientDrawable.RECTANGLE
mainActivityID.background = gd
gd.gradientType = GradientDrawable.LINEAR_GRADIENT
gd.orientation = (GradientDrawable.Orientation.BL_TR)
}
На основе взаимодействий в приложении я использую оператор when
, чтобы изменить цвета GradientDrawable
fun changeGradient(){
//val td = gd as TransitionDrawable
//td.isCrossFadeEnabled = true
//td.startTransition(1500)
when(calories){
in 0..50 -> gd.colors = intArrayOf(
ContextCompat.getColor(this, R.color.dBlue),
ContextCompat.getColor(this, R.color.lBlue)
)
in 51..100 -> gd.colors = intArrayOf(
ContextCompat.getColor(this, R.color.dRed),
ContextCompat.getColor(this, R.color.lRed)
)
// etc...
}
}
Я пытался привести GradientDrawable как TransitionDrawable (как видно из приведенного выше прокомментированного кода), но он завершается с:
java.lang.ClassCastException: android.graphics.drawable.GradientDrawable не может быть приведенto android.graphics.drawable.TransitionDrawable
Как добавить 1500-миллисекундный переход между изменениями цвета GradientDrawable?
Сбой выполнения с java.lang.NegativeArraySizeException: -16777216
when(calories){
in 0..50 -> animateGradient(gd, IntArray(Color.BLACK), IntArray(Color.CYAN))
in 51..100 -> animateGradient(gd, IntArray(Color.RED), IntArray(Color.BLUE))
in 101..150 -> animateGradient(gd, IntArray(Color.GREEN), IntArray(Color.YELLOW))
// etc... about 15 more statements.
}