一、发展
Android 3.0以前,只有补间动画和逐帧动画,合称视图动画
Android 3.0后添加了"属性动画"
补间动画和逐帧动画缺点:
- 作用对象局限于View
- 没有改变View的属性,只是改变了视觉效果
- 动画效果单一,只能平移,缩放,旋转,和改变透明度
属性动画改进了上面的缺点:
能作用于所有Java对象,可实现多种动画效果,不局限于以上四种
引入了作用领域,
二、工作原理
三、使用
ValueAnimator
ValueAnimator animator=ValueAnimator.ofInt(0,100);
animator.setDuration(1000);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
Log.d("jay","value="+animation.getAnimatedValue());
}
});
animator.start();
过程为调用ValueAnimator的ofInt()方法就可以创建一个ValueAnimator对象,ofInt方法传入的参数代表将值从0平滑过度到100,setDuration()方法是设置动画运行时长,addUpdateListener()方法可以监听动画运行过程,start()方法启动动画
ObjectAnimator
TextView textView=findViewById(R.id.tv);
Button btn=findViewById(R.id.btn);
final ObjectAnimator animator=ObjectAnimator.ofFloat(textView,"alpha",1f,0f,1f);
animator.setDuration(10000);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
animator.start();
}
});
实现了点击按钮textView消失又重现的动画
ofFloat的参数分别为View对象、动画效果,开始状态,中间状态,结束状态
第二个参数可以是alpha(改变透明度)、rotation(旋转)、translationX(水平移动)、scaleY(垂直缩放),还有其他的各种值
原理是通过属性名找到View的set、get方法进行操作,比如View中存在
public void setAlpha(float value);
public float getAlpha();
则可以改变alpha。
所以我们可以设置任何值,只要在View中创建这个属性的set和get方法
组合动画
实现组合动画功能主要需要借助AnimatorSet这个类,这个类提供了一个play()方法,如果我们向这个方法中传入一个Animator对象(ValueAnimator或ObjectAnimator)将会返回一个AnimatorSet.Builder的实例,AnimatorSet.Builder中包括以下四个方法:
- 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();
Animator监听器
anim.addListener(new AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
}
@Override
public void onAnimationCancel(Animator animation) {
}
});
我们需要实现接口中的四个方法,onAnimationStart()方法会在动画开始的时候调用,onAnimationRepeat()方法会在动画重复执行的时候调用,onAnimationEnd()方法会在动画结束的时候调用,onAnimationCancel()方法会在动画被取消的时候调用。
不监听全部事件
使用适配器AnimatorListenerAdapter类,已经帮我们自动实现了所有方法,我们只要重写需要的方法即可
anim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
}
});
使用XML编写动画
单个动画
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:valueFrom="1"
android:valueTo="0"
android:valueType="floatType"
android:propertyName="alpha"/>
组合动画
<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>
启动动画
Animator animator = AnimatorInflater.loadAnimator(context, R.animator.anim_file);
animator.setTarget(view);
animator.start();
参考链接: