ViewGroup动画不起作用

时间:2015-06-06 03:25:42

标签: java android android-animation viewgroup

我试图在Android中进行简单的翻译动画。以下不起作用:

public class MyView extends ViewGroup {
    ...
    TranslateAnimation animation = new TranslateAnimation(0, 0, 0, -500);
    animation.setDuration(300);
    startAnimation(animation);
    ...
}

然而,这有效:

public class MyView extends ViewGroup {
    ...
    animate().setDuration(300).translationYBy(-500);
    ...
}

我需要使用顶级版本,因为我添加了需要同时设置动画的更多视图,并且我想在{{1}中使用TranslateAnimation s }。

2 个答案:

答案 0 :(得分:0)

在对两种动画方法进行一些研究之后,我想出了以下内容:

List<Animator> animators = new ArrayList<>();
for (int i = 0; i < view.getChildCount(); i++) {
    View child = view.getChildAt(i);
    ObjectAnimator va = ObjectAnimator.ofFloat(child, View.TRANSLATION_Y, child.getY() - 500);
    va.setDuration(300);
    animators.add(va);
}

一些解释:

  1. TranslateAnimation是Android包含的旧动画库的一部分。实际上,它们不会在对象动画时更改对象的基础属性值。我注意到如果在动画执行时我在屏幕上执行了其他操作(比如滚动ListView),则可以看到动画的闪烁。
  2. 从Honeycomb(Android 3.0)开始,有一种更新的动画方式可以在动画时改变底层属性值。它被称为ObjectAnimator。然后在3.1版中,他们引入了另一个类来帮助ObjectAnimator变得更加容易:ViewPropertyAnimator。我使用的第二种方法实际上是使用ViewPropertyAnimator的快捷方式。
  3. 正如我在问题中所说的那样,我需要我找到的任何解决方案来同时制作多个动画。遗憾的是ViewPropertyAnimator无法同时执行多个动画。所以我最终使用了ObjectAnimator
  4. 最后,由于ObjectAnimator不支持某个值的翻译,我必须使用当前的Y值来计算视图的最终Y位置。
  5. 来源:http://android-developers.blogspot.com/2011/05/introducing-viewpropertyanimator.html

答案 1 :(得分:0)

这不是实际问题的答案,更多的是关于如何将ViewPropertyAnimator与不同的视图和值同时使用的建议。 编写自己的方法并传入所需的值作为参数,例如(min implementation):

private void animateView(View view, float transX, float transY, int duration) {

     view.animate().
         .translationXBy(transX)
         .translationYBy(transY)
         .duration(duration);
}

如果您愿意,可以添加更多参数。例如,插值器,缩放,旋转或Alpha值。然后使用循环或编写另一种方法来同时为视图设置动画。为了确保它们同时为所有动画制作动画,您还可以在参数中添加一个小的ms startDelay,以确保在开始之前所有动画都已准备好加载。希望有所帮助。