1、属性动画说明
1.1概念
属性动画是Android 3.0版本开始提供,对补间动画的缺陷做了弥补,几乎完全可以代替掉补间动画。
1.2 相对于补间动画的优势
- 补间动画只能作用于View对象或其他任何继承自View的控件,当自定义View中onDraw()方法中绘制image,想对image进行动画操作,补间动画无法实现。
- 补间动画实现的动画效果有限,只能实现移动、缩放、旋转和淡入淡出这四种。
- 补间动画只是改变了View的显示效果,并没有对View的属性进行实际修改。
1.3 属性动画实现原理
属性动画实际上是采用一种不断对值进行操作的机制,并将不断变化的值赋值到指定对象的指定属性上。我们只需要设置动画类型、动画初始值、动画结束值。
2、代码实现
2.1 ValueAnimator
2.1.1 基本用法
ValueAnimator animator = ValueAnimator.ofFloat(0f,1f);
animator.setDuration(500);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float currentValue = (float) animation.getAnimatedValue();
L.d("TGA","当前值:"+currentValue);
}
});
animator.start();
2.1.2 值变化效果
2.1.3 其他方法
//设置持续时间
animator.setDuration(500);
//设置延迟播放
animator.setStartDelay(100);
//设置循环播放次数
animator.setRepeatCount(10);
//设置循环播放模式
animator.setRepeatMode(ValueAnimator.RESTART);
//设置当前播放时间,想到于播放进度选择
animator.setCurrentPlayTime(1000);
2.2 ObjectAnimator
2.2.1 基本用法
ObjectAnimator继承自ValueAnimator,可以直接作用于任意对象的任意属性
ObjectAnimator animator = ObjectAnimator.ofFloat(anim_iv,"alpha",1f,0f,1f);
animator.setDuration(3000);
animator.start();
2.2.2 ofFloat()方法参数说明
ofFloat(java.lang.Object target,java.lang.String propertyName,float... values)
- ofFloat返回一个ObjectAnimator 实例。
- 第一个参数为一个Object,这个Object应该有一个公共方法来对象的动画属性进行操作
- 第二个参数为要操作的动画属性名称
- 一组动态数组值,动画将按造时间和数组值进行动画播放
2.2.3 效果演示
2.2.4 propertyName参数说明
propertyName传入的值可以是任意字符串,ObjectAnimator 通过反射来调用propertyName对应的get、set方法,因为View中包含getRotation()、setTranslationX()、getTranslationX()、setScaleY()、getScaleY()所以能识别rotation,translationX等字符串,对于识别不了的字符串可以通过设置监听来获取变化值自己进行动画设置。
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float value = (float) animation.getAnimatedValue();
}
});
2.2.5 Animator监听
监听全部接口
animator.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) {
//重复执行监听
}
});
使用适配器监听单个接口
animator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
super.onAnimationStart(animation);
}
});