如何以编程方式在Android上加载animator xml文件?

时间:2015-11-16 21:31:20

标签: java android xml animation

根据the Android developer site,我们可以从位于路径上的xml文件以编程方式加载AnimatorSet类:res/animator/filename.xml。所以我创建了一个示例项目并尝试查看它是否真的有效,但事实并非如此;什么都没发生。如果我能理解缺少的东西和/或我做错了什么,那将是非常好的。提前致谢!下面是我的animator xml文件和加载xml的Java代码:

RES /动画/ sample.xml中:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="sequentially"
    >
  <set>
    <objectAnimator
        android:propertyName="x"
        android:duration="500"
        android:valueTo="400"
        android:valueType="intType"
        />
    <objectAnimator
        android:propertyName="y"
        android:duration="500"
        android:valueTo="300"
        android:valueType="intType"
        />
  </set>
  <objectAnimator
      android:propertyName="alpha"
      android:duration="500"
      android:valueTo="1f"
      />
</set>

这是我的Java代码,用于加载上面的xml文件:

FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
  @Override public void onClick(View view) {
    // Load and start Animaton
    AnimatorSet animSet =
        (AnimatorSet) AnimatorInflater.loadAnimator(view.getContext(), R.animator.sample);
    animSet.setTarget(view);
    animSet.start();
  }
});

2 个答案:

答案 0 :(得分:25)

您设置包含另一个集res/animator/sample.xml。简化它

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="sequentially"
    >

  <objectAnimator
      android:propertyName="alpha"
      android:duration="500"
      android:valueTo="1f"
      />
</set>

你像这样充气AnimatorSet

AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(getActivity(), R.animator.sample);
set.setTarget(fab); // set the view you want to animate
set.start();

到目前为止,我还没有找到一种方法将 objectAnimator 从xml扩展到Java。我必须把它包装在 Set

答案 1 :(得分:1)

这是文档中给出的示例中的错误。

尝试将android:valueType="intType"更改为android:valueType="floatType"

它适用于 @RaymondChenon ,因为他没有明确更改 android:valueTypeint因此系统采用默认值float

这里的问题是你在动画师中提供了android:valueType="intType",对于你动画的属性android:valueType="floatType"应该是android:propertyName="x"

在运行时系统中查找属性的 setter ,您想要设置动画。 就像你的情况一样,它会寻找setX(),但是当你定义int类型的参数类型时会导致不匹配,因为没有这样的方法,我不知道它为什么没有#&# 39;导致崩溃。

查看查看类的属性,有方法setX(float)

为了进一步了解,您可以参考StackOverflow Question