Android - 如何在XML中使用ObjectAnimator

4
我希望能够使用在XML文件中定义的objectAnimator。我想要放置两个objectAnimators,并在我的代码中选择要使用哪一个。
这是我的XML文件的样子,我在其中设置了propertyName,我之后会在代码中访问它:
<?xml version"1.0" encodin="utf-8"?>
<set xmlns:android="..."
    <objectAnimator
        android:propertyName="animX"
        android:duration="1000"
        android:valueFrom="FFFFFF"
        android:valueTo="FF0000" />

    <objectAnimator
        android:propertyName="animY"
        android:duration="1000"
        android:valueFrom="FF0000"
        android:valueTo="FFFFFF" />

</set>

这是代码,我想要访问一个定义了objectAnimatorpropertyName:

ObjectAnimator anim = ObjectAnimator.ofFloat(view, "animX");
anim.setTarget(anim);
anim.start();

很遗憾,事实并非如此,我真的很难找到访问我想要的对象动画器的解决方案。

3个回答

3
有两个可能的问题:
1)每个ObjectAnimator都需要是自己的对象,然后在你通过final ObjectAnimator animator = (ObjectAnimator) AnimatorInflater.loadAnimator(context, resID);膨胀动画之后将其添加到集合中,并将其设置在视图上。
2)如果XML文件给您带来了IDE错误,请检查您的ObjectAnimators是否在/animator文件夹中而不是/anim文件夹中的/res目录中。
编辑:/animators无法识别,但可以使用/animator

错误:android.animation.AnimatorSet无法转换为android.animation.ObjectAnimator。 - Mahdi Moqadasi

2

你可以使用 PropertyValuesHolder 将两个 ObjectAnimators 包装在一个 ObjectAnimator 中,而不是将它们放在 XML 文件中:

<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="5000"
    android:interpolator="@android:interpolator/linear"
    android:repeatCount="1"
    android:repeatMode="reverse">

    <propertyValuesHolder
        android:propertyName="scaleX"
        android:valueFrom="1"
        android:valueTo="2" />

    <propertyValuesHolder
        android:propertyName="scaleY"
        android:valueFrom="1"
        android:valueTo="2" />

</objectAnimator>
    

然后您可以这样检索此动画:
val scaleAnimation = AnimatorInflater.loadAnimator(
        context, R.animator.your_anim_file_name)
scaleAnimation.setTarget('your_view')
scaleAnimation.start()

如果您有多个像这样的动画,您可以将它们添加到AnimatorSet中并按顺序或同时播放。

val animatorSet = AnimatorSet()
animatorSet.playSequentially(scaleAnimation, translateAnimation)
animatorSet.start()

0

你不能自己编写动画对象吗?

ObjectAnimator objectAnimator1 = new ObjectAnimator();
objectAnimator.setPropertyName("animX");
objectAnimator.setFloatValues(0, 1);
objectAnimator.setTarget(logoView);//call this when your ready to set target
objectAnimator.setDuration(1000);

然后创建另一个并将它们存储为实例变量,也许?

更新

所以只需在res中创建一个anim文件夹,并创建两个不同的xml文件。分别调用每个文件。


1
我可以这样做,但我想将所有属性(如持续时间、颜色值从/到)放在一个XML文件中,并通过编程加载它们。 - csnewb

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