一.帧动画.
1.在drawable文件夹下面创建动画文件.
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:drawable="@mipmap/tm_mui_bike_0"
android:duration="10"/>
<item
android:drawable="@mipmap/tm_mui_bike_1"
android:duration="10"/>
<item
android:drawable="@mipmap/tm_mui_bike_2"
android:duration="10"/>
<item
android:drawable="@mipmap/tm_mui_bike_3"
android:duration="10"/>
<item
android:drawable="@mipmap/tm_mui_bike_4"
android:duration="10"/>
<item
android:drawable="@mipmap/tm_mui_bike_5"
android:duration="10"/>
<item
android:drawable="@mipmap/tm_mui_bike_5"
android:duration="10"/>
<item
android:drawable="@mipmap/tm_mui_bike_6"
android:duration="10"/>
</animation-list>
mImageView.setImageResource(R.drawable.animi);
AnimationDrawable drawable = (AnimationDrawable) mImageView.getDrawable();
drawable.start();
2.在 代码里面进行书写:
AnimationDrawable animationDrawable = new AnimationDrawable();
animationDrawable.setOneShot(false);
animationDrawable.addFrame(getResources().getDrawable(R.mipmap.tm_mui_bike_0), 100);
animationDrawable.addFrame(getResources().getDrawable(R.mipmap.tm_mui_bike_1), 100);
animationDrawable.addFrame(getResources().getDrawable(R.mipmap.tm_mui_bike_2), 100);
animationDrawable.addFrame(getResources().getDrawable(R.mipmap.tm_mui_bike_3), 100);
animationDrawable.addFrame(getResources().getDrawable(R.mipmap.tm_mui_bike_4), 100);
animationDrawable.addFrame(getResources().getDrawable(R.mipmap.tm_mui_bike_5), 100);
animationDrawable.addFrame(getResources().getDrawable(R.mipmap.tm_mui_bike_6), 100);
animationDrawable.addFrame(getResources().getDrawable(R.mipmap.tm_mui_bike_7), 100);
mImageView.setBackground(animationDrawable);
animationDrawable.start();
二.补间动画.
1.旋转动画
RotateAnimation rote = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
rote.setDuration(3000);
rote.setFillAfter(true);
View.startAnimation(rote);
参数说明:
float fromDegrees:旋转的开始角度。
float toDegrees:旋转的结束角度。
int pivotXType:X轴的伸缩模式,可以取值为ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。
float pivotXValue:X坐标的伸缩值。
int pivotYType:Y轴的伸缩模式,可以取值为ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。
float pivotYValue:Y坐标的伸缩值。
2.渐变动画
AlphaAnimation alphaAnimation = new AlphaAnimation(0, 1);
//设置动画播放的时间的长短
alphaAnimation.setDuration(5000);
//设置动画结束的时候是否是在动画的终点的位置
alphaAnimation.setFillAfter(true);
//给控件设置上动画的效果
View.startAnimation(alphaAnimation);
参数说明:
float fromAlpha 动画开始时的透明度
float toAlpha 动画结束的透明度
0表示完全透明,1表示完全显示
3,平移动画
TranslateAnimation translateAnimation = new TranslateAnimation(0, 500, 0, 0);
translateAnimation.setDuration(1000);
translateAnimation.setFillAfter(false);
mAnima.startAnimation(translateAnimation);
float fromXDelta 动画开始的点离当前View X坐标上的差值
float toXDelta 动画结束的点离当前View X坐标上的差值
float fromYDelta 动画开始的点离当前View Y坐标上的差值
float toYDelta 动画开始的点离当前View Y坐标上的差值
4.缩放动画
ScaleAnimation sca = new ScaleAnimation(0.0f, 3f, 0.0f, 3f,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
sca.setDuration(1000);
sca.setFillAfter(true);
mAnima.startAnimation(sca);
float fromX 动画起始时 X坐标上的伸缩尺寸
float toX 动画结束时 X坐标上的伸缩尺寸
float fromY 动画起始时Y坐标上的伸缩尺寸
float toY 动画结束时Y坐标上的伸缩尺寸
int pivotXType 动画在X轴相对于物件位置类型
float pivotXValue 动画相对于物件的X坐标的开始位置
int pivotYType 动画在Y轴相对于物件位置类型
float pivotYValue 动画相对于物件的Y坐标的开始位置
5.动画集
TranslateAnimation translateAnimation = new TranslateAnimation(0, 500, 0, 0);
translateAnimation.setDuration(3000);
RotateAnimation rote = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
rote.setDuration(3000);
ScaleAnimation sca = new ScaleAnimation(0.0f, 3f, 0.0f, 3f,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
sca.setDuration(1000);
AnimationSet animationSet = new AnimationSet(true);
animationSet.addAnimation(translateAnimation);
animationSet.addAnimation(rote);
animationSet.addAnimation(sca);
mAnima.startAnimation(animationSet);
new AnimationSet(false)创建AnimationSet时,可以在每个添加到AnimationSet中的Animation都使用Interpolator,且效果都能清楚的观察。
new AnimationSet(true)创建AnimationSet时,如果在添加到AnimationSet中的Animation设置Interpolator将无效果,通过设置AnimationSet的Interpolator可以设置所有动画的Interpolator且所有动画的Interpolator都一样。
三.属性动画.
1.两种实现的方式:
1:在res文件夹下面创建一个animater文件夹,然后在文件夹里面定义动画.
在XML文件中我们一共可以使用如下三种标签:
- 在XML文件中我们一共可以使用如下三种标签:
- <objectAnimator> 对应代码中的ObjectAnimator
- <set> 对应代码中的AnimatorSet
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"//时间
android:propertyName="scaleX"//属性
android:valueFrom="1.0"
android:valueTo="2.0"
android:valueType="floatType">
</objectAnimator>
组合动画:
<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>
读取xml定义好的动画效果
Animator animator = AnimatorInflater.loadAnimator(context, R.animator.anim_file);
animator.setTarget(view);
animator.start();
1:使用代码进行创建
ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(mTextView, "alpha", 0f, 1f, 0f);
objectAnimator1.setDuration(5000);
objectAnimator1.start();
通过ObjectAnimator的静态工厂方法,创建一个ObjectAnimator对象,我们传递的第一个参数就是要动画要作用的view对象btn,第二个参数则是要操作的属性,而后面的一个参数是一个可变参数数组,当传递参数数组只有一个数值时,动画内部去调用get方法获取初始化参数,并把传递参数作为目标值,而当传递参数的数组中有两个数值时,则会把第一个数值作为初始值,这时就不会去调用get了,只会调用set方式设置动画过程,并以第二个数值作为目标值,如我们上面传递了0和200,其中0就是初始值,而200就是目标值。其后的设置,setDuration(3000);设置动画时间,objectAnimator.start();则是启动动画。
2.原理.
属性动画其本质就是改变view的属性,使其去实现动画的效果.
要给一个view设置动画需要查看该View是否是具有get和set方法的.例如:
translationX -->x方向平移
alpha -->颜色渐变
rotation -->旋转
scaleY -->y轴放大
scaleX -->x轴放大
3.组合动画.
实现组合动画功能主要需要借助AnimatorSet这个类,这个类提供了一个play()方法,如果我们向这个方法中传入一个Animator对象(ValueAnimator或ObjectAnimator)将会返回一个AnimatorSet.Builder的实例,AnimatorSet.Builder中包括以下四个方法:
- after(Animator anim) 将现有动画插入到传入的动画之后执行
- after(long delay) 将现有动画延迟指定毫秒后执行
- before(Animator anim) 将现有动画插入到传入的动画之前执行
- with(Animator anim) 将现有动画和传入的动画同时执行
例如:
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(mTextView, "alpha", 0f, 1f, 0f);
ObjectAnimator animator = ObjectAnimator.ofFloat(mTextView, "scaleY", 1f, 3f, 1f);
ObjectAnimator animator2 = ObjectAnimator.ofFloat(mTextView, "scaleX", 1f, 3f, 1f);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.play(animator).before(animator2).before(objectAnimator);
animatorSet.setDuration(5000);
animatorSet.start();
4.监听动画播放的事件.
使用addListener()这个方法来监听动画播放事件.
animatorSet.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
//动画开始
}
@Override
public void onAnimationEnd(Animator animation) {
//动画结束
}
@Override
public void onAnimationCancel(Animator animation) {
//动画取消
}
@Override
public void onAnimationRepeat(Animator animation) {
//动画重复播放
}
});
但是也许很多时候我们并不想要监听那么多个事件,可能我只想要监听动画结束这一个事件,那么每次都要将四个接口全部实现一遍就显得非常繁琐。没关系,为此Android提供了一个适配器类,叫作AnimatorListenerAdapter,使用这个类就可以解决掉实现接口繁琐的问题了,如下所示:
animatorSet.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
//动画播放完毕
}
});