我想使用scaleX和scaleY振动视图,我正在使用此代码进行操作,但问题是有时视图未正确重置,并且显示应用了缩放...
我希望在动画结束时,必须看到视图的原始状态始终为
这是代码:
ObjectAnimator scaleX = ObjectAnimator.ofFloat(view, "scaleX", 1f, 0.9f);
scaleX.setDuration(50);
scaleX.setRepeatCount(5);
scaleX.setRepeatMode(Animation.REVERSE);
ObjectAnimator scaleY = ObjectAnimator.ofFloat(view, "scaleY", 1f, 0.9f);
scaleY.setDuration(50);
scaleY.setRepeatCount(5);
scaleY.setRepeatMode(Animation.REVERSE);
set.play(scaleX).with(scaleY);
set.start();
由于
答案 0 :(得分:13)
对于ValueAnimator和ObjectAnimator可以这样尝试:
animator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
animation.removeListener(this);
animation.setDuration(0);
((ValueAnimator) animation).reverse();
}
});
UPDATE 在Android 7上它不起作用。 最好的方法是使用插值器。
public 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);
}
}
在您的代码中
animator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
animation.removeListener(this);
animation.setDuration(0);
animation.setInterpolator(new ReverseInterpolator());
animation.start();
}
});
答案 1 :(得分:1)
根据文档(Property Animation):
属性动画系统可以通过更改View对象中的实际属性来为屏幕上的View设置动画。此外,只要更改了属性,View还将自动调用invalidate()方法刷新屏幕。
因此您可以使用AnimatorListener来收听动画事件,然后只需重置您设置动画的view属性。假设cancel
事件和scaleX
属性:
scaleAnimator.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationCancel(Animator animation) {
scaleView.setScaleX(0)
}
});
希望这会有所帮助。
答案 2 :(得分:-3)
您可以添加AnimatorListener,以便在动画结束时收到通知:
scaleY.addListener(new AnimatorListener() {
@Override
public void onAnimationEnd(Animator animation) {
// TODO Restore view
}
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
@Override
public void onAnimationCancel(Animator animation) {
}
});