Анимация изменения цвета фона просмотра на Android

Как анимировать изменение цвета фона представления на Android?

Например:

У меня вид с красным фоном. Цвет фона представления изменится на синий. Как сделать плавный переход между цветами?

Если это невозможно сделать с помощью представлений, будет приветствоваться альтернатива.


person hpique    schedule 10.04.2010    source источник
comment
Можно было бы ожидать, что плавный переход между цветами не должен стать проблемой для такой платформы, как Android. Хотя, возможно, представления не созданы для этого. Вопрос все еще стоит.   -  person hpique    schedule 11.04.2010
comment
Хороший видеоурок   -  person Alex Jolig    schedule 08.04.2017


Ответы (18)


В итоге я нашел (довольно хорошее) решение этой проблемы!

Для выполнить это. Например, в XML-файле в папке с возможностью переноса можно написать что-то вроде:

<?xml version="1.0" encoding="UTF-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- The drawables used here can be solid colors, gradients, shapes, images, etc. -->
    <item android:drawable="@drawable/original_state" />
    <item android:drawable="@drawable/new_state" />
</transition>

Затем в вашем XML для фактического представления вы должны ссылаться на этот TransitionDrawable в атрибуте android:background.

На этом этапе вы можете инициировать переход в своем коде по команде, выполнив:

TransitionDrawable transition = (TransitionDrawable) viewObj.getBackground();
transition.startTransition(transitionTime);

Или запустите переход в обратном порядке, позвонив:

transition.reverseTransition(transitionTime);

См. ответ Романа для получения информации о другом решении с использованием API анимации свойств, которое не было доступно на момент публикации этого ответа.

person idolize    schedule 08.07.2010
comment
Спасибо mxrider! Это действительно ответ на вопрос. К сожалению, для меня это не работает, потому что представление, которое имеет TransitionDrawable в качестве фона, также должно быть анимировано, и кажется, что анимация представления переопределяет фоновый переход. Любые идеи? - person hpique; 10.07.2010
comment
Решил, запустив TransitionDrawable ПОСЛЕ запуска анимации. - person hpique; 10.07.2010
comment
Потрясающие! Рад, что у вас все получилось! Есть много интересных вещей, которые вы можете сделать в xml с Android - большая часть из которых похоронена в документации и, на мой взгляд, неочевидна. - person idolize; 10.07.2010
comment
Совсем не очевидно. Следует отметить, что в моем случае я не использую xml, так как цвет динамический. Ваше решение также работает, если вы создаете TransitionDrawable с помощью кода. - person hpique; 10.07.2010
comment
Можно ли использовать этот метод в циклическом или автоматическом реверсе, например, в UIView анимации на iOS? - person Dan F; 22.05.2013
comment
Он не работает плавно перекрестное затухание, как я ожидал. с помощью устройства 4.1.2. - person Youngjae; 30.12.2013
comment
Как насчет фоновой анимации текстового просмотра от предыдущего цвета к следующему? - person Si8; 02.01.2014
comment
У меня был xml как чертеж, и я хотел перейти на другой xml. Этот метод работает в таком случае. - person Darpan; 01.09.2015
comment
@idolize я хочу, чтобы этот эффект постоянно. Я попробовал это с помощью таймера. но это не гладко. что я должен делать - person DKV; 19.11.2015
comment
Одним из основных недостатков является отсутствие слушателя завершения анимации. - person Leo Droidcoder; 16.08.2018
comment
можно ли анимировать более двух цветов? - person Narek Hayrapetyan; 13.07.2019
comment
Большое спасибо. Я трачу 5 часов, чтобы найти это решение - person Duong Phan; 24.11.2020

Для цветной анимации можно использовать новый Property Animation Api:

int colorFrom = getResources().getColor(R.color.red);
int colorTo = getResources().getColor(R.color.blue);
ValueAnimator colorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), colorFrom, colorTo);
colorAnimation.setDuration(250); // milliseconds
colorAnimation.addUpdateListener(new AnimatorUpdateListener() {

    @Override
    public void onAnimationUpdate(ValueAnimator animator) {
        textView.setBackgroundColor((int) animator.getAnimatedValue());
    }

});
colorAnimation.start();

Для обратной совместимости с Android 2.x используйте Девять старых библиотек Android от Джейка Уортона.

