关于Android动画的内容,我们已经讲了好几篇了,都是一些最基础的,包括Alpha、Translate、Rotate、Scale都是常见的补间动画(Tween Animation),属于视图动画(包括补间动画和帧动画),今天我们来学习另一种类型,属性动画,主角是ValueAnimator。
那么肯定有人会疑惑视图动画和属性动画有什么区别?那就看下面我对这两种动画的理解:
ValueAnimator也是继承自Animator类,它本质是提供了一个时间的引擎去提供一系列变化的值并将其值赋值与目标控件上。
这里是一个简单的使用xml来实现ValueAnimator的方式
第一步,在res文件下新建animator文件夹,并在animator文件夹下新建valueanimator.xml文件,目录结构如下图所示:
第二步,编写valueanimator.xml文件内容:如下
<animator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="10000"
android:valueFrom="0"
android:valueTo="100"
android:valueType="intType"
android:repeatCount="0"
android:interpolator="@android:anim/linear_interpolator"
android:repeatMode="reverse"/>
第三步,实例化valueanimator
private ValueAnimator valueAnimator; //声明动画对象
……
valueAnimator = (ValueAnimator)AnimatorInflater.loadAnimator(this,R.animator.valueanimator); //实例化
/*AnimatorInflator 是Andorid 提供的属性动画帮助类*/
第四部,添加动画监听
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
int value = (Integer)valueAnimator.getAnimatedValue(); //获取动画的值
mTVValue.setText(value+""); //把值设为控制的值,nTVValue是一个TextView
}
});
第五步,开始动画
valueAnimator.start();
第一步,声明对象,并实例化
private ValueAnimator valueAnimator;
……
valueAnimator = new ValueAnimator();
第二步,设置相关参数
valueAnimator.setIntValues(0,100);
valueAnimator.setDuration(10000);
valueAnimator.setInterpolator(new LinearInterpolator());
第三步,添加动画监听
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
int value = (Integer)valueAnimator.getAnimatedValue();
mTVValue.setText(value+"");
}
});
第四步,执行动画
valueAnimator.start();
先简单的看一下动画效果
这算是最简单基础的ValueAnimator的用法。使用流程基本如此,其它也基本是在这个流程上做扩充,在使用的过程中可以自行了解一下。
void addUpdateListener(ValueAnimator.AnimatorUpdateListener listener) //动画值监听函数
void cancel() //取消动画
void end() //结束动画
static ValueAnimator ofArgb(int... values)//颜色动画构造函数
static ValueAnimator ofFloat(float... values)//浮点动画构造函数
static ValueAnimator ofInt(int... values) //整型动画构造函数
static ValueAnimator ofObject(TypeEvaluator evaluator, Object... values) //对象动画构造函数
static ValueAnimator ofPropertyValuesHolder(PropertyValuesHolder... values) //不知道怎么翻译
void setEvaluator(TypeEvaluator value) //设置值计算器
void setInterpolator(TimeInterpolator value) //设置插值器
void pause()//暂停动画
void resume() //恢复动画
//
示例代码:
xml
<animator
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="10000"
android:valueFrom="#ffff0000"
android:valueTo="#ffffffff"
android:valueType="colorType"
/>
监听器
colorValueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
int color = (Integer)valueAnimator.getAnimatedValue();
mTVValue.setBackgroundColor(color);
}
});
效果
Javacode
/*代码实现对象动画*/
objectValueAnimator = ValueAnimator.ofObject(new MyAnimObjectEvaluator(),new MyAnimObject(0),new MyAnimObject(10));
objectValueAnimator.setDuration(10000);
objectValueAnimator.setInterpolator(new LinearInterpolator());
/*对象动画*/
class MyAnimObject{
int value;
public MyAnimObject(int value){
this.value = value;
}
}
/*对象动画算值器*/
class MyAnimObjectEvaluator implements TypeEvaluator<MyAnimObject>{
@Override
public MyAnimObject evaluate(float v, MyAnimObject myAnimObject, MyAnimObject t1) {
int oldValue = myAnimObject.value;
int newValue = t1.value;
int res = (int)((oldValue + newValue)*v)*2; //返回偶数
MyAnimObject animObject = new MyAnimObject(res);
return animObject;
}
}
监听器
objectValueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
MyAnimObject value = (MyAnimObject)valueAnimator.getAnimatedValue();
mTVValue.setText(value.value);
}
});
关于ValueAnimator的基础学习,这篇博客就先到这里,关于本篇博客用到动画值计算器以及插值器,会在下篇博客进行专门讲解。