Правильность использования в качестве ключа зависит от того, что может измениться в течение жизненного цикла родительского компонента (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 довольно легкие, поэтому клонирование не требует значительных накладных расходов.
В итоге я нашел (довольно хорошее) решение этой проблемы!
Для этого можно использовать 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 анимации свойств, который не был доступен на момент публикации этого ответа.
Документация относительно приводимых в действие анимаций 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 не необходим.
На основе ответ 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();
}