我有一个ImageView,当它被添加到布局时会被动画化。 当它被删除时,我想要反转相同的动画。
有没有办法在Android中反转动画而不重新编码并反转参数?
答案 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()