Как вы анимируете изменение цвета фона представления на Android?
Например:
У меня есть вид с красным цветом фона. Цвет фона представления меняется на синий. Как я могу сделать плавный переход между цветами?
Если это невозможно сделать с помощью представлений, альтернатива будет приветствоваться.
android
animation
view
background-color
hpique
источник
источник
Ответы:
В итоге я нашел (довольно хорошее) решение этой проблемы!
Вы можете использовать TransitionDrawable для достижения этой цели. Например, в файле XML в папке drawable вы можете написать что-то вроде:
Затем в вашем XML для фактического представления вы бы ссылались на этот TransitionDrawable в
android:background
атрибуте.На этом этапе вы можете инициировать переход в своем коде по команде, выполнив:
Или запустите переход в обратном порядке, вызвав:
См . Ответ Романа о другом решении, использующем API-интерфейс анимации свойств, который не был доступен на момент публикации этого ответа.
источник
Вы можете использовать новый Property Animation Api для цветной анимации:
Для обратной совместимости с Android 2.x используйте библиотеку Nine Old Androids от Jake Wharton.
Этот
getColor
метод устарел в Android M, поэтому у вас есть два варианта:Если вы используете библиотеку поддержки, вам необходимо заменить
getColor
вызовы на:если вы не используете библиотеку поддержки, вам необходимо заменить
getColor
вызовы на:источник
ValueAnimator.ofArgb(colorFrom, colorTo)
выглядит более точно, но, к сожалению, это новое.В зависимости от того, как ваш вид получает цвет фона и как вы получаете целевой цвет, есть несколько разных способов сделать это.
Первые два используют фреймворк Android Property Animation .
Используйте Аниматор Объектов, если:
argb
значение в XML-файле.view.setBackgroundColor()
Аниматор объекта работает путем вызова,
view.setBackgroundColor
который заменяет определенный объект рисования, если только он не является экземпляром aColorDrawable
, которым он редко является. Это означает, что любые дополнительные свойства фона из рисованного объекта, такого как обводка или углы, будут удалены.Используйте Value Animator, если:
Используйте рисование перехода, если:
У меня были некоторые проблемы с производительностью отрисовок Transition, которые запускаются при открытии DrawerLayout, которые я не смог решить, поэтому, если вы столкнетесь с неожиданным заиканием, вы можете столкнуться с той же ошибкой, что и я.
Вам нужно будет изменить пример Value Animator, если вы хотите использовать рисование StateLists или LayerLists , в противном случае он потерпит крах на
final GradientDrawable background = (GradientDrawable) view.getBackground();
линии.Аниматор объекта :
Посмотреть определение:
Создайте и используйте
ObjectAnimator
как это.Вы также можете загрузить определение анимации из xml, используя AnimatorInflater, как это делает XMight в Android objectAnimator animate backgroundColor of Layout
Значение аниматора :
Посмотреть определение:
Drawable определение:
Создайте и используйте ValueAnimator следующим образом:
Переходный чертеж :
Посмотреть определение:
Drawable определение:
Используйте TransitionDrawable следующим образом:
Вы можете отменить анимацию, вызвав
.reverse()
экземпляр анимации.Есть несколько других способов сделать анимацию, но эти три, вероятно, наиболее распространенные. Я обычно использую ValueAnimator.
источник
Вы можете сделать объект аниматором. Например, у меня есть targetView, и я хочу изменить цвет фона:
источник
ofArgb(targetView, "backgroundColor", colorFrom, colorTo)
. Его реализация простоofInt(...).setEvaluator(new ArgbEvaluator())
.Если вы хотите цветную анимацию, как это,
этот код поможет вам:
источник
anim.setRepeatCount(ValueAnimator.INFINITE);
не Animation.INFINITE, пока это то же самое, но у нас нет никаких гарантийЛучший способ заключается в использовании ValueAnimator и
ColorUtils.blendARGB
источник
Еще один простой способ добиться этого - выполнить затухание с помощью AlphaAnimation.
источник
Этот метод я использую в Базовом занятии для изменения фона. Я использую GradientDrawables, сгенерированные в коде, но могут быть адаптированы для соответствия.
обновление: в случае, если кто-то сталкивается с той же проблемой, которую я обнаружил, по какой-то причине на Android <4.3 использование
setCrossFadeEnabled(true)
вызывает нежелательный эффект затемнения, поэтому мне пришлось переключиться на сплошной цвет для <4.3, используя метод @Roman Minenok ValueAnimator, упомянутый выше.источник
Ответ дается во многих отношениях. Вы можете также использовать
ofArgb(startColor,endColor)
вValueAnimator
.для API> 21:
источник
Документация по XML-анимации ужасна. Я искал около часа, чтобы анимировать цвет фона кнопки при нажатии ... Печально то, что анимация только один атрибут: вы можете использовать
exitFadeDuration
вselector
:Тогда просто используйте это как
background
для вашего взгляда. Код Java / Kotlin не требуется.источник
android:enterFadeDuration
; По моему опыту, без этого моя анимация не работала во второй раз.Вот хорошая функция, которая позволяет это:
А в Котлине
источник
добавить папку аниматор в папку res . (имя должно быть аниматором ). Добавьте файл ресурсов аниматора. Например, res / animator / fade.xml
Внутри Java-файла Activity, позвоните
источник
Используйте функцию ниже для Kotlin:
Передайте любой вид, который вы хотите изменить цвет.
источник
Я обнаружил, что реализация, используемая
ArgbEvaluator
в исходном коде Android, лучше всего справляется с переходом цветов. При использовании HSV, в зависимости от двух цветов, переход прыгал через слишком много оттенков для меня. Но этот метод не.Если вы пытаетесь просто анимировать, используйте
ArgbEvaluator
с,ValueAnimator
как предлагается здесь :Однако, если вы похожи на меня и хотите связать свой переход с каким-либо пользовательским жестом или другим значением, переданным из входных данных,
ValueAnimator
это не очень поможет (если только вы не ориентируетесь на API 22 и выше, в этом случае вы можете использоватьValueAnimator.setCurrentFraction()
метод ). При таргетинге ниже API 22 оберните код, найденный вArgbEvaluator
исходном коде, в свой собственный метод, как показано ниже:И используйте его как хотите.
источник
Основываясь на ответе ademar111190 , я создал этот метод, который будет изменять цвет фона представления между любыми двумя цветами:
источник