属性动画的优势:
相比于补间动画和帧动画,属性动画更加强大,而且解决了两种的一些缺陷,比如:补间动画只是改变了View的显示效果而已,而不会真正去改变View的属性,举个例子:
在屏幕的左上角添加一个按键,用补间动画将其移到右下角后,对按键进行点击,按键没有反应,但是对按键在左上角原来的位置点击,按键有反应。
1.ValueAnimator:
属性动画的运行机制是通过不断地对值进行操作来实现的,而初始值和结束值之间的动画过渡就是由ValueAnimator这个类来负责计算的。ValueAnimator的作用是对值进行计算,所以调用ValueAnimator执行动画,我们只需要告诉它要操作的数据的起始值、结束值和值过度所需时间。除此之外,ValueAnimator还负责管理动画的播放次数、播放模式、以及对动画设置监听器等,例:
public class wll extends View {
/**
* 实现的功能:饼状图
*/
Path path;
int angle = 5;
public wll(Context context) {
this(context,null);
}
public wll(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
// 用属性动画实现该动画
// 设置动画的范围
final ValueAnimator va = ValueAnimator.ofInt(0,360);
va.setDuration(2000);
va.setRepeatCount(ValueAnimator.INFINITE);
va.setRepeatMode(ValueAnimator.REVERSE);
// 监听属性的值
va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
// 获取动画执行过程中的属性值
angle = (int)valueAnimator.getAnimatedValue();
invalidate();
}
});
// 启动动画
va.start();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
drawPieChart(canvas,Color.BLACK,(float)(angle/360.0));
}
private void drawPieChart(Canvas canvas,int color,float rate){
path = new Path();
Paint paint = new Paint ();
paint.setAntiAlias(true);//抗锯齿
paint.setColor(color);
// 设置填充模式
paint.setStyle(Paint.Style.FILL);
// 画圆
canvas.drawArc(50,100,350,400,0,360*rate,true,paint);
}
}
效果图
2.ObjectAnimator:
ValueAnimator是对一个数值进行过度的动画,但是ObjectAnimator就不同了,它可以直接对任意对象的任意属性进行动画操作。我们用的比较多的也是ObjectAnimator,但是ObjectAnimator还是继承于ValueAnimator的,关于
ObjectAnimator的用法,举个例子:
public class rotatePicture extends RelativeLayout {
ImageView out;
public rotatePicture(Context context) {
this(context,null);
}
public rotatePicture(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
ImageView liner = new ImageView(getContext());
liner.setImageResource(R.drawable.a);
addView(liner);
out = new ImageView(getContext());
out.setImageResource(R.drawable.b);
addView(out);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
// ObjectAnimator实现
ObjectAnimator oa = ObjectAnimator.ofFloat(out,
"rotation",0,360);
oa.setDuration(1000);
oa.setRepeatMode(ObjectAnimator.RESTART);
oa.setRepeatCount(ObjectAnimator.INFINITE);
oa.setInterpolator(new LinearInterpolator());
oa.start();
}
}
效果图
3.组合动画:
组合动画用到点的主要是AnimatorSet这个类,它为我们提供了一些方法:
- play: 执行动画
- after: 将现有动画插入到前一个动画之后执行
- after: 现有动画延迟指定时间后执行
- before:将现有动画插入到前一个动画之前执行
- with: 现有动画和前一个动画同时执行
例:
ObjectAnimator moveIn = ObjectAnimator.ofFloat(textview, "translationX", -500f, 0f);
ObjectAnimator rotate = ObjectAnimator.ofFloat(textview, "rotation", 0f, 360f);
ObjectAnimator fadeInOut = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f);
AnimatorSet animSet = new AnimatorSet();
animSet.play(rotate).with(fadeInOut).after(moveIn);
animSet.setDuration(5000);
animSet.start();
网友评论