目录
3、采用ValueAnimator,监听动画过程,自己实现属性的改变
属性动画是API 11新加入的特性,属性动画可以对任何对象做动画,甚至可以没有对象。
属性动画的原理:属性动画要求动画作用的对象提供该属性的get和set方法,属性动画根据外界传递的该属性的初始值和最终值,以动画的效果多次去调用set方法,每次传递给set方法的值都不一样,确切来说是随着时间的推移,所传递的值越来越接近最终的值。总结一下,我们对object的属性abc做动画,如果想要动画生效,要同时满足两个条件:
(1)、object必须要提供setAbc方法,如果动画的时候没有传递初始值,那么还要提供getAbc方法,因为系统要去取adc属性的初始值(如果这条不满足,程序直接Crash)。
(2)、object的setAbc对属性abc所做的改变必须能够通过某种方法反应出来,比如会带来UI的改变之类的(如果这条不满足,动画无效果,但不会Crash)
--Android开发艺术探索
一、对任意属性做动画
从前面的满足属性动画所需条件可知,所针对的属性必须有get、set方法。那如果这个属性没有set和get方法呢?
遇到这种情况有三种解决方案:
(1)、给这个对象加上get和set方法,如果有权限的话;
(2)、用一个类来包装原始对象,间接为其提供get和set方法;
(3)、采用ValueAnimator,监听动画过程,自己实现属性的改变。
下面对这三种解决方案进行介绍:
1、给这个对象加上get和set方法,如果有权限的话
比如我们直接使用LinearLayout,并给它添加个背景,我们知道LinearLayout继承ViewGroup,ViewGroup继承View,ViewGroup和View都是没有setWidth方法的,我们也没有权限去修改LinearLayout的源码实现来给它加上setWidth方法,那这个时候我们如果想要使用这种解决方案的话,我们可以自定义LinearLayout,继承LinearLayout,给它添加个setWidth方法。如下,我们在setWidth方法中设置此控件的布局参数的宽为我们传入的值,然后调用requestLayout重绘。
package com.example.viewanimation;
import android.content.Context;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.LinearLayout;
/**
* 自定义LinearLayout,添加SetWidth方法.
*/
pub