Android翻译动画进度回调

时间:2017-08-16 10:27:12

标签: android android-animation

我正在使用Translate动画(借鉴here),如下所示:

TranslateAnimation a = new TranslateAnimation(
Animation.ABSOLUTE,200, Animation.ABSOLUTE,200,
Animation.ABSOLUTE,200, Animation.ABSOLUTE,200);
a.setDuration(1000);
a.setFillAfter(true);
animationSet.addAnimation(a);
myView.startAnimation(a);

是否有任何回调可以给我myView的当前位置?我希望在动画进行过程中根据myView的位置执行操作。

2 个答案:

答案 0 :(得分:1)

不幸的是没有,但你可以这样做。使用

a.setRepeatCount(200);

并将动画设置为一次移动1个像素

Animation.ABSOLUTE,1

然后

 a.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {

            }

            @Override
            public void onAnimationEnd(Animation animation) {

            }

            @Override
            public void onAnimationRepeat(Animation animation) {
                 // this will fire after each repetition 
            }
        });

答案 1 :(得分:0)

新解决方案现已作为Android Spring Physics的一部分提供。

您可以使用DynamicAnimation.OnAnimationUpdateListener界面。

此接口的实现者可以将自己作为更新侦听器添加到DynamicAnimation实例中,以在每个动画帧上接收回调。

这是kotlin中的快速入门代码

// Setting up a spring animation to animate the view1 and view2 translationX and translationY properties
val (anim1X, anim1Y) = findViewById<View>(R.id.view1).let { view1 ->
    SpringAnimation(view1, DynamicAnimation.TRANSLATION_X) to
            SpringAnimation(view1, DynamicAnimation.TRANSLATION_Y)
}
val (anim2X, anim2Y) = findViewById<View>(R.id.view2).let { view2 ->
    SpringAnimation(view2, DynamicAnimation.TRANSLATION_X) to
            SpringAnimation(view2, DynamicAnimation.TRANSLATION_Y)
}

// Registering the update listener
anim1X.addUpdateListener { _, value, _ ->
    // Overriding the method to notify view2 about the change in the view1’s property.
    anim2X.animateToFinalPosition(value)
}
// same for Y position
anim1Y.addUpdateListener { _, value, _ -> anim2Y.animateToFinalPosition(value)

}

您可以收听动画视图的每帧更新,并相应地对其他视图进行动画/更新。