【问题标题】:How would I animate multiple views at the same time over different points?如何在不同点上同时为多个视图设置动画?
【发布时间】:2019-03-29 23:55:05
【问题描述】:

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

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

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

动画完成后,应该有一个事件(类似于 OnAnimationFinish?)来触发其他事情,例如再次启用开始按钮。

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

提前致谢!

【问题讨论】:

    标签: java android animation


    【解决方案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()
    }
    

    【讨论】:

    • 我认为这是我正在寻找的方向,谢谢。是否可以使用 AnimatorSet 链接多个动画,这样我就可以在 3 点上播放动画,就像在最初的示例中一样?我想这就像在 AnimatorSet 中使用 AnimationSet。
    • 是的,您可以在 AnimatorSet()playTogether() 方法中使用 AnimatorSet()。但是您可以做的是创建三个不同的AnimatorSets 并在其中的addAnimatorListener 中调用其他AnimatorSet onEnd 方法(或单击按钮,这取决于您)。那应该为您完成工作。
    • @Cord 如果此解决方案对您有用,请将此标记为答案并投票赞成。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

          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();
      }
      

      【讨论】:

        【解决方案4】:

        你可以这样做

        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);  
                 }
             });
           }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-17
          相关资源
          最近更新 更多