Android 中 四种动画效果:
1.alpha:渐变透明度动画效果
2.scale:渐变尺寸的动画效果
3.translate:位置转移动画效果
4.rotate:旋转动画效果
(还可使用 set 定义动画集合:将几个不同的动作定义成一个组)
一、动画效果的属性
1.通用属性:
Android中,这几种动画效果的父类都为Animation,所以四种动画效果有着部分相同的属性
android:duration 动画持续时间,以毫秒为单位
android:fillAfter 如果设置为true,控件动画结束时,将保持动画最后时的状态
android:fillBefore 如果设置为true,控件动画结束时,还原到开始动画前的状态
android:fillEnabled 与android:fillBefore 效果相同,都是在动画结束时,将控件还原到初始化状态
android:repeatCount 重复次数
android:repeatMode 重复类型,有reverse和restart两个值,reverse表示倒序回放,restart表示重新放一遍,必须与repeatCount一起使用才能看到效果。因为这里的意义是重复的类型,即回放时的动作。
android:interpolator 设定插值器,其实就是指定的动作效果,比如弹跳效果等。*(文章最后会介绍)
2.各自特有的属性:
2.1 alpha-AlphaAnimation,--渐变透明度动画
android:fromAlpha 动画开始的透明度,从0.0 --1.0 ,0.0表示全透明,1.0表示完全不透明
android:toAlpha 动画结束时的透明度,也是从0.0 --1.0 ,0.0表示全透明,1.0表示完全不透明
2.2 rotate-RotateAnimation,--旋转动画
android:fromDegrees 开始旋转的角度位置,正值代表顺时针方向度数,负值代码逆时针方向度数
android:toDegrees 结束时旋转到的角度位置,正值代表顺时针方向度数,负值代码逆时针方向度数
android:pivotX 旋转点X轴坐标,可以是数值、百分数、百分数p 三种样式,比如 50、50%、50%p
android:pivotY 旋转点Y轴坐标,可以是数值、百分数、百分数p 三种样式,比如 50、50%、50%p
2.3 scale-ScaleAnimation,--渐变尺寸动画
android:fromXScale 起始的X方向上相对自身的缩放比例,浮点值,比如1.0代表自身无变化,0.5代表起始时缩小一倍,2.0代表放大一倍;
android:toXScale 结尾的X方向上相对自身的缩放比例,浮点值;
android:fromYScale 起始的Y方向上相对自身的缩放比例,浮点值
android:toYScale 结尾的Y方向上相对自身的缩放比例,浮点值;
android:pivotX 缩放起点X轴坐标,可以是数值、百分数、百分数p 三种样式,比如 50、50%、50%p,
当为数值50时,表示在当前View的左上角,即原点处加上50px,做为起始缩放点;
如果是50%,表示在当前控件的左上角加上自己宽度的50%做为起始点;
如果是50%p,那么就是表示在当前的左上角加上父控件宽度的50%做为起始点x轴坐标
android:pivotY 缩放起点Y轴坐标,取值及意义跟android:pivotX一样。
2.4 translate-TranslateAnimation --位置转移动画
android:fromXDelta 起始点X轴坐标,可以是数值、百分数、百分数p 三种样式,比如 50、50%、50%p
android:fromYDelta 起始点Y轴从标,可以是数值、百分数、百分数p 三种样式;
android:toXDelta 结束点X轴坐标
android:toYDelta 结束点Y轴坐标
(动画集合set-AnimationSet ,AnimationSet只有Animation通用的属性)
二、动画效果的使用方法
1.写在xml中,在java中使用
步骤:
(1)在res文件夹下新建anim文件夹,用于存放动画文件
(2) 在anim文件夹下,新建动画文件 (例:建一个透明度渐变动画 alphaanim.xml)
<?xml version="1.0" encoding="UTF-8"?> <alpha xmlns:android="http://schemas.android.com/apk/res/android" android:fromAlpha="1.0" android:toAlpha="0.1" android:duration="3000" android:fillBefore="true"> </alpha>(建一个动画集合 animset.xml)
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:duration="3000" android:fillBefore="true"> <alpha android:fromAlpha="0.0" android:toAlpha="1.0"/> <scale android:fromXScale="0.0" android:toXScale="1.4" android:fromYScale="0.0" android:toYScale="1.4" android:pivotX="50" android:pivotY="50"/> <rotate android:fromDegrees="0" android:toDegrees="720" android:pivotX="50%" android:pivotY="50%"/> </set>
(3) 在java中使用动画
//载入定义在xml中的动画 final Animation alphaAnim = AnimationUtils.loadAnimation(this, R.anim.alphaanim); //按钮点击事件,点击后,TextView 展现动画效果 alpha.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //开始动画 textView.startAnimation(alphaAnim); } });
2. java文件中直接写动画,然后使用
(例)java中直接定义一个透明度渐变动画,然后点击按钮时使用
//java中定义 一个 透明度渐变的动画效果,从透明度0.8变到0.2 final AlphaAnimation alphaAnimation = new AlphaAnimation(0.8f, 0.2f); //设置动画时长为2秒 alphaAnimation.setDuration(2000); //按钮点击事件,点击后,TextView 展现动画效果 alpha.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //开始动画 textView.startAnimation(alphaAnimation); } });
(例:在java中定义一个动画集合,让TextView 一边旋转一边消失)
final AnimationSet animationSet = new AnimationSet(false); animationSet.setDuration(2000); //定义一个旋转动画,从30度旋转到720度,以自身中点为旋转中心 final RotateAnimation rotateAnimation = new RotateAnimation(30.0f, 720f, RotateAnimation.RELATIVE_TO_SELF, 0.5f, RotateAnimation.RELATIVE_TO_SELF, 0.5f); //java中定义 一个 透明度渐变的动画效果,从透明度0.8变到0.2 final AlphaAnimation alphaAnimation = new AlphaAnimation(1.0f, 0.0f); //加入到动画集合后,该设置无效,时间长度变为和AnimationSet的时间长度相同 alphaAnimation.setDuration(5000); //将两个动画效果添加到 动画集合中 animationSet.addAnimation(alphaAnimation); animationSet.addAnimation(rotateAnimation); //按钮点击事件,点击后,TextView 展现动画效果 animSet.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { textView.startAnimation(animationSet); } });
三、interpolator 插值器
android:interpolator="@android:anim/decelerate_interpolator" (xml中定义interpolator)
rotateAnimation.setInterpolator(new DecelerateInterpolator()); (java中设置interpolator)
可设定的具体的值:
AccelerateDecelerateInterpolator 在动画开始与结束的地方速率改变比较慢,在中间的时候加速
AccelerateInterpolator 在动画开始的地方速率改变比较慢,然后开始加速
AnticipateInterpolator 开始的时候向后然后向前甩
AnticipateOvershootInterpolator 开始的时候向后然后向前甩一定值后返回最后的值
BounceInterpolator 动画结束的时候弹起
CycleInterpolator 动画循环播放特定的次数,速率改变沿着正弦曲线
DecelerateInterpolator 在动画开始的地方快然后慢
LinearInterpolator 以常量速率改变
OvershootInterpolator 向前甩一定值后再回到原来位置
(例:xml中定义一个移动的动画效果,先块后慢)
<?xml version="1.0" encoding="UTF-8"?> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:fromXDelta="30" android:toXDelta="-80" android:fromYDelta="30" android:toYDelta="-80" android:duration="2000" android:interpolator="@android:anim/decelerate_interpolator" android:fillBefore="true"> <!-- android:interpolator="@android:anim/decelerate_interpolator" 使动画移动效果先快后慢 --> </translate>(例:java中定义一个动画集合,使动画开始的时候向后,然后向前旋转。整个动画过程中TextView不断变透明)
final AnimationSet animationSet = new AnimationSet(false); animationSet.setDuration(2000); //定义一个旋转动画,从30度旋转到720度,以自身中点为旋转中心 final RotateAnimation rotateAnimation = new RotateAnimation(0.0f, 720f, RotateAnimation.RELATIVE_TO_SELF, 0.5f, RotateAnimation.RELATIVE_TO_SELF, 0.5f); // rotateAnimation.setInterpolator(new AnticipateInterpolator()); //java中定义 一个 透明度渐变的动画效果,从透明度0.8变到0.2 final AlphaAnimation alphaAnimation = new AlphaAnimation(1.0f, 0.0f); //将两个动画效果添加到 动画集合中 animationSet.addAnimation(alphaAnimation); animationSet.addAnimation(rotateAnimation); //按钮点击事件,点击后,TextView 展现动画效果 animSet.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { textView.startAnimation(animationSet); } });