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

Правильность использования в качестве ключа зависит от того, что может измениться в течение жизненного цикла родительского компонента (FillScreen).

Использование индекса в качестве ключа обычно не одобряется, потому что если items изменения реквизита в течение жизненного цикла FillScreen, то тот же индекс теперь может указывать на другой элемент, но компонент не будет повторно отображаться, потому что ключ остается тот же самый.

В этом случае вы можете просто использовать комбинацию id и index в качестве ключа, но имейте в виду, что если элементы будут перетасованы в массиве, то компоненты для представления каждого элемента будут перемонтированы. То же самое относится и к другому подходу, использующему ключи индекса для фрагментов (здесь нет особого преимущества использования фрагментов).

Аналогично, если вы вставляете элемент между массивом, то компоненты для представления всех последующих элементов будут отброшены и воссозданы.

Если вы хотите оптимизировать для вышеупомянутых случаев, вы можете создать ключ, добавив индекс вхождения этого идентификатора.

<div class="fill-screen">
   <div key="one-0">foo</div>
   <div key="two-0">bar</div>
   <div key="one-1">foo</div>
   <div key="two-1">bar</div>
   <div key="one-2">foo</div>
   <div key="two-2">bar</div>
   <div key="one-3">foo</div>
</div>

Элементы React довольно легкие, поэтому клонирование не требует значительных накладных расходов.

313
задан Peter Mortensen 21 January 2017 в 00:28
поделиться

3 ответа

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

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

<?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 анимации свойств, который не был доступен на момент публикации этого ответа.

353
ответ дан 23 November 2019 в 01:08
поделиться

Документация относительно приводимых в действие анимаций 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 не необходим.

0
ответ дан 23 November 2019 в 01:08
поделиться

На основе ответ 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();
}
0
ответ дан 23 November 2019 в 01:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: