如何在不同点同时制作多个视图的动画?

时间:2018-08-07 11:27:22

标签: java android animation

我是Android Studio的新手,我想同时在多个坐标上为多个图像设置动画。

假设我想将图像A从0/0移至100/100,然后移至200/200;同时(例如,通过单击按钮),图像B应从0/100移至100/100,然后移至200/100。全部都是简单的翻译。

(此外,我希望能够独立设置运动的持续时间。)

动画制作完成后,应该有一个事件(如OnAnimationFinish之类的东西)触发其他事件,例如再次启用开始按钮。

最有效的方法是什么?我知道Android中有一个AnimationSet可以存储多个动画,但是我不知道这在这里是否有用。

谢谢!

4 个答案:

答案 0 :(得分:1)

您可以将ObjectAnimatorAnimatorSet结合使用,以同时通过适当的侦听器播放多个动画。

例如():

val imageXAnimator = ObjectAnimator.ofFloat(imageView, "translationX", translateX)
val imageYAnimator = ObjectAnimator.ofFloat(imageView, "translationY", translateY)
val imageAlphaAnimator = ObjectAnimator.ofFloat(imageView, "alpha", if (reverse) 0F else 1F)

val animationSet = AnimatorSet()
        animationSet.playTogether(
                imageXAnimator,
                imageYAnimator,
                imageAlphaAnimator)
        animationSet.interpolator = DecelerateInterpolator()
        animationSet.duration = 1000
        animationSet.addListener(
            onStart = {
                //When animation is started
            },
            onEnd = {
                //When animation finishes
            }
        )
        animationSet.start()

或者是kotlin中的一个简单扩展名,可以在特定的View上调用:

inline fun View.animateTranslationY(translationY: Float, duration: Long = 1000, startDelay: Long = 0) {
    val translationYAnimator = ObjectAnimator.ofFloat(this, "translationY", translationY)
    translationYAnimator.duration = duration
    translationYAnimator.startDelay = startDelay
    translationYAnimator.interpolator = LinearInterpolator()
    translationYAnimator.addAnimatorListener(
            onStart = { },
            onEnd = { }
    )
    translationYAnimator.start()
}

答案 1 :(得分:0)

您可以使用“ View.animate()”方法来访问其子方法和事件,以管理所有这些内容。您只需在视图(TextView,ImageView,EditBox等)上调用“ animate()”,然后调用其子方法来确定要执行哪种动画:运动,旋转,更改透明度等。 。对于每个动画,您可以设置一个监听器,该监听器将在动画的开始和/或结束处调用。

答案 2 :(得分:0)

为两个视图都考虑这两种方法

    private void animateFirstView(final ImageView first, long durationFirst, final long durationSecond) {
    first.setTranslationX(0);
    first.setTranslationY(0);
    first.animate().translationX(100).translationY(100).setDuration(durationFirst).setListener(new Animator.AnimatorListener() {
        @Override
        public void onAnimationStart(Animator animation) {

        }

        @Override
        public void onAnimationEnd(Animator animation) {
        first.animate().translationY(200).translationX(200).setDuration(durationSecond).setListener(null).setInterpolator(new LinearInterpolator()).start();
        }

        @Override
        public void onAnimationCancel(Animator animation) {

        }

        @Override
        public void onAnimationRepeat(Animator animation) {

        }
    }).setInterpolator(new LinearInterpolator()).start();
}

private void animateSecondView(final ImageView second, long durationFirst, final long durationSecond) {
    second.setTranslationX(0);
    second.setTranslationY(100);
    second.animate().translationX(100).translationY(100).setDuration(durationFirst).setListener(new Animator.AnimatorListener() {
        @Override
        public void onAnimationStart(Animator animation) {

        }

        @Override
        public void onAnimationEnd(Animator animation) {
            second.animate().translationY(200).translationX(100).setDuration(durationSecond).setListener(null).setInterpolator(new LinearInterpolator()).start();
        }

        @Override
        public void onAnimationCancel(Animator animation) {

        }

        @Override
        public void onAnimationRepeat(Animator animation) {

        }
    }).setInterpolator(new LinearInterpolator()).start();
}

答案 3 :(得分:0)

您可以这样做

private void playAnimation(final View view, final int endRangeY) { 
   view.animate().translationY(endRangeY) //endRangeY where you want to end the animation   
   .alpha(0.0f) 
   .setDuration(3000) 
   .setListener(new AnimatorListenerAdapter() {
     @Override public void onAnimationEnd(Animator animation) { 
        super.onAnimationEnd(animation);  
         }
     });
   }