扭转动画

pbr*_*ult 45 animation android

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

有没有办法在没有重新编码和反转参数的情况下在Android中反转动画?

pca*_*ans 76

不,遗憾的是你不能用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

myAnimation.setInterpolator(new ReverseInterpolator());
Run Code Online (Sandbox Code Playgroud)

  • 我知道我迟到了.我试过这段代码它不适合我.动画结束后它只是回到起始位置而没有任何动画.我怎样才能反向动画? (2认同)
  • 这可以只是“return 1f - paramFloat;”,因为您将“[0..1]”映射到“[1..0]” (2认同)

the*_*yro 26

如果您使用Object或ValueAnimator为视图设置动画,则可以执行此操作

ValueAnimator myAnimator = new ValueAnimator();  
myAnimator.reverse()
Run Code Online (Sandbox Code Playgroud)

文档可以在这里找到.


Ily*_*man 13

基于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);
    }
}
Run Code Online (Sandbox Code Playgroud)

用法

ReverseInterpolator reverseInterpolator = new ReverseInterpolator(new AccelerateInterpolator())
myAnimation.setInterpolator(reverseInterpolator);
Run Code Online (Sandbox Code Playgroud)


Dor*_*ori 6

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

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;        
    }
}
Run Code Online (Sandbox Code Playgroud)


lar*_*oft 6

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

<?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>
Run Code Online (Sandbox Code Playgroud)