好记性不如烂笔头。
帧动画
补间动画:Alpha、Scale、Translation、Rotate
属性动画:
属性动画常用的几个类:
ObjectAnimator:对象动画执行类
ValueAnimator:值动画执行类
PropertyValuesHolder:属性存值器
Keyframe:关键帧
AnimatorSet:动画执行集合类
AnimatorUpdateListener:动画更新监听
AnimatorListener:动画执行监听
AnimatorInflater 动画加载器
TypeEvaluator 类型估值
实现属性动画的方法:
1.调用ObjectAnimator的静态工厂方法创建动画(ofInt、ofFloat、ofObject);
2.调用setXxx()设置动画持续时间、插值方式、重复次数等;
3.设置监听事件;
4.调用Animator对象的start()方法启动动画。
//创建动画
ObjectAnimator yBouncer = ObjectAnimator.ofFloat(button, "ScaleX",0.0f, 1.0f);
//设置动画持续时间
yBouncer.setDuration(2000);
// 设置插值器(用于调节动画执行过程的速度)
yBouncer.setInterpolator(new LinearInterpolator());
// 设置重复次数(缺省为0,表示不重复执行),设置为2表示总共执行3次
yBouncer.setRepeatCount(2);
// 设置重复模式(RESTART或REVERSE),重复次数大于0或INFINITE生效
yBouncer.setRepeatMode(ValueAnimator.RESTART);
// 设置动画开始的延时时间(200ms)
yBouncer.setStartDelay(200);
// 开始动画
yBouncer.start();
默认缩放点在button的中间位置,如果要设置在button的(0,0)坐标进行缩放,需要添加以下代码:
// 设置缩放的中心点
button.setPivotX(0);
button.setPivotY(0);
button.invalidate();
添加监听:
ObjectAnimator anim = ObjectAnimator.ofFloat(view, "alpha", 0.5f);
anim.setDuration(1000);
anim.addListener(new AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
// 动画开始时调用
}
@Override
public void onAnimationRepeat(Animator animation) {
// 动画重复时调用
}
@Override
public void onAnimationEnd(Animator animation) {
// 动画结束时调用
ViewGroup parent = (ViewGroup) view.getParent();
if (parent != null)
parent.removeView(view);
}
@Override
public void onAnimationCancel(Animator animation) {
// 动画取消时调用
}
});
anim.start();
ValueAnimator:
ValueAnimator animator = ValueAnimator.ofFloat(0f, 200.0f);
// 设置作用对象
animator.setTarget(view);
// 设置执行时间
animator.setDuration(1000);
// 添加动画更新监听
animator.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
// 获取当前值
Float mValue = (Float) animation.getAnimatedValue();
// 设置横向偏移量
view.setTranslationX(mValue);
// 设置纵向偏移量
view.setTranslationY(mValue);
<span style="white-space:pre"> </span>}
});
animator.start();
PropertyValuesHolder:
// 获取view左边位置
int left = view.getLeft();
// 获取view右边位置
int right = view.getRight();
// 将view左边增加10像素
PropertyValuesHolder pvhLeft = PropertyValuesHolder.ofInt("left", left,
left + 10);
// 将view右边减少10像素
PropertyValuesHolder pvhRight = PropertyValuesHolder.ofInt("right",
right, right - 10);
// 在X轴缩放从原始比例1f,缩小到最小0f,再放大到原始比例1f
PropertyValuesHolder pvhScaleX = PropertyValuesHolder.ofFloat("scaleX",
1f, 0f, 1f);
// 在Y轴缩放从原始比例1f,缩小到最小0f,再放大到原始比例1f
PropertyValuesHolder pvhScaleY = PropertyValuesHolder.ofFloat("scaleY",
1f, 0f, 1f);
// 将PropertyValuesHolder交付给ObjectAnimator进行构建
ObjectAnimator customAnim = ObjectAnimator.ofPropertyValuesHolder(view,
pvhLeft, pvhRight, pvhScaleX, pvhScaleY);
// 设置执行时间(1000ms)
customAnim.setDuration(1000);
// 开始动画
customAnim.start();
Keyframe:
// 设置在动画开始时,旋转角度为0度
Keyframe kf0 = Keyframe.ofFloat(0f, 0f);
// 设置在动画执行50%时,旋转角度为360度
Keyframe kf1 = Keyframe.ofFloat(.5f, 360f);
// 设置在动画结束时,旋转角度为0度
Keyframe kf2 = Keyframe.ofFloat(1f, 0f);
// 使用PropertyValuesHolder进行属性名称和值集合的封装
PropertyValuesHolder pvhRotation = PropertyValuesHolder.ofKeyframe("rotation", kf0, kf1, kf2);
// 通过ObjectAnimator进行执行
ObjectAnimator.ofPropertyValuesHolder(view, pvhRotation)
// 设置执行时间(1000ms)
.setDuration(3000)
// 开始动画
.start();
ValueAnimator:
// 类型估值 - 抛物线示例
TypeEvaluator<PointF> typeEvaluator = new TypeEvaluator<PointF>() {
@Override
public PointF evaluate(float fraction, PointF startValue,
PointF endValue) {
float time = fraction * 3;
// x方向120px/s ,y方向0.5 * 200 * t * t
PointF point = new PointF();
point.x = 120 * time;
point.y = 0.5f * 200 * time * time;
return point;
}
};
ValueAnimator valueAnimator = ValueAnimator.ofObject(typeEvaluator,
new PointF(0, 0));
valueAnimator.setInterpolator(new LinearInterpolator());
valueAnimator.setDuration(3000);
valueAnimator.start();
valueAnimator.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
PointF point = (PointF) animation.getAnimatedValue();
view.setX(point.x);
view.setY(point.y);
}
});