顾名思义:动画制作者,用来生成、管理动画。
属性动画的运行机制是通过不断地对值进行操作来实现的,并且它常常与Animation配合实现动画效果
subClass:
有两个接口:
interface Animator.AnimatorListener
:监听动画的监听器(如启动、重复、结束)
interface Animator.AnimatorPauseListener
:监听动画暂停或是重新开始的监听器
来看一下作为一个Animator拥有了哪些方法(这些方法都是动作):
void start()
:开始动画void end()
:结束动画void pause()
:暂停动画void cancel()
:取消动画Animator clone()
:复制这个动画生成一个新的动画void setTarget(Object target)
:设置动画的目标对象动画时间相关
abstract long getDuration()
:获取动画的时间abstract void setStartDelay(long startDelay)
:设置动画延迟start()abstract long getStartDelay()
long getTotalDuration()
:获取动画的总时间,包括开始延迟、重复、动画序列(运行时间)abstract void setInterpolator(TimeInterpolator value)
:设置TimeInterpolator对象,该对象主要实现非匀速运动TimeInterpolator getInterpolator()
还有一些判断:
abstract boolean isRunning()
boolean isPaused()
boolean isStarted()
监听器相关:
void addListener(Animator.AnimatorListener listener)
void addPauseListener(Animator.AnimatorPauseListener listener)
ArrayList getListeners()
void removeListener(Animator.AnimatorListener listener)
void removePauseListener(Animator.AnimatorPauseListener listener)
void removeAllListeners()
其他:
void setupEndValues()
void setupStartValues()
责任:
它的内部使用一种时间循环的机制来计算值与值之间的动画过渡,我们只需要将初始值和结束值提供给ValueAnimator,
并且告诉它动画所需运行的时长,那么ValueAnimator就会自动帮我们完成从初始值平滑地过渡到结束值这样的效果。
如果我们不想动画匀速运行:就需要AccelerateDecelerateInterpolator
这个类了。
<animator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:valueFrom="1"
android:valueTo="0"
android:valueType="floatType"
android:repeatCount="1"
android:repeatMode="reverse"/>
上述动画就是一个属性动画,动画事件为1000ms,value 从 1 变化到 0;并且value是float类型,重复次数1次,重复模式:REVERSE
重复模式:
- int INFINITE:无限循环
- int RESTART:重新播放
- int REVERSE:倒序播放
我们也可以用Java来实现:
ValueAnimator anim = ValueAnimator.ofFloat(1f, 0f);
anim.setDuration(1000);
anim.setRepeatMode(ValueAnimator.REVERSE);
anim.setRepeatCount(1);
anim.start();
常用方法:
- static ValueAnimator ofFloat(float... values)
:注意参数,…,我们想从0->1->2->0可以这么写ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f,2f, 0f);
- static ValueAnimator ofInt(int... values)
- static ValueAnimator ofInt(int... values)
:厉害了!我的哥!颜色也可以搞
这才是我么需要的类,听名字就知道谁都可以搞,不仅限于Value
可以直接对任意对象的任意属性进行动画操作
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:valueTo="200"
android:valueType="floatType"
android:propertyName="y"
android:repeatCount="1"
android:repeatMode="reverse"/>
Java:
给一个TextView对象设置透明度动画,我们可以这么设置:
ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f); //第三个参数后就是不固定的长度了
animator.setDuration(5000);
animator.start();
关于第二个参数一定要注意,ObjectAnimator内部的工作机制是通过寻找特定属性的get和set方法,然后通过方法不断地对值进行改变,
所以一定要是控件的属性,并且具备set/get方法。
class WrapperView{
private View mTarget;
public WrapperView(View target){
mTarget = target;
}
public int getWidth(){
return mTarget.getLayoutParams().width ;
}
public void setWidth(int width){
mTargetView.getLayoutParams().width = width;
mTargetView.requestLayout();
}
}
使用:
WrapperView wrapper = new WrapperView(View);
ObjectAnimator.ofInt(wrapper,"width",500).setDuration(1 * 1000).start();
针对同一个动画需要多个View属性时需要此类。
比如,在缩放时,需要同时对x,y轴进行缩放:
PropertyValuesHolder pvh1 = PropertyValuesHolder.ofFloat("translationX", 300f);
PropertyValuesHolder pvh2 = PropertyValuesHolder.ofFloat("scaleX", 1f,0,1f);
PropertyValuesHolder pvh3 = PropertyValuesHolder.ofFloat("scaleX", 1f,0,1f);
ObjectAnimator.ofProperty(view, pvh1, pbh2, pvh3).setDuration(1000).start();
独立的动画能够实现的视觉效果毕竟是相当有限的,因此将多个动画组合到一起播放就显得尤为重要。
我们向这个方法中传入一个Animator对象(ValueAnimator或ObjectAnimator)将会返回一个AnimatorSet.Builder的实例,AnimatorSet.Builder中包括以下四个方法:
- after(Animator anim)
将现有动画插入到传入的动画之后执行
- after(long delay)
将现有动画延迟指定毫秒后执行
- before(Animator anim)
将现有动画插入到传入的动画之前执行
- with(Animator anim)
将现有动画和传入的动画同时执行
当然了,肯定也少不了xml的:
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="sequentially" >
<objectAnimator
android:duration="2000"
android:propertyName="translationX"
android:valueFrom="-500"
android:valueTo="0"
android:valueType="floatType" >
objectAnimator>
<set android:ordering="together" >
<objectAnimator
android:duration="3000"
android:propertyName="rotation"
android:valueFrom="0"
android:valueTo="360"
android:valueType="floatType" >
objectAnimator>
<set android:ordering="sequentially" >
<objectAnimator
android:duration="1500"
android:propertyName="alpha"
android:valueFrom="1"
android:valueTo="0"
android:valueType="floatType" >
objectAnimator>
<objectAnimator
android:duration="1500"
android:propertyName="alpha"
android:valueFrom="0"
android:valueTo="1"
android:valueType="floatType" >
objectAnimator>
set>
set>
set>