Android系统编程入门系列之界面Activity响应多元的属性动画

响应丝滑动画一篇文章中,分别介绍了做用于普通视图、绘制视图的绘制对象、和界面这三种对象的动画效果,可是都有一些使用的局限性。好比这些动画都只是以屏幕上绘制更新的方式绘制动画,并无真实改变做用对象的实际位置或属性,这种问题在视图动画中尤其明显,在没有特别设置时,动画结束后的视图状态会还原到动画前,也就是说动画中及动画后的视图对象是没有保存动画中用到的一些属性的。这种状况就须要使用本文所介绍的属性动画了。html

属性动画本质是对某个对象的属性提供一组变化更新的属性值,他的做用对象不只能够是视图和界面,也能够是任何具备上述需求的对象类。在Android3.0 API 11开始的AndroidSDK版本中,定义了android.animation.Animator类做为抽象父类来描述属性动画的结构,并提供了android.animation.ValueAnimator做为只变化属性值的属性动画类、android.animation.ObjectAnimator能够变化属性值并更新到对象属性的属性动画类、和android.animation.AnimatorSet包含多个属性动画集合的属性动画类。android

与普通动画相似,属性动画一样能够在资源文件中静态声明,也能够在代码中动态声明,可是因为其做用对象能够是任何对象,并且属性动画的优点在于为做用对象的属性提供一组变化的属性值,因此属性动画只能在须要绑定做用对象的代码位置动态使用。因为静态声明的属性动画能够针对多个对象使用,在开发过程当中推荐使用静态声明+动态使用的方式。动画

只变化属性值的属性动画类

ValueAnimator做为最核心的属性动画类,能够调用ValueAnimator.ofArgb(int... values)ValueAnimator.ofFloat(float... values)ValueAnimator.ofInt(int... values)ValueAnimator.ofObject(TypeEvaluator evaluator, Object... values)系列静态方法,获取初始化后的实例化对象。其中的参数 values 是可变长参数,做为可变化属性值的范围区间。而参数 evaluatorandroid.animation.TypeEvaluator估值器接口的实现类,用以计算估计属性值的具体变化数值的类。而AndroidSDK中已经定义了上述系列静态方法前三种类型对应的估值器子类,分别是android.animation.ArgbEvaluatorandroid.animation.FloatEvaluatorandroid.animation.IntEvaluator,除此以外还有计算二维坐标系的估值器android.animation.PointFEvaluator和计算矩形坐标的估值器android.animation.RectEvaluator。另外,在实际开发中针对做用对象要变化的属性值类型不一样,也能够自定义实现TypeEvaluator接口的估值器。ui

这里提到的ArgbEvaluator是用以计算颜色的 ARGB 色值估值器,与Android系统定义的屏幕坐标相似,这里的 ARGB 色值也是一套系统颜色规范。在Java中int类型是用4个字节存储的,这4个字节按顺序从大端到小端,恰好分别表示Alpha(颜色值中的透明度),Red(颜色值中的红色值),Green(颜色值中的绿色值),Blue(颜色值中的蓝色值),每一个字节的数值能够表示范围是[ 0x0, 0xFF ],因此用十六进制表示颜色值中的纯红色为 0xFFFF0000 ,纯黑色为 0xFF000000 ,纯白色为 0xFFFFFFFF ,而彻底透明色为 0x000000000x00FFFFFF 之间的任一值。也能够借助android.graphics.Color类使用已经定义的颜色值和系统颜色规范的相关方法。google

在建立ValueAnimator实例化对象后,
能够调用setDuration(long duration)设置完成一次动画效果的持续时间,单位为 ms 毫秒。
调用setRepeatCount(int value)设置完成一次动画效果后的重复次数,默认 value = ValueAnimator.INFINITE 为无限循环。
调用setRepeatMode(int value)设置在完成一次动画效果后重复时的动画效果,其 value 只能为
ValueAnimator.RESTART 表示从头开始从新完成一次如出一辙的动画效果,
ValueAnimator.REVERSE 表示从上次动画结尾开始完成一次倒放的动画效果。
调用 setInterpolator(TimeInterpolator value)设置动画效果的时间插值器。与上面的估值器定义结构相似,参数 valueandroid.animation.TimeInterpolator插值器接口的实现类,用以肯定每次更新动画效果的时间。一样的,AndroidSDK已经定义了一系列插值器,包括但不限于持续加速插值器android.view.animation.AccelerateInterpolator、持续减速插值器android.view.animation.DecelerateInterpolator、线性匀速插值器android.view.animation.LinearInterpolator等,一样在实际开发中针对动画效果展现时间进度,也能够自定义实现TimeInterpolator接口的插值器。lua

最终在须要启动当前属性动画的位置调用start()即开始播放当前动画效果,若是不想在调用属性动画的启动方法后当即执行相关动画效果,能够在启动方法以前调用setStartDelay(long startDelay)设置延时动画的延长时间,单位是 ms 毫秒。code

ValueAnimator是根据TypeEvaluator估值器来更新属性值的,而更新的时间则是由TimeInterpolator插值器决定的,那么怎么才能拿到每次更新后的属性值呢?这里就能够用调用ValueAnimator对象的addUpdateListener(ValueAnimator.AnimatorUpdateListener listener)方法添加属性动画更新监听,在AnimatorUpdateListener类中重写onAnimationUpdate(ValueAnimator animation)方法,该方法中的参数animation即更新后的属性动画对象,经过调用animation.getAnimatedValue()来接收每次更新后的属性值,并能够将更新后的属性值赋值给须要属性动画的对象中。xml

