动画是通过把事物变化分解成许多瞬间的动作,给视觉造成连续变化的图画。 "Animation" 一词源自于拉丁文anima,意思为"灵魂",动词animate是"赋予生命"的意思,引申为使某物活起来的意思。Android动画分为三种:帧动画、补间动画、属性动画。
依次说一下他们的使用:
1、帧动画
帧动画的本质是好多drawable依次播放。
第一步需要在res目录下drawable文件夹新建一个xml文件,我这是frameanimation .xml。
第二部将frameanimation .xml设置给ImageView组件
第三步通过ImageView组件获取AnimationDrawable
第四步使用AnimationDrawable实例去执行或者关闭动画。
这里是具体代码实现:
1.1第一步创建 frameanimation .xml
java
<?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代码设置
java
android:background="@drawable/frameanimation"
或者
java
animIv.setImageResource(R.drawable.frameanimation);
1.3 第三步
java
AnimationDrawable animationDrawable = (AnimationDrawable) animIv.getDrawable();
1.4 第四步
java
animationDrawable.start(); //执行动画
animationDrawable.stop(); //关闭动画
2、补间动画
补间动画其实徒有其表,为啥呢?因为你看着它懂了但实际他没动,能相应点击事件的位置还是老地方。
补间分为平移动画translate、缩放动画scale、旋转动画rotate、透明度动画alpha以及动画合集set,用发基本类似此处以缩放动画为例。
第一步 需要在res目录下新建anim文件夹在其中新建一个Animation Resource File文件,我这是scale_anim .xml。
java
<?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加载动画
java
scaleAnimation = AnimationUtils.loadAnimation(AnimationActivity.this, R.anim.scale_anim);
- 设置播放时长
java
scaleAnimation.setDuration(2000);
- 设置重复次数
java
scaleAnimation.setRepeatCount(1);
- 开启动画和关闭动画
java
animIv.startAnimation(scaleAnimation); //开启
scaleAnimation.cancel(); //关闭
animIv.clearAnimation(); //清除动画
补充:
补间动画也可以在java代码中实现,这里其实完成了上面的第一步和第二部,有了animation对象其他的都一样了。
java
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的子类、我们都是在使用他们四个实现动画 。
这里以属性动画的平移、缩放、透明度、旋转为例:
第一步 定义这些动画
java
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方法单独执行
java
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();
第三步 停止动画
java
animSet.cancel();
animIv.clearAnimation();
下一篇记录一下插值器和估值器以及自定义属性动画。