我正在使用ViewPropertyAnimator:
var reqItem = $('.oitm:visible');
和ValueAnimator:
view.animate().alpha(to).setDuration(duration);
有时我想在完成动画之前取消动画,但仍然立即应用剩下的步骤(就好像动画已经完成)。是否有一种使用API实现此目的的简单方法,或者我是否需要将Animators包装在另一个类中并自己处理?
答案 0 :(得分:2)
有两种方法可以停止正在运行的动画。
Animator.end() // end the animation
Animator.cancel() // cancel the animation
您可以使用end()
方法或cancel()
方法。在这两种情况下,动画都会停止,只能通过调用start()
重新启动
end()
和cancel()
之间的差异是调用方法后动画对象所处的状态。
调用cancel()
时,动画将停在其轨道中,使动画对象处于中间状态
调用end()方法时,动画将有效地快速转发到动画的最终状态。
所有对象都将以动画结束时的方式显示。
答案 1 :(得分:0)
您可以使用AnimatorListener进行此操作。
anim.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {}
@Override
public void onAnimationEnd(Animator animation) {}
@Override
public void onAnimationCancel(Animator animation) {
// Set view properties here as if the animation had completed
viewGroup.setMinimumWidth(...);
}
@Override
public void onAnimationRepeat(Animator animation) {}
});
答案 2 :(得分:-1)
如果您不介意使用第三方库,则可以使用android-transition:
在Gradle中导入库: 编译' com.github.kaichunlin.transition:核心:0.9.2'
您的ViewPropertyAnimator场景将变为
TransitionAnimation animation =
ViewTransitionBuilder.transit(view).alpha(to).duration(duration).buildAnimation();
您的ValueAnimator场景将变为
final int width = <width>;
TransitionAnimation animation =
ViewTransitionBuilder.transit(viewGroup).duration(duration).addTransitionHandler(new TransitionHandler() {
@Override
public void onUpdateProgress(TransitionController controller, View target, float progress) {
target.setMinimumWidth((int) (progress*width));
}
}).buildAnimation();
然后调用animation.startAnimation();
开始,animation.endAnimation();
结束动画并应用最终状态。
这个库的优点是可以使用单个概念/类,它需要混合不同的类(即ViewPropertyAnimator和ValueAnimator),并且动画状态/进度可以与UI状态相关联抽屉被抽出多少钱。