Метод getColor устарел в Android M, поэтому у вас есть два варианта:

  • Если вы используете библиотеку поддержки, вам нужно заменить вызовы getColor на:

    ContextCompat.getColor(this, R.color.red);
    
  • если вы не используете библиотеку поддержки, вам необходимо заменить вызовы getColor на:

    getColor(R.color.red);
    
person Roman Minenok    schedule 22.01.2013
comment
обязательно иметь решение, если вы используете API анимации свойств (или NineOldAndroid). Анимирует очень плавно. - person Dmitry Zaytsev; 06.02.2014
comment
Есть ли способ таким образом установить продолжительность перехода? - person iGio90; 22.03.2014
comment
@ iGio90 да, вы не поверите, но вызов метода setDuration () :) - person Roman Minenok; 02.05.2014
comment
я могу сделать это с помощью чертежей? - person cmario; 09.03.2016
comment
ValueAnimator.ofArgb(colorFrom, colorTo) выглядит более точным, но, к сожалению, это ново. - person TWiStErRob; 29.03.2016
comment
Красивое решение! Спасибо. - person Steve Folly; 03.08.2016
comment
Чтобы получить текущий цвет фона макета, используйте этот код. ((ColorDrawable)frame_layout.getBackground()).getColor() - person VoW; 22.08.2016
comment
ArgbEvaluator теперь приватный, не используйте его. Юридические причины. - person Pedro Paulo Amorim; 09.08.2017
comment
@PedroPauloAmorim, почему ты думаешь, что это теперь личное? Документация с вами не согласна. - person Roman Minenok; 11.08.2017
comment
ArgbEvaluator из android.animation не ограничен, но тот же класс android.support.graphics.drawable помечен как @RestrictTo(LIBRARY_GROUP). Выдает предупреждение. - person Pedro Paulo Amorim; 11.08.2017

В зависимости от того, как ваше представление получает цвет фона и как вы получаете целевой цвет, есть несколько разных способов сделать это.

Первые два используют структуру Android Property Animation.

Используйте Object Animator, если:

  • Цвет фона вашего представления определен как значение argb в файле xml.
  • Цвет вашего представления ранее был установлен view.setBackgroundColor()
  • Цвет фона вашего представления определен в чертеже, который НЕ определяет какие-либо дополнительные свойства, такие как обводка или радиусы углов.
  • Цвет фона вашего представления определен в чертеже, и вы хотите удалить любые дополнительные свойства, такие как обводка или радиусы углов, имейте в виду, что удаление дополнительных свойств не будет анимировано.

Аниматор объекта работает, вызывая view.setBackgroundColor, который заменяет определенный drawable, если он не является экземпляром ColorDrawable, что бывает редко. Это означает, что любые дополнительные свойства фона из рисования, например обводки или углов, будут удалены.

Используйте Value Animator, если:

  • Цвет фона вашего представления определен в Drawable, который также устанавливает такие свойства, как обводка или радиусы углов, И вы хотите изменить его на новый цвет, который определяется во время работы.

Используйте переход с возможностью рисования, если:

  • Ваше представление должно переключаться между двумя чертежами, которые были определены перед развертыванием.

У меня были некоторые проблемы с производительностью с чертежами Transition, которые выполняются, пока я открываю DrawerLayout, которые я не смог решить, поэтому, если вы столкнетесь с каким-либо неожиданным заиканием, вы можете столкнуться с той же ошибкой, что и я.

Вам придется изменить пример Value Animator, если вы хотите использовать Можно рисовать списки состояний или создавать списки слоев, в противном случае произойдет сбой в строке final GradientDrawable background = (GradientDrawable) view.getBackground();.

Object Animator:

Просмотр определения:

<View
    android:background="#FFFF0000"
    android:layout_width="50dp"
    android:layout_height="50dp"/>

Создайте и используйте ObjectAnimator вот так.

final ObjectAnimator backgroundColorAnimator = ObjectAnimator.ofObject(view,
                                                                       "backgroundColor",
                                                                       new ArgbEvaluator(),
                                                                       0xFFFFFFFF,
                                                                       0xff78c5f9);
backgroundColorAnimator.setDuration(300);
backgroundColorAnimator.start();

Вы также можете загрузить определение анимации из xml с помощью AnimatorInflater, как это делает XMight в Android objectAnimator animate backgroundColor of Layout

Value Animator:

Просмотр определения:

<View
    android:background="@drawable/example"
    android:layout_width="50dp"
    android:layout_height="50dp"/>

