我试图在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 }。
答案 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);
}
一些解释:
TranslateAnimation
是Android包含的旧动画库的一部分。实际上,它们不会在对象动画时更改对象的基础属性值。我注意到如果在动画执行时我在屏幕上执行了其他操作(比如滚动ListView),则可以看到动画的闪烁。ObjectAnimator
。然后在3.1版中,他们引入了另一个类来帮助ObjectAnimator
变得更加容易:ViewPropertyAnimator
。我使用的第二种方法实际上是使用ViewPropertyAnimator
的快捷方式。ViewPropertyAnimator
无法同时执行多个动画。所以我最终使用了ObjectAnimator
ObjectAnimator
不支持某个值的翻译,我必须使用当前的Y值来计算视图的最终Y位置。来源: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,以确保在开始之前所有动画都已准备好加载。希望有所帮助。