扭转动画

时间:2010-11-08 02:14:58

标签: android animation

我有一个ImageView,当它被添加到布局时会被动画化。 当它被删除时,我想要反转相同的动画。

有没有办法在Android中反转动画而不重新编码并反转参数?

9 个答案:

答案 0 :(得分:74)

不,遗憾的是你不能用Animation对象做到这一点。 但您可以使用插值器来模拟它,它将反转动画:

package com.example.android;

import android.view.animation.Interpolator;

public class ReverseInterpolator implements Interpolator {
    @Override
    public float getInterpolation(float paramFloat) {
        return Math.abs(paramFloat -1f);
    }
}

然后在动画上你可以设置新的插补器:

myAnimation.setInterpolator(new ReverseInterpolator());

答案 1 :(得分:25)

如果您使用Object或ValueAnimator为视图设置动画,则只需执行

即可
ValueAnimator myAnimator = new ValueAnimator();  
myAnimator.reverse()

可以找到文档here

答案 2 :(得分:12)

基于pcans的想法,您可以反转任何插值器,而不仅仅是线性。

class ReverseInterpolator implements Interpolator{
    private final Interpolator delegate;

    public ReverseInterpolator(Interpolator delegate){
        this.delegate = delegate;
    }

    public ReverseInterpolator(){
        this(new LinearInterpolator());
    }

    @Override
    public float getInterpolation(float input) {
        return 1 - delegate.getInterpolation(input);
    }
}

用法

ReverseInterpolator reverseInterpolator = new ReverseInterpolator(new AccelerateInterpolator())
myAnimation.setInterpolator(reverseInterpolator);

答案 3 :(得分:6)

我对 pcans 采用了类似的方法,但略有不同。它需要Interpolator并且将有效地传递出与正常使用传入Interpolator然后在REVERSE模式下相同的值。保存您不得不考虑Android上Animation.REVERSE的错误实现。请参阅代码here

public class ReverseInterpolator implements Interpolator {

    private final Interpolator mInterpolator;

    public ReverseInterpolator(Interpolator interpolator){
        mInterpolator = interpolator;
    }

    @Override
    public float getInterpolation(float input) {
        return mInterpolator.getInterpolation(reverseInput(input));
    }

    /**
     * Map value so 0-0.5 = 0-1 and 0.5-1 = 1-0
     */
    private float reverseInput(float input){        
        if(input <= 0.5)
            return input*2;
        else
            return Math.abs(input-1)*2;        
    }
}

答案 4 :(得分:1)

您可以让代码记住原始位置和结束位置。并且让您的代码在触发动画时动态获取这些值。

答案 5 :(得分:0)

如果您正在使用xml中的动画,那么一种简单的方法就是对原始动画制作完全相同的反向动画。将Animation.AnimationListener添加到原始动画中,然后在onAnimationEnd方法中启动反向动画。

答案 6 :(得分:0)

这对我有用

 ObjectAnimator anim = ObjectAnimator.ofFloat(imageViewUpb, "rotation", rotationAngle, rotationAngle + 180);

            if (linearLayoutb.getVisibility()==GONE){

                linearLayoutb.setVisibility(VISIBLE);
                anim.setDuration(500);
                anim.start();
                rotationAngle += 180;
                rotationAngle = rotationAngle%360;
        imageViewUpb.animate().rotation(rotationAngle).setDuration(500).start();

            }else{

                linearLayoutb.setVisibility(GONE);
                anim.setDuration(500);
                anim.start();
                rotationAngle += 180;
                rotationAngle = rotationAngle%180;
imageViewUpDownb.animate().rotation(rotationAngle).setDuration(500).start();

            }

linearlayoutb是当imageviewUpb朝上时展开的视图

制作int rotationAngle = 0; global parameter

答案 7 :(得分:0)

我想到的最简单的解决方案

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/linear_interpolator">
    <alpha
        android:duration="2000"
        android:fromAlpha="0.1"
        android:repeatCount="infinite"
        android:repeatMode="reverse"
        android:toAlpha="1.0">
    </alpha>
</set>

答案 8 :(得分:0)

你需要使用RepeatCount和RepeatMode

kotlin

   var anim = TranslateAnimation(0, 100, 0, 100)
   anim.repeatCount = Animation.INFINITE // you cant 1,2,...
   anim.repeatMode = Animation.REVERSE // you can set REVERSE or RESTART
   anim.start()