Возможное определение:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#FFFFFF"/>
    <stroke
        android:color="#edf0f6"
        android:width="1dp"/>
    <corners android:radius="3dp"/>

</shape>

Создайте и используйте ValueAnimator следующим образом:

final ValueAnimator valueAnimator = ValueAnimator.ofObject(new ArgbEvaluator(),
                                                           0xFFFFFFFF,
                                                           0xff78c5f9);

final GradientDrawable background = (GradientDrawable) view.getBackground();
currentAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

    @Override
    public void onAnimationUpdate(final ValueAnimator animator) {
        background.setColor((Integer) animator.getAnimatedValue());
    }

});
currentAnimation.setDuration(300);
currentAnimation.start();

Переход с возможностью рисования:

Просмотр определения:

<View
    android:background="@drawable/example"
    android:layout_width="50dp"
    android:layout_height="50dp"/>

Возможное определение:

<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape>
            <solid android:color="#FFFFFF"/>
            <stroke
                android:color="#edf0f6"
                android:width="1dp"/>
            <corners android:radius="3dp"/>
        </shape>
    </item>

    <item>
        <shape>
            <solid android:color="#78c5f9"/>
            <stroke
                android:color="#68aff4"
                android:width="1dp"/>
            <corners android:radius="3dp"/>
        </shape>
    </item>
</transition>

Используйте TransitionDrawable следующим образом:

final TransitionDrawable background = (TransitionDrawable) view.getBackground();
background.startTransition(300);

Вы можете отменить анимацию, вызвав .reverse() в экземпляре анимации.

Есть и другие способы создания анимации, но эти три, вероятно, наиболее распространены. Обычно я использую ValueAnimator.

person Mattias    schedule 10.09.2013
comment
на самом деле можно определить и использовать TransitionDrawable в коде, но по какой-то причине он не работает во второй раз. странный. - person android developer; 30.04.2014
comment
Я могу использовать объектный аниматор, даже если в моем представлении установлен ColorDrawable. Я просто сохраняю его в локальной переменной, устанавливаю значение null, а когда анимация завершается, возвращаю исходный ColorDrawable. - person Miloš Černilovský; 21.07.2015

Вы можете сделать объект-аниматор. Например, у меня есть targetView, и я хочу изменить цвет фона:

int colorFrom = Color.RED;
int colorTo = Color.GREEN;
int duration = 1000;
ObjectAnimator.ofObject(targetView, "backgroundColor", new ArgbEvaluator(), colorFrom, colorTo)
    .setDuration(duration)
    .start();
person ademar111190    schedule 05.09.2014
comment
Из API 21 вы можете использовать ofArgb(targetView, "backgroundColor", colorFrom, colorTo). Его реализация всего ofInt(...).setEvaluator(new ArgbEvaluator()). - person ypresto; 09.08.2016

Если вам нужна такая цветная анимация,

Введите здесь описание изображения

этот код поможет вам:

ValueAnimator anim = ValueAnimator.ofFloat(0, 1);   
anim.setDuration(2000);

float[] hsv;
int runColor;
int hue = 0;
hsv = new float[3]; // Transition color
hsv[1] = 1;
hsv[2] = 1;
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

    @Override
    public void onAnimationUpdate(ValueAnimator animation) {

        hsv[0] = 360 * animation.getAnimatedFraction();

        runColor = Color.HSVToColor(hsv);
        yourView.setBackgroundColor(runColor);
    }
});

anim.setRepeatCount(Animation.INFINITE);

anim.start();
person RBK    schedule 23.12.2015
comment
Где находится часть инициализации переменной anim? - person VoW; 22.08.2016
comment
@VoW, это просто экземпляр ValueAnimator. - person RBK; 24.04.2018
comment
Это должно быть anim.setRepeatCount(ValueAnimator.INFINITE);, а не Animation.INFINITE, пока то же самое, но у нас нет никаких гарантий - person MikhailKrishtop; 04.10.2018
comment
@MikhailKrishtop что не так с Animation.INFINITE? developer.android.com/reference/android/view/animation/ - person RBK; 05.10.2018