也能够在资源文件中静态定义属性动画,在 res/animator 目录下,定义xml格式的属性动画资源文件,该资源文件内以<animator />为根标签,其中能够设置android:duration做为完成一次动画效果的持续时间等一系列属性,与代码中动态设置的相关方法相似。以后在代码使用位置加载该资源文件,经过调用AnimatorInflater.loadAnimator(Context context, int id)的静态方法,参数context做为调用位置所在的上下文环境,参数id则是要加载的属性动画类型的资源文件名。将获得Animator抽象类的返回结果,根据所加载资源文件中的根标签名判断,若是与<animator />一致,则可将返回的Animator抽象类直接转换为ValueAnimator类型的对象。htm

可变化属性值并更新到对象属性的属性动画类

ObjectAnimator做为ValueAnimator的子类,定义和使用方式都有相似的地方,只是ObjectAnimator类中封装了属性动画的更新监听方法,所以只要绑定对象及其要变化的属性,在属性动画每次变化属性值时,都会主动将属性值更新到绑定对象的相关属性上。对象

所以在初始化实例对象时须要调用ofArgb(Object target, String propertyName, int... values)ofFloat(Object target, String xPropertyName, String yPropertyName, Path path)ofInt(T target, Property<T, Integer> property, int... values)ofObject(T target, Property<T, V> property, TypeConverter<PointF, V> converter, Path path)等系列静态方法。
其中参数 target 即为要绑定的动画效果做用对象;
参数 propertyNametarget 对象中的某个属性,并且该属性必需要有符合驼峰命名规则的 getset 方法;
参数 values 仍然做为可变化属性值的范围区间;
参数 path 做为android.graphics.Path类,则表示一段动画效果的执行路径,以此替换参数 values 表示的单一变化区间;
参数 property 做为android.util.Property抽象类,一样描述某种属性类型,以此替换String类型的参数 propertyName
参数 converter 做为android.animation.TypeConverter抽象类,与上文的参数 property 同时使用,当 property 中声明的属性类型与实际变化更新的属性值不一致时,使用参数 converter 所表示的强制类型转换方式。

在建立实例化对象后,ObjectAnimator有与ValueAnimator一致的setXXX()getXXX()系列方法,另外还有setTarget(Object target)方法能够直接绑定要变化属性值的目标对象,同时有setPropertyName(String propertyName)setProperty(Property property)两种调用方法,都能实现对目标对象中的目标属性的绑定。

最后仍然是在须要启动当前属性动画的位置调用start()开始播放当前动画效果。

在资源文件中静态定义时,一样在 res/animator 目录下,定义xml格式的属性动画资源文件,不过该资源文件内根标签为<objectAnimator />以标记关联对象的属性动画,其中的属性设置不只与只变化属性值的ValueAnimator对应的<animator />标签中的属性一致,还可单独设置android:propertyName绑定属性名称。以后一样能够在代码中调用AnimatorInflater.loadAnimator(Context context, int id)静态方法加载当前属性动画资源文件,一样地,针对获得的Animator抽象类的返回结果,根据所加载资源文件中的根标签名判断,若是与<objectAnimator />一致,则可将返回的Animator抽象类直接转换为ObjectAnimator类型的对象。

包含多个属性动画集合的属性动画类

SetAnimator是将一系列上述单独的属性动画组合起来的属性动画合集,其使用目的主要是为了讲不一样的属性动画按照同一条时间线整理播放,所以其相关方法主要与其中子动画的播放顺序相关。

经过直接建立SetAnimator()构造方法能够得到SetAnimator实例化对象。
获得的对象调用playTogether(Animator... items)方法能够在同一段时间内播放添加的子动画,
调用playSequentially(Animator... items)方法能够将其中的子动画按照添加顺序播放,
而这两个系列方法中的可变长参数 items 便是要添加的系列子动画对象。

也能够将获得的对象调用play(Animator anim)方法,参数 anim 为添加的基本动画,返回android.animation.AnimatorSet.Builder类型,能够调用该类的before(Animator anim)方法设置针对基本动画以前播放的动画 anim 、调用该类的with(Animator anim)方法设置与基本动画同时播放的动画 anim 、调用该类的after(Animator anim)方法设置针对基本动画以后播放的动画 anim 、以及该类的after(long delay)方法设置在基本动画以后延时 delay 毫秒以后继续播放以后动画。

最后仍然是在须要启动当前属性动画的位置调用start()开始播放当前动画效果。

在资源文件中静态定义时,一样在 res/animator 目录下,定义xml格式的属性动画资源文件,在资源文件内根标签为<set></set>以标记为集合属性动画,该标签内能够设置属性android:ordering,其值只能为默认的together表示子动画同时执行,或者为sequentially表示子动画按顺序执行。在<set></set>标签内部,能够嵌入上述<animator /><objectAnimator />两种属性动画标签。一样能够在代码中调用AnimatorInflater.loadAnimator(Context context, int id)静态方法加载当前属性动画资源文件,一样地,针对获得的Animator抽象类的返回结果,根据所加载资源文件中的根标签名判断,若是与<set></set>一致,则可将返回的Animator抽象类直接转换为AnimatorSet类型的对象。

相关文章
相关标签/搜索