首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android ViewPropertyAnimator和ValueAnimator:我该如何进行快速转发?

Android ViewPropertyAnimator和ValueAnimator:我该如何进行快速转发?
EN

Stack Overflow用户
提问于 2015-11-07 17:14:41
回答 3查看 1.6K关注 0票数 3

我是这样使用ViewPropertyAnimator的:

代码语言:javascript
复制
view.animate().alpha(to).setDuration(duration);

和ValueAnimator:

代码语言:javascript
复制
ValueAnimator anim = ValueAnimator.ofInt(0, width);
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator valueAnimator) {
        viewGroup.setMinimumWidth((Integer) valueAnimator.getAnimatedValue());
    }
});
anim.setDuration(duration).start();

有时我想在动画完成之前取消它,但是仍然立即应用剩下的步骤(就好像动画已经完成了一样)。是否有一种简单的方法可以使用API来完成这一任务,还是我需要将动画器封装到另一个类中并自己处理呢?

EN

回答 3

Stack Overflow用户

发布于 2015-11-07 17:22:33

停止运行动画有两种方法。

代码语言:javascript
复制
Animator.end()     // end the animation
Animator.cancel()  // cancel the animation

您可以使用end()方法或cancel()方法。在这两种情况下,动画都将停止,只能通过调用start()重新启动。

end()cancel()之间的区别在于在调用该方法之后动画对象将处于何种状态。

当调用cancel()时,动画将停止运行,使动画对象处于中间状态。

调用end()方法时,动画将有效地被快速转发到动画的最后状态.

所有的对象都会以动画结尾的方式出现。

来源:http://cogitolearning.co.uk/?p=1482

票数 2
EN

Stack Overflow用户

发布于 2015-11-07 17:26:56

为此,您可以使用AnimatorListener

代码语言:javascript
复制
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) {}
});
票数 1
EN

Stack Overflow用户

发布于 2015-11-22 15:11:15

如果您不介意使用第三方库,那么可以使用android-过渡

导入Gradle中的库:编译‘com.github.kaichunlin.Transform:core:0.9.2’

您的ViewPropertyAnimator场景将变成

代码语言:javascript
复制
TransitionAnimation animation = 
    ViewTransitionBuilder.transit(view).alpha(to).duration(duration).buildAnimation();

您的ValueAnimator场景将变成

代码语言:javascript
复制
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状态,就像提取抽屉的数量一样。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33585480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档