Android对象动画:将布局的背景颜色进行动画化处理

15

我有一个问题。我想使用ObjectAnimator动画化LinearLayout的背景颜色。
问题在于它执行了动画,但是它既不关心持续时间,也不关心valueFromvalueTo

这是我的XML文件:

<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000"
    android:propertyName="backgroundColor"
    android:repeatCount="infinite"
    android:repeatMode="reverse"
    android:valueFrom="#FF0000"
    android:valueTo="#000000" />

在Java中我这样调用:

ObjectAnimator objAnim = (ObjectAnimator)AnimatorInflater.loadAnimator(getActivity(), R.animator.animator_bkg);
objAnim.setTarget(view);
objAnim.start();
请注意,当我动画更改布局的透明度时,它会按预期工作。
这是一个Android bug吗(在华硕Transformer上运行的4.0.3),还是我漏掉了什么?

当您尝试对颜色进行动画处理时,会发生什么事情? - DeeV
动画速度非常快,看起来背景用了所有可能的颜色进行动画处理(就像随机颜色)。我看到蓝色、红色、绿色、黄色,所有颜色都有,并且速度非常快 :) - XMight
这无法正常工作,因为在“数字”0xFF0000和0x000000之间还有其他基本颜色0x00FF00和0x0000FF,以及几乎所有其他颜色。 将您的桌面计算器设置为程序员/十六进制,您会发现红色的一半实际上是暗黄色而不是暗红色。 - Combuster
2个回答

40

我进行了一些谷歌搜索,找到了一个答案。尝试使用TransitionDrawable。

http://developer.android.com/guide/topics/resources/drawable-resource.html#Transition

此外,在stackoverflow.com上有一个专门针对相同问题的主题讨论。

代码示例:

    Button btn = (Button)this.findViewById(R.id.btn1);
    //Let's change background's color from blue to red.
    ColorDrawable[] color = {new ColorDrawable(Color.BLUE), new ColorDrawable(Color.RED)};
    TransitionDrawable trans = new TransitionDrawable(color);
    //This will work also on old devices. The latest API says you have to use setBackground instead.
    btn.setBackgroundDrawable(trans);
    trans.startTransition(5000);

谢谢!!!我只是想在TextView上弹出新的背景颜色,并在更改时淡回黑色。我尝试了所有其他动画,甚至是TransitionDrawable的声明版本。这个方法可行))) - tom
1
大家好,我有一个问题,我做了同样的事情,但似乎不起作用,以下是我的代码:ColorDrawable[] color = {new ColorDrawable(ContextCompat.getColor(applicationContext, R.color.selectedcolor)), new ColorDrawable(ContextCompat.getColor(applicationContext, R.color.unselectedcolor))}; TransitionDrawable trans = new TransitionDrawable(color); holder.relativeLayout.setBackground(trans); trans.startTransition(5000); 颜色如下: <color name="selectedcolor">#6400B7C5</color> <color name="unselectedcolor">#00000000</color> - Abduaziz Kayumov

15

看起来这是一个老问题。我在遇到类似的问题时偶然发现了这个问题。

最后证实这只是Android中的一个bug。代码本应该可以工作,但AnimatorInflater在设置TypeEvaluator时出了差错。

所以,在充气后再次设置TypeEvaluator就可以解决问题。

    ObjectAnimator objAnim = (ObjectAnimator)AnimatorInflater.loadAnimator(getActivity(), R.animator.animator_bkg);
    objAnim.setTarget(view);
    objAnim.setEvaluator(new ArgbEvaluator());
    objAnim.start();

将动画的参数设置为 new ArgbEvaluator(),动画就会按预期工作。


1
这个答案应该被标记为实际答案,因为它解决了原始问题,而user1415536的答案使用了旧对象的替代方法。 - ema3272
我找不到路径R.animator.animator_bkg。我需要自己创建这个路径还是应该下载什么东西? - Daniëlle
2
@Daniëlle animator_bkg 是作者使用的动画制作器。因此,您需要创建自己的 XML 资源并使用它。 - tynn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接