本篇主要为Android Animation分析
导读:
1.Animation是什么?
2.Animation分类
3.Tween Animation
4.监听器和插值器
5. LayoutAnimationsController
6.Frame-By-Frame Animation
7.Property Animation
8.总结
一. Animation是什么?
Animation在英文里是动画的意思,在Android中,使用Animation实现Android UI界面动画效果,Animations提供了一系列的动画效果,可以进行旋转、缩放、淡入淡出等,这些效果可以应用在绝大多数的控件中。
二.Animation的分类
在Android 3.0(API Level 11)以前,Android仅支持2种动画:分别是Frame-By-Frame Animation(逐帧动画)和 Tween Animation(补间动画),在3.0之后Android添加了一种新的动画系统,称为:Property Animation(属性动画)。
其中前两种统称为视图动画(View Animation)。
三.Tween Animation(补间动画)
概念:补间动画指我们只需指定开始、结束时的“关键帧“,变化中的其他帧由系统来计算,从而达到动画效果。
补间动画的优点是可以节省空间。目前Tween Animation支持的动画效果有以下5种。
AlphaAnimation(渐变)
Translate Animation(位移)
Scale Animation(缩放)
Rotate Animation(旋转)
Animation Set(动画集合)
Tween Animation第一种使用方法:
1.创建一个animationset对象,
2.根据需要创建相应的animation对象
3.为animation设置相应的数据
4.将animation对象添加到animationset对象当中去,
5.设置空间执行animationset
首先在布局里放置启动动画按钮和动画演示图片,在java代码中设置相应的监听器之后,在监听器里添加动画代码
//Alpha动画
/*第一步:创建animationset对象
*第二步:创建alphaanimation对象,设置相关参数
*第三步:设置时长(毫秒)
* 第四步:添加动画
* 第五步:设置动画
*/
AnimationSet animationset=new AnimationSet(true);
//参数说明:0,1分别代表着起始透明度和终止透明度
AlphaAnimation alphaanimation=new AlphaAnimation(0,1);
alphaanimation.setDuration(1000);
animationset.addAnimation(alphaanimation);
image.startAnimation(animationset);
// Translate动画
//参数里的Animation.RELATIVE_TO_SELF是指相对于自身,另外还有相对父布局,绝对位置两种参数
AnimationSet animationset=new AnimationSet(true);
TranslateAnimation ta=new TranslateAnimation(
Animation.RELATIVE_TO_SELF,0f, //相对参考 x起始
Animation.RELATIVE_TO_SELF,2.5f, //相对参考 x结束
Animation.RELATIVE_TO_SELF,0f, // 相对参考 y开始
Animation.RELATIVE_TO_SELF,-2.5f //相对参考 y结束
);
ta.setDuration(1000);
animationset.addAnimation(ta);
image.startAnimation(animationset);
// Rotate动画
AnimationSet animationset = new AnimationSet(true);
//参数一:从?角度开始旋转
//参数二:旋转到?角度
//参数三:依靠的x轴是父布局还是自己
//参数四:相对参数三旋转偏移量
//参数五:依靠的y轴是父布局还是自己
//参数六:相对参数五旋转偏移量
RotateAnimation ra = new RotateAnimation(0, 360, Animation.RELATIVE_TO_PARENT,
0.2f, Animation.RELATIVE_TO_SELF, -0.2f);
ra.setDuration(12000);
animationset.addAnimation(ra);
image.startAnimation(animationset);
//Scale动画
AnimationSet animationset=new AnimationSet(true);
//参数1,2:x轴从?缩小到?
//参数3,4:y轴从?缩小到?
//参数5,6:相对x轴参考及缩放量
//参数7,8:相对y轴参考及缩放量
ScaleAnimation sa=new ScaleAnimation(1,0.5f,1,0.5f
,Animation.RELATIVE_TO_SELF,1.0f,Animation.RELATIVE_TO_SELF
,1.0f);
sa.setDuration(1000);
animationset.addAnimation(sa);
image.startAnimation(animationset);
以上是补间的四种基本动画,另外还有AnimationSet集合动画
首先什么是AnimationSet?
AnimationSet是Animation的子类
一个AnimationSet包含一系列的Animation对象;怎么使用AnimationSet?
- AnimationSet 使用方法同其他动画类似,代码如下
AnimationSet animationSet=new AnimationSet(true);
AlphaAnimation alpha = new AlphaAnimation(0.1f,1.0f);
//一个渐变动画对象
RotateAnimation rotateAnimation=new RotateAnimation(0,360,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
//一个旋转动画对象
RotateAnimation ra = new RotateAnimation(0, 360, Animation.RELATIVE_TO_PARENT,
0.2f, Animation.RELATIVE_TO_SELF, -0.2f);
//第二个旋转动画对象
animationSet.addAnimation(alpha);
//添加第一个渐变对象
animationSet.addAnimation(rotateAnimation);
//添加第一个旋转对象
animationSet.addAnimation(ra);
//添加第二个旋转对象
animationSet.setDuration(2000);
//设置间隔时长
animationSet.setStartOffset(500);
//设置动画开始前等待
image.startAnimation(animationSet);
//设置动画
Tween Animation第二种使用方法:
使用第一种方法代码复用性不高,所以有了第二种:在xml中制作动画,在java中使用
具体方法:
1.在res下面新建anim文件夹
2.创建xml文件,首先加入< set >标签
3,在标签内加入四种动画标签(四选一或者set集合)
例:
单个动画
< alpha
android:fromAlpha="0.1"
android:toAlpha="1.0"
android:duration="3000"
>
集合动画
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
android:fromAlpha="0.1"
android:toAlpha="1.0"
android:duration="2000"
/>
<rotate
android:fromDegrees="0"
android:toDegrees="360"
android:pivotX="50%"
android:pivotY="50%"
android:duration="2000"/>
</set>
4,在代码里设置动画
//参数一:context
//参数二:xml文件
Animation animation=AnimationUtils.loadAnimation(MainActivity.this,R.anim.alpha);
imageView.startAnimation(animation);
补充在Activity跳转时的动画配置方式
startActivity(intent);
overridePendingTransition(R.anim.rotate,R.anim.rotate); //设置传入动画,传出动画
Tweened Animations通用属性:
1.setDuration(1000) 设置持续时间
2.setFillAfter(boolean) true时,动画结束保留状态
3.setFillBefore(boolean) true时,动画结束回到初始
4.setStartOffSet(long) 动画开始前等待时间
5.setRepeatCount(int) 动画重复次数
在实际项目中,我们经常使用补间动画,原因是补间动画使用起来比较方便,功能也比逐帧动画强大不少,而且还可以很方便地进行动画叠加,实现更加复杂的效果,但是由于其交互性差,逐渐被属性动画所取代。
四.监听器和插值器
AnimationListener(动画监听器)是一个监听器,该监听器在动画执行的各个阶段会得到通知,从而调用相应的方法;AnimationListener主要包括如下三个方法:onAnimationEnd(Animation animation) - 当动画结束时调用onAnimationRepeat(Animation animation) - 当动画重复时调用
onAniamtionStart(Animation animation) - 当动画启动时调用
监听器使用方法:
alpha.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
//添加逻辑
}
@Override
public void onAnimationEnd(Animation animation) {
//添加逻辑
}
@Override
public void onAnimationRepeat(Animation animation) {
//添加逻辑
}
});
通过这个监听回调,可以获取到动画的开始,结束和重复事件,并针对相应的事件作出不同的处理。
Interpolator(插值器)定义了动画变化的速率,在Animations框架当中定义了以下四种情况。
1. AccelerateDecelerateInterpolator:在动画开始与结束的地方速率改变比较慢,在中间的时候速率快。
2.AccelerateInterpolator:在动画开始的地方速率改变比较慢,然后开始加速
3. CycleInterpolator:动画循环播放特定的次数,速率改变沿着正弦曲线
4 .DecelerateInterpolator:在动画开始的地方速率改变比较慢,然后开始减速
5. LinearInterpolator:动画以均匀的速率改变
插值器使用方法一:
在xml里使用,这种方式很简单,只需要在set标签里设置就可以
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator"
android:shareInterpolator="true"
>
android:shareInterpolator=”true” 代表插值器共享给每一个动画
如果 android:shareInterpolator=”false” 那么需要为每一个动画单独设置插值器
在动画标签里添加插值器 android:interpolator=”@android:anim/accelerate_interpolator”
插值器使用方法二:
首先我们要明白下面第一行代码(这个是在java使用动画的第一行代码)里的参数的意思
AnimationSet animationSet=new AnimationSet(true);
//true是共享interpoltor的意思(所有对象共享)
animationSet.setInterpolator(new AccelerateDecelerateInterpolator());
//设置插值器
所有对象共享插值器,指代set集合里如果有很多种基础动画,那么他们将采用同一个速率规则来执行。如果这个参数为false,那么我们可以为动画本身设置插值方案。
alpha.setInterpolator(new AccelerateDecelerateInterpolator());
//设置alpha插值器
translate.setInterpolator(new AccelerateDecelerateInterpolator());
//设置 translate插值器
未完待续
本文参考:《Android群英传》 ,Mars Android视频第二季
如有错误,请在留言区指出。