常用方法:
ValueAnimator
常用方法ValueAnimator.ofInt(1,100),ValueAnimator.ofFloat(0f, 1f); ValueAnimator.ofObject();
setStartDelay()方法来设置动画延迟播放的时间
调用setRepeatCount()和setRepeatMode()方法来设置动画循环播放的次数以及循环播放的模式,
循环模式包括RESTART和REVERSE两种,分别表示重新播放和倒序播放的意思-
它的内部使用一种时间循环的机制来计算值与值之间的动画过渡,ValueAnimator还负责管理动画的播放次数、播放模式、以及对动画设置监听器等
ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f);//创建一个ValueAnimator 对象
anim.setDuration(300);
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float currentValue = (float) animation.getAnimatedValue();} }); anim.start();
0和1就表示将值从0平滑过渡到1
ofFloat()参数是一个不定长,还可以ValueAnimator.ofFloat(0f, 4f, 2f, 10f); 表示一个值在5秒内从0过渡到4,再过渡到2,再过渡到10.
ObjectAnimator
它是可以直接对任意对象的任意属性进行动画操作的,比如说View的alpha属性。它其实是继承自ValueAnimator的,底层的动画实现机制也是基于ValueAnimator来完成的。
ObjectAnimator animator = ObjectAnimator.ofFloat(view, "alpha", 1f, 0f, 1f); //透明度变化
animator.setDuration(5000);
animator.start();
对对象操作改变属性;
ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "rotation", 0f, 360f);//旋转
animator.setDuration(5000);
animator.start();
移除屏幕在进来:
float curTranslationX = view.getTranslationX();
ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "translationX", curTranslationX, -500f, curTranslationX);
animator.setDuration(5000);
animator.start();
垂直方向上进行缩放再还原:
ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "scaleY", 1f, 3f, 1f);
- alpha、rotation、translationX和scaleY,分别可以完成淡入淡出、旋转、水平移动、垂直缩放这几种动画。
- ObjectAnimator 不单对view操作,是任意对象,第二个参数的属性,会调用它的getter,setter:
public void setAlpha(float value);
public float getAlpha();
组合动画 AnimatorSet
after(Animator anim) 将现有动画插入到传入的动画之后执行
after(long delay) 将现有动画延迟指定毫秒后执行
before(Animator anim) 将现有动画插入到传入的动画之前执行
with(Animator anim) 将现有动画和传入的动画同时执行
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();
监听器:
anim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
}
});
默认的监听器要实现所有接口,使用AnimatorListenerAdapter可以只是实现部分接口。
XML方式
res目录下面新建一个animator文件夹
<animator> 对应代码中的ValueAnimator
<objectAnimator> 对应代码中的ObjectAnimator
<set> 对应代码中的AnimatorSet
<animator xmlns:android="http://schemas.android.com/apk/res/android"
android:valueFrom="0"
android:valueTo="100"
android:propertyName="alpha"
android:valueType="intType"/>
android:propertyName:改变的属性的名字
android:valueType:值得类型,还有floatType
- 加载方式
Animator animator = AnimatorInflater.loadAnimator(context, R.animator.anim);
ValueAnimator的高级用法
TypeEvaluator:一个接口,提供一个过渡的计算接口,ofFloat()系统内置了一个FloatEvaluator
public class FloatEvaluator implements TypeEvaluator {
public Object evaluate(float fraction, Object startValue, Object endValue) {
float startFloat = ((Number) startValue).floatValue();
return startFloat + fraction * (((Number) endValue).floatValue() - startFloat);
}
}
ofObject:
public static ValueAnimator ofObject(TypeEvaluator evaluator, Object... values)
我们就要自定义过渡计算,实现TypeEvaluator 接口。
比如:Point 原点
public class PointEvaluator implements TypeEvaluator{
@Override
public Object evaluate(float fraction, Object startValue, Object endValue) {
Point startPoint = (Point) startValue;
Point endPoint = (Point) endValue;
float x = startPoint.getX() + fraction * (endPoint.getX() - startPoint.getX());
float y = startPoint.getY() + fraction * (endPoint.getY() - startPoint.getY());
Point point = new Point(x, y);
return point;
}
}
fraction:动画的完成度。
调用: ValueAnimator.ofObject(new PointEvaluator(), startPoint, endPoint);
ObjectAnimator的高级用法
ObjectAnimator内部的工作机制是通过寻找特定属性的get和set方法,然后通过方法不断地对值进行改变,从而实现动画效果的。
对颜色等有,具有getter,setter属性的改变过渡。
Interpolator:插值器
anim.setInterpolator(new BounceInterpolator()); 模拟物理规律。小球挂反弹效果。
- 自定义Interpolator要实现TimeInterpolator 接口。
public interface TimeInterpolator {
float getInterpolation(float input);
}
这个接口有一个input值,跟上边的完成度有很大关系,input经过计算,改变完成度。系统默认的是匀速,所以默认情况下2者的值相同。
属性动画用在View上ViewPropertyAnimator
因为属性动画不是针对的view,而是object,但是它对view提供了很简便的用法:
view.animate().alpha(0.5f); //builder模式,链式。
view.animate().x(300).y(300).setDuration(200); //组合动画
view的animate()方法返回一个ViewPropertyAnimator实例,进行链式调用完成后直接执行动画(隐式调用执行)。