Android属性动画是咱们自定义View不可缺乏的一部分知识,咱们平常使用的补间动画均可以被属性动画来代替。下面是本身在巩学习属性动画时总结的的一些知识,由浅入深,在咱们之后的开发中作出各类炫酷的动画效果。
复制代码
属性动画不在局限视图View对象,咱们不只能实现补间动画的效果,还能自定义各类各样的动画效果。
复制代码
下面我将详细介绍简单的属性动画的使用方法。方便咱们更好的理解和使用。bash
属性动画的运行机制是经过不断地对值进行操做来实现的,而初始值和结束值之间的动画过渡就是由ValueAnimator这个类来负责计算的。它的内部使用一种时间循环的机制来计算值与值之间的动画过渡,咱们只须要将初始值和结束值提供给ValueAnimator,而且告诉它动画所需运行的时长,那么ValueAnimator就会自动帮咱们完成从初始值平滑地过渡到结束值这样的效果。除此以外,ValueAnimator还负责管理动画的播放次数、播放模式、以及对动画设置监听器等。
复制代码
经过不断控制 值 的变化,再不断 手动 赋给对象的属性,从而实现动画效果。主要有下面三个方法。
1.ValueAnimator.ofInt() 以整型数值过渡。
2.ValueAnimator.oFloat() 以浮点型数值过渡。
3.ValueAnimator.ofObject()以对象的形式过渡。
ValueAnimator使用主要有如下两种用法。
复制代码
// 传入的参数解释
//设置的对象
//补间动画的类别
//变化的值
ObjectAnimator alphaAnim = ObjectAnimator.ofFloat(myView, "alpha", 1.0f, 0.5f);
ObjectAnimator scaleXAnim = ObjectAnimator.ofFloat(myView, "scaleX", 0.0f, 1.0f);
ObjectAnimator scaleYAnim = ObjectAnimator.ofFloat(myView, "scaleY", 0.0f, 2.0f);
ObjectAnimator rotateAnim = ObjectAnimator.ofFloat(myView, "rotation", 0, 360);
ObjectAnimator transXAnim = ObjectAnimator.ofFloat(myView, "translationX", 100, 400);
ObjectAnimator transYAnim = ObjectAnimator.ofFloat(myView, "tranlsationY", 100, 750);
复制代码
// 步骤1:设置动画属性的初始值 & 结束值
ValueAnimator anim = ValueAnimator.ofInt(0, 3);
// 1. 建立动画实例
// 2. 将传入的多个Int参数将值从0平滑过渡到1
// 若是传入了3个Int参数 a,b,c ,则是先从a平滑过渡到b,再从b平滑过渡到C,以此类推
// 步骤2:设置动画的播放各类属性
anim.setDuration(2000);
// 设置动画运行的时长
anim.setStartDelay(200);
// 设置动画延迟播放时间
anim.setRepeatCount(0);
// 设置动画重复播放次数 = 重放次数+1
// 动画播放次数 = -1时,动画无限重复
anim.setRepeatMode(ValueAnimator.RESTART);
// 设置重复播放动画模式
// ValueAnimator.RESTART(默认):正序重放
// ValueAnimator.REVERSE:倒序回放
// 步骤3:将改变的值手动赋值给对象的属性值:经过动画的更新监听器
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int currentValue = (Integer) animation.getAnimatedValue();
// 得到改变后的值
// 步骤4:将改变后的值赋给对象的属性值
View.setproperty(currentValue);
// 步骤5:刷新视图,即从新绘制,从而实现动画效果
View.requestLayout();
}
});
anim.start();
// 启动动画
}
复制代码
在介绍ValueAnimator.ofObeject()以前要先介绍插值器和估值器。在使用ofObeject()要涉及到自定义估值器。ide
Interpolator的概念其实咱们并不陌生,在补间动画中咱们就使用到了。他就是用来控制动画快慢节奏的;而在属性动画中,TimeInterpolator 也是相似的做用;TimeInterpolator 继承自Interpolator。咱们能够继承TimerInterpolator 以本身的方式控制动画变化的节奏,也可使用Android 系统提供的Interpolator。学习
估值器(TypeEvaluator)决定 值 的具体变化数值动画
TypeEvaluator是个接口,咱们只要实现这个接口,并在咱们的属性动画中设置就能够。ui
// 实现贝塞尔曲线的估值器,返回曲线上每一点的坐标
传入的参数为当前百分比 0-1
起始点的坐标
结束点的坐标
public class LoveEvaluator implements TypeEvaluator<PointF> {
private PointF p1,p2;
public LoveEvaluator(PointF p1,PointF p2){
this.p1 = p1;
this.p2 = p2;
}
@Override
public PointF evaluate(float v, PointF p0, PointF p3) {
PointF pointF1 = new PointF();
pointF1.x = p0.x * (1-v)*(1-v)*(1-v)
+ 3*p1.x*v*(1-v)*(1-v)
+3*p2.x*v*v*(1-v)
+p3.x *v*v*v;
pointF1.y = p0.y * (1-v)*(1-v)*(1-v)
+ 3*p1.y*v*(1-v)*(1-v)
+3*p2.y*v*v*(1-v)
+p3.y *v*v*v;
return pointF1;
}
}
复制代码
为属性动画设置估值器this
LoveEvaluator loveEvaluator = new LoveEvaluator(p1,p2);
ValueAnimator bezierAnimator = ObjectAnimator.ofObject(loveEvaluator,p0,p3);
bezierAnimator.setDuration(10000);
bezierAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
PointF pointF = (PointF) valueAnimator.getAnimatedValue();
// 不断改变视图的位置
iv.setX(pointF.x);
iv.setY(pointF.y);
}
});
复制代码
这样控件的运动轨迹就是按咱们自定义的轨迹运动。 属性动画在自定义View中常常用到,咱们能够多加练习,配合属性动画作出各类炫酷的UI效果。lua