欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

动画之属性动画基础篇

程序员文章站 2024-03-24 08:37:40
...

属性动画

属性动画,改变view或者object的属性实现动画,属性动画比补间动画更强大,不但可以实现旋转、平移等操作还可以自己定义动画效果,监听动画过程并作出相应动作。

属性动画的特性:
  • 在一定时间段内不断修改某个对象属性值的机制。
  • 支持对所有View能更新的属性的动画(需要属性的setXxx()和getXxx())。
  • 更改的是View实际的属性,所以不会影响其在动画执行后所在位置的正常使用。
属性动画的优点:
  • 优点:易定制,效果强
    Property Animation故名思议就是通过动画的方式改变对象的属性了,我们首先需要了解几个属性:

相关API

相关属性:

Duration动画的持续时间,默认300ms。

  • Time interpolation:时间差值,乍一看不知道是什么,但是我说LinearInterpolator、AccelerateDecelerateInterpolator,大家一定知道是干嘛的了,定义动画的变化率。
  • Repeat count and behavior:重复次数、以及重复模式;可以定义重复多少次;重复时从头开始,还是反向。
  • Animator sets: 动画集合,你可以定义一组动画,一起执行或者顺序执行。
  • Frame refresh delay:帧刷新延迟,对于你的动画,多久刷新一次帧;默认为10ms,但最终依赖系统的当前状态;基本不用管。
相关的类
  • ValueAnimator 整个属性动画最核心的
  • ObjectAnimator:继承ValueAnimator
  • AnimatorSet:用于控制一组动画的执行:线性,一起,每个动画的先后执行等。
  • AnimatorInflater:用户加载属性动画的xml文件
  • TypeEvaluator :类型估值,主要根据fraction计算新的属性值,用于设置动画操作属性的值。
  • TimeInterpolator:时间插值器,修改已执行时间占总时间的百分比,就是修改TypeEvaluator中的fraction参数值
  • AnimatorUpdateListener:监听整个动画过程。每播放一帧onAnimationUpdate()就会被调用一次
  • AnimatorListener:监听动画的开始、结束、取消以及重复播放

1、ValueAnimator

ValueAnimator内部使用一种时间循环机制来计算值与值直接的动画过渡。我们只需要将属性的取值范围、执行时长提供给ValueAnimator,那么就会自动帮我们计算属性值在各动画时段的取值,这些值会按照一定计算方式来实现过渡。除此之外它还负责管理播放次数、播放模式、动画监听。功能强大,*度高,意味着开发人员需要做更多工作去实现动画需求

通常我们都是通过ofFloat、ofInt等静态工厂函数构建ValueAnimator,

    animator = ValueAnimator.ofFloat(0f, 100f);
                animator.setDuration(1000);
                //每次更新属性值时就会调用onAnimationUpdate函数,在这里可以获得新的属性值
                //十分灵活,只操作属性值,可以运用于任何对象之上
                animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                    @Override
                    public void onAnimationUpdate(ValueAnimator animation) {
                        float animatedValue = (float) animation.getAnimatedValue();
                        mAnimationView.setTranslationX(animatedValue);
                        }
                    }
                });
    animator.start();

2、ObjectAnimator

valueAnimator只是对值进行一个平滑的动画过渡,而ObjectAnimator可以对目标对象的某个属性值进行修改,也就是说某个对象执行动画,同时不再需要实现它AnimatorUpdateListener,因为动画属性会自动更新,通过目标对象属性的setter函数更新属性值,如果没有setter函数,那么将会通过反射去更新。

示例
代码实现
animator = ObjectAnimator.ofFloat(mAnimationView,"translationX",0,200);
                animator.setDuration(1000);
                animator.start();
xml实现

放在res/animator目录下


Animator animator = AnimatorInflater.loadAnimator(context, R.animator.anim_file);
animator.setTarget(view);
animator.start();
备注:
  • translationX和translationY:这些属性控制View所在的位置,作为由其布局容器设置的左侧和顶部坐标的增量。
  • rotation,rotationX和rotationY:这些属性控制2D(rotation属性)中的旋转和围绕轴点的3D。
  • scaleX和scaleY:这些属性控制View围绕其轴心点的2D缩放。
  • pivotX和pivotY:这些属性控制枢轴点的位置,围绕该枢轴点进行旋转和缩放变换。默认情况下,轴心点位于对象的中心。
  • x和y:这些是简单的实用程序属性,用于描述View在其容器中的最终位置,作为左值和顶值以及translationX和translateY值的总和。
  • alpha:表示视图上的Alpha透明度。默认情况下,此值为1(不透明),值为0表示完全透明(不可见)。

AnimatorListener

实现类有AnimatorListenerAdapter

例子
        ObjectAnimator animator1 = ObjectAnimator.ofFloat(mAnimationView, "translationX", 100f);
                animator1.addListener(new Animator.AnimatorListener() {
                    @Override
                    public void onAnimationStart(Animator animation) {
                    }

                    @Override
                    public void onAnimationEnd(Animator animation) {
                    }

                    @Override
                    public void onAnimationCancel(Animator animation) {
                    }

                    @Override
                    public void onAnimationRepeat(Animator animation) {
                    }
                });
                animator1.setDuration(1000);
                animator1.start();

转载于:https://www.jianshu.com/p/9b36d3696391