лучше всего использовать ValueAnimator и ColorUtils.blendARGB

 ValueAnimator valueAnimator = ValueAnimator.ofFloat(0.0f, 1.0f);
 valueAnimator.setDuration(325);
 valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator valueAnimator) {

              float fractionAnim = (float) valueAnimator.getAnimatedValue();

              view.setBackgroundColor(ColorUtils.blendARGB(Color.parseColor("#FFFFFF")
                                    , Color.parseColor("#000000")
                                    , fractionAnim));
        }
});
valueAnimator.start();
person Rasoul Miri    schedule 24.10.2017

Документация по анимации на основе XML ужасна. Я искал несколько часов только для того, чтобы оживить цвет фона кнопки при нажатии ... Печально то, что анимация находится всего в одном атрибуте: вы можете использовать exitFadeDuration в selector:

<selector xmlns:android="http://schemas.android.com/apk/res/android"
    android:exitFadeDuration="200">

    <item android:state_pressed="true">
        <shape android:tint="#3F51B5" />
    </item>

    <item>
        <shape android:tint="#F44336" />
    </item>

</selector>

Тогда просто используйте его как background для вашего представления. Код Java / Kotlin не требуется.

person mbo    schedule 04.10.2019
comment
Отличный ответ. Обратите внимание, что вам также может понадобиться android:enterFadeDuration; По моему опыту, без этого моя анимация не работала во второй раз. - person String; 13.02.2020
comment
@String, странно, на эмуляторе много раз работает без android:enterFadeDuration. - person CoolMind; 23.07.2021

Еще один простой способ добиться этого - выполнить затухание с помощью AlphaAnimation.

  1. Сделайте ваше представление ViewGroup
  2. Добавьте к нему дочернее представление с индексом 0 с размерами макета match_parent
  3. Дайте ребенку тот же фон, что и контейнер
  4. Изменить фон контейнера на целевой цвет
  5. Затемните ребенка с помощью AlphaAnimation.
  6. Удалите ребенка, когда анимация будет завершена (с помощью AnimationListener)
person Stephane JAIS    schedule 26.04.2012

Это метод, который я использую в базовом действии для изменения фона. Я использую GradientDrawables, сгенерированный в коде, но его можно адаптировать под себя.

    protected void setPageBackground(View root, int type){
        if (root!=null) {
            Drawable currentBG = root.getBackground();
            //add your own logic here to determine the newBG 
            Drawable newBG = Utils.createGradientDrawable(type); 
            if (currentBG==null) {
                if(Build.VERSION.SDK_INT<Build.VERSION_CODES.JELLY_BEAN){
                    root.setBackgroundDrawable(newBG);
                }else{
                    root.setBackground(newBG);
                }
            }else{
                TransitionDrawable transitionDrawable = new TransitionDrawable(new Drawable[]{currentBG, newBG});
                transitionDrawable.setCrossFadeEnabled(true);
                if(Build.VERSION.SDK_INT<Build.VERSION_CODES.JELLY_BEAN){
                     root.setBackgroundDrawable(transitionDrawable);
                }else{
                    root.setBackground(transitionDrawable);
                }
                transitionDrawable.startTransition(400);
            }
        }
    }

обновление: на случай, если кто-то столкнется с той же проблемой, которую я обнаружил, по какой-то причине на Android ‹4.3 использование setCrossFadeEnabled(true) вызывает нежелательный эффект белого цвета, поэтому мне пришлось переключиться на сплошной цвет для‹ 4.3 с помощью @Roman Указанный выше метод Minenok ValueAnimator.

person scottyab    schedule 09.07.2014
comment
Это именно то, что я искал. Спасибо! :) - person cyph3r; 11.07.2014

Ответ дается разными способами. Вы также можете использовать ofArgb(startColor,endColor) из ValueAnimator.

для API> 21:

int cyanColorBg = ContextCompat.getColor(this,R.color.cyan_bg);
int purpleColorBg = ContextCompat.getColor(this,R.color.purple_bg);

ValueAnimator valueAnimator = ValueAnimator.ofArgb(cyanColorBg,purpleColorBg);
        valueAnimator.setDuration(500);
        valueAnimator.setInterpolator(new LinearInterpolator());
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
              @Override
              public void onAnimationUpdate(ValueAnimator valueAnimator) {
                   relativeLayout.setBackgroundColor((Integer)valueAnimator.getAnimatedValue());
              }
        });
        valueAnimator.start();
person Palak Darji    schedule 03.02.2018

Вот хорошая функция, которая позволяет это:

