动画是通过把事物变化分解成许多瞬间的动作,给视觉造成连续变化的图画。 "Animation" 一词源自于拉丁文anima,意思为“灵魂”,动词animate是“赋予生命”的意思,引申为使某物活起来的意思。Android动画分为三种:帧动画、补间动画、属性动画。
依次说一下他们的使用:
1、帧动画
帧动画的本质是好多drawable依次播放,指定每张图片播放时长然后通过顺序播放形成动画,因此帧动画也会有一个问题就是图片数量不能太多并且每张图片不能太大否则就会导致OOM导致程序异常退出。关键类是AnimationDrawable。
第一步需要在res目录下drawable文件夹新建一个xml文件,我这是frameanimation.xml。
第二部将frameanimation.xml设置给ImageView组件
第三步通过ImageView组件获取AnimationDrawable
第四步使用AnimationDrawable实例去执行或者关闭动画。
这里是具体代码实现:
1.1第一步创建 frameanimation.xml
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@mipmap/round_spinner_fade_00" android:duration="100"/>
<item android:drawable="@mipmap/round_spinner_fade_01" android:duration="100"/>
<item android:drawable="@mipmap/round_spinner_fade_02" android:duration="100"/>
<item android:drawable="@mipmap/round_spinner_fade_03" android:duration="100"/>
<item android:drawable="@mipmap/round_spinner_fade_04" android:duration="100"/>
<item android:drawable="@mipmap/round_spinner_fade_05" android:duration="100"/>
<item android:drawable="@mipmap/round_spinner_fade_06" android:duration="100"/>
<item android:drawable="@mipmap/round_spinner_fade_07" android:duration="100"/>
</animation-list>
1.2 第二步 这里可以在xml中<ImageView标签设置也可以通过java代码设置
android:background="@drawable/frameanimation"
或者
animIv.setImageResource(R.drawable.frameanimation);
1.3 第三步
AnimationDrawable animationDrawable = (AnimationDrawable) animIv.getDrawable();
1.4 第四步
animationDrawable.start(); //执行动画
animationDrawable.stop(); //关闭动画
2、补间动画
补间动画其实徒有其表,为啥呢?因为你看着它懂了但实际他没动,能相应点击事件的位置还是老地方。
补间动画又叫view动画,分为平移动画TranslateAnimation、缩放动画ScaleAnimation、旋转动画RotateAnimation、透明度动画AlphaAnimation以及动画合集AnimationSet,都是Animation的子类。在xml文件中对应的标签分别是<translate>、<scale>、<rotate>、<alpha>、<set>,用法基本类似此处以缩放动画为例。<set>标签内部和AnimationSet内部可以放其他的动画或者动画合集。
<translate> 中:
android:fromXDelta="0" 表示横向移动的起始值;
android:fromYDelta="50" 表示横向移动的结束值;
android:toXDelta="0" 表示纵向移动的起始值;
android:toYDelta="56" 表示纵向移动的结束值;
<scale> 中:
android:fromXScale="1.0" 表示横向缩放的起始值;
android:toXScale="0.3" 表示横向缩放的结束值;
android:fromYScale="1.0" 表示纵向缩放的起始值;
android:toYScale="0.3" 表示纵向缩放的结束值;
android:pivotX="0.5" 表示缩放中心点的x坐标
android:pivotY="0.5" 表示缩放中心点的Y坐标
android:repeatCount="5" 重复次数
缩放的中心点默认是执行动画的view本身的中心点。
<rotate> 中:
android:fromDegrees="0" 表示旋转开始的角度
android:toDegrees="90" 表示旋转结束的角度
android:pivotX="0.5" 表示缩放中心点的x坐标
android:pivotY="0.5" 表示缩放中心点的Y坐标
旋转的角度就是指的0到360度角的那个度数。pivotX和pivotY是不是很眼熟,没错,scale动画也有这两个属性。
<alpha> 中:
android:fromAlpha="" 透明度的起始值
android:toAlpha="" 透明度的结束值
透明度范围是0~1 。
此处以缩放动画为例:
第一步 需要在res目录下新建anim文件夹在其中新建一个Animation Resource File文件,我这是scale_anim.xml。
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" android:repeatMode="restart">
<scale android:pivotY="0.5" android:pivotX="0.5" android:fromXScale="1.0" android:fromYScale="1.0" android:toXScale="0.3" android:toYScale="0.3" android:repeatCount="5"/>
</set>
- 使用AnimationUtils加载动画
scaleAnimation = AnimationUtils.loadAnimation(AnimationActivity.this, R.anim.scale_anim);
- 设置播放时长
scaleAnimation.setDuration(2000);
- 设置重复次数
scaleAnimation.setRepeatCount(1);
- 开启动画和关闭动画
animIv.startAnimation(scaleAnimation); //开启
scaleAnimation.cancel(); //关闭
animIv.clearAnimation(); //清除动画
补充:
补间动画也可以在java代码中实现,这里其实完成了上面的第一步和第二部,有了animation对象其他的都一样了。
rotateAnimation = new RotateAnimation(0.0f, 360.0f, 0.5f, 0.5f);
这里用scale的举例,translate、scale、rotate、alpha用发也是类似,只有动画合集set相对特殊他是一个集合可以放这四种任何一个或者多个,建立Animation文件时系统自动创建了set标签
(2)补间动画必须设置duration时长,否则无效不会执行的或者瞬间只闪一下。
- 如果xml中已经配置了repeatCount此处设置重复次数将不再生效,想要这里生效就别在xml中适配;这个属性是重复次数,因此你设置2就一共三遍设置5一共执行6遍。
3、属性动画
属性动画是通过动态改变了对象属性实现动画效果。 它不会像无补间动画那样看似变化了但View的位置不变,动画执行后响应范围也是随之改变。是真正意义上的动画,而且应用范围很广不局限用作用于view,只要对象有这个属性就可以执行动画,因此使用范围也最广。
属性动画Animator是个抽象类,有三个子类ValueAnimator、AnimatorSet,而TimeAnimator和ObjectAnimator是ValueAnimator的子类、我们都是在使用他们四个实现动画。
属性动画是Android 3.0才引入的动画,所以此处需要适配低版本,不过现在5.0以下的系统时长份额已经很少,如果您工程的minSdkVersion大于等于11就不用考虑低版本适配了。
这里以属性动画的平移、缩放、透明度、旋转为例:
第一步 定义这些动画
private ObjectAnimator translationXAnimation() {
//参数第三个是一个可变参数,填写一个是想要移动的距离多个参数会在这几个参数的位置移动
ObjectAnimator transXAnimator = ObjectAnimator.ofFloat(animIv, "translationX", -1800, 300,600,-200,80);
transXAnimator.setDuration(2000);
transXAnimator.setRepeatCount(0);
return transXAnimator;
}
private ObjectAnimator translationYAnimation() {
ObjectAnimator transYAnimator = ObjectAnimator.ofFloat(animIv, "translationY", 100, 400);
transYAnimator.setDuration(2000);
transYAnimator.setRepeatCount(0);
return transYAnimator;
}
private ObjectAnimator scaleXAnimation() {
ObjectAnimator scaleXAnimator = ObjectAnimator.ofFloat(animIv, "scaleX", 0.0f, 2.0f);
scaleXAnimator.setDuration(2000);
scaleXAnimator.setRepeatCount(0);
return scaleXAnimator;
}
private ObjectAnimator scaleYAnimation() {
//参数第三个是一个可变参数,缩放渐变
ObjectAnimator scaleYAnimator = ObjectAnimator.ofFloat(animIv, "scaleY", 0.0f, 2.0f);
scaleYAnimator.setDuration(2000);
scaleYAnimator.setRepeatCount(0);
return scaleYAnimator;
}
private ObjectAnimator alphaAnimation() {
//参数第三个是一个可变参数,不管几个参数会在这几个参数之间改变透明度
ObjectAnimator alphaAnimator = ObjectAnimator.ofFloat(animIv, "alpha", 1.0f, 0.8f, 0.6f, 0.4f, 0.3f, 0.0f);
alphaAnimator.setDuration(2000);
alphaAnimator.setRepeatCount(-1);//-1是一直重复
alphaAnimator.setRepeatMode(ObjectAnimator.RESTART);//reverse表示到临界值反向恢复,1.0-0.0然后0.0-1.0周而复始;restart表示1.0-0.0然后又1.0-0.0
return alphaAnimator;
}
private ObjectAnimator rotateAnimation() {
//参数第三个是一个可变参数,填写一个没效果不报错,两个是想要旋转的的距离from-to,多个参数会在这几个参数的角度旋转
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(animIv, "rotation", 0f,360f,0f);
objectAnimator.setDuration(2000);
return objectAnimator;
}
第二步 执行动画 每一个都可调用start方法单独执行
transXAnimator.start();
transYAnimator.start();
scaleXAnimator.start();
scaleYAnimator.start();
alphaAnimator.start();
rotateAnimator.start();
可以用上面的animator单独开启动画或者使用使用animatorset开启动画合集
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(rotateAnimator, alphaAnimator, scaleXAnimator, scaleYAnimator, transXAnimator, transYAnimator);
animatorSet.start();
第三步 停止动画
animSet.cancel();
animIv.clearAnimation();
下一篇记录一下插值器和估值器以及自定义属性动画。