5.Animation类中的通用方法
上面介绍的4种动画实际上都是Animation类的子类,Animation类中封装了许多动画通用的方法,例如前面使用的设置动画执行时间的方法setDuration就是Animation类的方法,其中更多常用方法列举如下:
//取消正在执行的动画
public void cancel();
//设置动画的执行函数
public void setInterpolator(Interpolator i);
//这只方法设置开始动画的延时值 单位为毫秒
public void setStartOffset(long startOffset);
//设置动画的执行时间
public void setDuration(long durationMillis);
//设置动画特效的最长运行时间
public void restrictDuration(long durationMillis);
//设置动画的执行强度比例 例如放大两倍的动画 这个值如果设置为2 将被放大4倍
public void scaleCurrentDuration(float scale);
//为动画设置一个开始的时间
public void setStartTime(long startTimeMillis);
//设置动画循环模式
/*
只有当动画的循环次数大于1时这个值才有效果,其可以设置为如下常量:
RESTART 每次循环都从头执行
REVERSE 正逆交替执行
*/
public void setRepeatMode(int repeatMode);
//设置循环次数 设置为INFINITE则为无限循环
public void setRepeatCount(int repeatCount);
//设置是否允许填充动画 这个方法设置为true后setFillBefore()与setFillAfter()方法才会生效
public void setFillEnabled(boolean fillEnabled);
//动画结束后 是否以起始位置填充视图
public void setFillBefore(boolean fillBefore);
//动画结束后 是否以结束位置填充视图
public void setFillAfter(boolean fillAfter)
//设置动画执行时在Z轴上的位置
/*
可以设置为如下3中常量
public static final int ZORDER_BOTTOM = -1; //将动画放在Z轴最下边
public static final int ZORDER_NORMAL = 0; //将动画放在Z轴原位置
public static final int ZORDER_TOP = 1; //将动画放在Z轴最上边
*/
public void setZAdjustment(int zAdjustment);
//设置动画的执行是否影响到壁纸
public void setDetachWallpaper(boolean detachWallpaper);
//获取动画是否开始执行了
public boolean hasStarted();
//获取动画是否结束执行了
public boolean hasEnded();
上面列举的方法中,setInterpolator()方法很有意思,其可以设置动画执行的时间函数,例如是先快后慢还是先慢后快等等,这个方法需要传入一个Interpolator类型的参数,实际上使用时是通过Interpolator的子类来实现的,示例如下:
ranslateAnimation.setInterpolator(new AccelerateDecelerateInterpolator());
对于Interpolator参数开发者可以设置的子类及意义列举如下:
AccelerateDecelerateInterpolator:先加速后减速执行
AccelerateInterpolator:加速执行
AnticipateInterpolator:先后退执行一步后正向加速执行(类似弹簧效果)
AnticipateOvershootInterpolator:先后退执行一步后加速执行到达极限后再前进一步后再回到极限(弹簧)
BounceInterpolator:动画执行到结尾后进行阻尼效果
CycleInterpolator:以正弦规则循环执行数次动画,这个类来构造时需要传入循环次数,如下:
new CycleInterpolator(3)
DecelerateInterpolator:减速执行动画
FastOutLinearInInterpolator:基于贝塞尔曲线的速率变化
FastOutSlowInInterpolator:基于贝塞尔曲线的速率变化
LinearInterpolator:线性匀速执行
LinearOutSlowInInterpolator:基于贝塞尔曲线的速率变化
OvershootInterpolator:执行超出极限后在回退
PathInterpolator:自定义运动路径
6.实现对Animation动画状态的监听
Animation类中也定义了一个监听器协议,其中提供了对动画状态进行监听的方法,如下:
public interface AnimationListener {
//当动画开始执行时触发的方法
void onAnimationStart(Animation var1);
//动画执行结束后触发的方法
void onAnimationEnd(Animation var1);
//动画重复执行的时候会触发
void onAnimationRepeat(Animation var1);
}
7.使用xml文件配置View Animation
上面介绍的全部是通过代码来创建View Animation动画,Android也支持使用xml文件来配置View Animation动画。
首先在Android Studio的res目录中创建一个动画文件目录,将其类型选择为anim,如下图所示:
在创建的目录中创建一个新的xml文件,在其中编写动画代码如下:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha android:fromAlpha="1" android:toAlpha="0" android:duration = "3000"/>
</set>
在代码中,使用如下代码来加载xml配置的动画:
//加载动画文件
Animation animation = AnimationUtils.loadAnimation(this,R.anim.my_anmi);
//执行动画
animationImageView.startAnimation(animation);
8.复合的View Animation
View Animation也支持进行复合动画的操作,如果使用xml配置复合动画,十分简单,只需要将要要复合的动画都配置进xml文件的set标签中即可,如下:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha android:fromAlpha="1" android:toAlpha="0" android:duration = "3000"/>
<scale android:fromXScale="1" android:toXScale="2" android:fromYScale="1" android:toYScale="2" android:duration="3000"/>
</set>
如果要用代码创建复合动画,需要使用到AnimationSet类进行复合,示例如下:
//创建动画集合容器 参数决定容器中所有动画是否共用Interpolator时序函数
AnimationSet set = new AnimationSet(true);
//创建动画
RotateAnimation rotateAnimation = new RotateAnimation(0,360, Animation.RELATIVE_TO_SELF,1f,Animation.RELATIVE_TO_SELF,1f);
ScaleAnimation scaleAnimation = new ScaleAnimation(1,2,1,2,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
scaleAnimation.setDuration(3000);
rotateAnimation.setDuration(3000);
//将动画添加进集合中
set.addAnimation(rotateAnimation);
set.addAnimation(scaleAnimation);
//执行动画
animationImageView.startAnimation(set);