public static void animateBetweenColors(final @NonNull View viewToAnimateItsBackground, final int colorFrom,
                                        final int colorTo, final int durationInMs) {
    final ColorDrawable colorDrawable = new ColorDrawable(durationInMs > 0 ? colorFrom : colorTo);
    ViewCompat.setBackground(viewToAnimateItsBackground, colorDrawable);
    if (durationInMs > 0) {
        final ValueAnimator colorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), colorFrom, colorTo);
        colorAnimation.addUpdateListener(animator -> {
            colorDrawable.setColor((Integer) animator.getAnimatedValue());
            ViewCompat.setBackground(viewToAnimateItsBackground, colorDrawable);
        });
        colorAnimation.setDuration(durationInMs);
        colorAnimation.start();
    }
}

А в Котлине:

@JvmStatic
fun animateBetweenColors(viewToAnimateItsBackground: View, colorFrom: Int, colorTo: Int, durationInMs: Int) {
    val colorDrawable = ColorDrawable(if (durationInMs > 0) colorFrom else colorTo)
    ViewCompat.setBackground(viewToAnimateItsBackground, colorDrawable)
    if (durationInMs > 0) {
        val colorAnimation = ValueAnimator.ofObject(ArgbEvaluator(), colorFrom, colorTo)
        colorAnimation.addUpdateListener { animator: ValueAnimator ->
            colorDrawable.color = (animator.animatedValue as Int)
            ViewCompat.setBackground(viewToAnimateItsBackground, colorDrawable)
        }
        colorAnimation.duration = durationInMs.toLong()
        colorAnimation.start()
    }
}
person android developer    schedule 30.04.2014
comment
это не поддерживает телефоны младших версий - person Kartheek s; 05.07.2014
comment
@Kartheeks вы имеете в виду Android 10 и ниже? в таком случае вы можете легко использовать библиотеку nineOldAndroids для ее поддержки: nineoldandroids.com. синтаксис почти такой же. - person android developer; 05.07.2014
comment
для более низкой версии colorAnimation.addUpdateListener (new ValueAnimator.AnimatorUpdateListener () {@Override public void onAnimationUpdate (ValueAnimator animation) {colorDrawable.setColor ((Integer) animation.getAnimatedValpatue () ; - person Mahbubur Rahman Khan; 22.03.2020

Используйте следующую функцию для Kotlin:

private fun animateColorValue(view: View) {
    val colorAnimation =
        ValueAnimator.ofObject(ArgbEvaluator(), Color.GRAY, Color.CYAN)
    colorAnimation.duration = 500L
    colorAnimation.addUpdateListener { animator -> view.setBackgroundColor(animator.animatedValue as Int) }
    colorAnimation.start()
}

Передайте любой вид, цвет которого вы хотите изменить.

person Minion    schedule 17.02.2020

добавьте папку animator в папку res. (имя должно быть аниматор). Добавьте файл ресурсов аниматора. Например, res / animator / fade.xml.

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <objectAnimator
        android:propertyName="backgroundColor"
        android:duration="1000"
        android:valueFrom="#000000"
        android:valueTo="#FFFFFF"
        android:startOffset="0"
        android:repeatCount="-1"
        android:repeatMode="reverse" />
</set>

Внутри java-файла активности назовите это

View v = getWindow().getDecorView().findViewById(android.R.id.content);
AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(this, R.animator.fade);
set.setTarget(v);
set.start();
person canbax    schedule 10.05.2018

Я обнаружил, что реализация, используемая ArgbEvaluator в исходном коде Android, лучше всего справляется с переходом цветов. При использовании HSV, в зависимости от двух цветов, для меня переход проходил через слишком много оттенков. Но этого метода нет.

Если вы пытаетесь просто анимировать, используйте ArgbEvaluator с ValueAnimator, как предлагается здесь:

ValueAnimator colorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), colorFrom, colorTo);
colorAnimation.addUpdateListener(new AnimatorUpdateListener() {

    @Override
    public void onAnimationUpdate(ValueAnimator animator) {
        view.setBackgroundColor((int) animator.getAnimatedValue());
    }

});
colorAnimation.start();

Однако, если вы похожи на меня и хотите связать свой переход с каким-либо жестом пользователя или другим значением, переданным из ввода, ValueAnimator не очень поможет (если вы не ориентируетесь на API 22 и выше, в этом случае вы можете использовать ValueAnimator.setCurrentFraction()). При таргетинге ниже API 22 оберните код из _ 7_ исходный код собственным методом, как показано ниже:

public static int interpolateColor(float fraction, int startValue, int endValue) {
    int startA = (startValue >> 24) & 0xff;
    int startR = (startValue >> 16) & 0xff;
    int startG = (startValue >> 8) & 0xff;
    int startB = startValue & 0xff;
    int endA = (endValue >> 24) & 0xff;
    int endR = (endValue >> 16) & 0xff;
    int endG = (endValue >> 8) & 0xff;
    int endB = endValue & 0xff;
    return ((startA + (int) (fraction * (endA - startA))) << 24) |
            ((startR + (int) (fraction * (endR - startR))) << 16) |
            ((startG + (int) (fraction * (endG - startG))) << 8) |
            ((startB + (int) (fraction * (endB - startB))));
}

И используйте его как хотите.

person fahmy    schedule 16.01.2017

Основываясь на ответе ademar111190, я создал этот метод, который будет пульсировать цвет фона представления между любыми двумя цветами:

private void animateBackground(View view, int colorFrom, int colorTo, int duration) {


    ObjectAnimator objectAnimator = ObjectAnimator.ofObject(view, "backgroundColor", new ArgbEvaluator(), colorFrom, colorTo);
    objectAnimator.setDuration(duration);
    //objectAnimator.setRepeatCount(Animation.INFINITE);
    objectAnimator.addListener(new Animator.AnimatorListener() {
        @Override
        public void onAnimationStart(Animator animation) {

        }

        @Override
        public void onAnimationEnd(Animator animation) {
            // Call this method again, but with the two colors switched around.
            animateBackground(view, colorTo, colorFrom, duration);
        }

        @Override
        public void onAnimationCancel(Animator animation) {

        }

        @Override
        public void onAnimationRepeat(Animator animation) {

        }
    });
    objectAnimator.start();
}
person ban-geoengineering    schedule 06.11.2019

Вы можете использовать класс ArgbEvaluatorCompat выше API 11.

implementation 'com.google.android.material:material:1.0.0' 


ValueAnimator colorAnim = ValueAnimator.ofObject(new ArgbEvaluatorCompat(), startColor, endColor);
colorAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            mTargetColor = (int) animation.getAnimatedValue();
        }
    });
colorAnim.start();
person chan    schedule 09.09.2020

Роман Миненок ответ на котлине и как функция расширения

fun View.colorTransition(@ColorRes startColor: Int, @ColorRes endColor: Int, duration: Long = 250L){
    val colorFrom = ContextCompat.getcolor(context, startColor)
    val colorTo =  ContextCompat.getcolor(context, endColor)
    val colorAnimation: ValueAnimator = ValueAnimator.ofObject(ArgbEvaluator(), colorFrom, colorTo)
    colorAnimation.duration = duration

    colorAnimation.addUpdateListener {
        if (it.animatedValue is Int) {
            val color=it.animatedValue as Int
            setBackgroundColor(color)
        }
    }
    colorAnimation.start()
}

Если вы хотите изменить текущий цвет фона на новый цвет, вы можете использовать это

fun View.colorTransition(@ColorRes endColor: Int, duration: Long = 250L){
    var colorFrom = Color.TRANSPARENT
    if (background is ColorDrawable)
        colorFrom = (background as ColorDrawable).color

    val colorTo =  ContextCompat.getcolor(context, endColor)
    val colorAnimation: ValueAnimator = ValueAnimator.ofObject(ArgbEvaluator(), colorFrom, colorTo)
    colorAnimation.duration = duration

    colorAnimation.addUpdateListener {
        if (it.animatedValue is Int) {
            val color=it.animatedValue as Int
            setBackgroundColor(color)
        }
    }
    colorAnimation.start()
}

использование

myView.colorTransition(R.color.bg_color)
person Manohar    schedule 02.03.2021

Вы можете использовать ValueAnimator следующим образом

 fun startColorAnimation(v: View) {
    val colorStart = v.solidColor
    val colorEnd = Color.RED
    val colorAnim: ValueAnimator = ObjectAnimator.ofInt(v, "backgroundColor", colorStart, colorEnd)
    colorAnim.setDuration(1000)
    colorAnim.setEvaluator(ArgbEvaluator())
    colorAnim.repeatCount = 1
    colorAnim.repeatMode = ValueAnimator.REVERSE
    colorAnim.start()
}
person Hassan    schedule 09.03.2021