补间(Tween)动画
Android 使用Animation代抽象的动画类,它包括如下几个子类。
- AlphaAnimation:透明度改变的动画。创建该动画时要指定动画开始时的透明度、结束时的透明度和动画持续时间。其中透明度可从0变化到1。
- ScaleAnimation:大小缩放的动画。创建该动画时要指定动画开始时的缩放比(以X、Y轴的缩放参数来表示)、结束时的缩放比(以X、Y轴的缩放参数来表示),并指定动画持续时间。由于缩放时以不同点为中心的缩放效果并不相同,因此指定缩放动画时还要通过pivotX、pivotY来指定“缩放中心”的坐标。
- TranslateAnimation:位移变化的动画。创建该动画时只要指定动画开始时的位置(以X、Y坐标来表示)、结束时的位置(以X、Y坐标来表示),并指定动画持续时间即可。
- RotateAnimation:旋转动画。创建该动画时只要指定动画开始时的旋转角度、结束时的旋转角度,并指定动画持续时间即可。由于旋转时以不同点为中心的旋转效果并不相同,因此指定旋转动画时还要通过pivotX、pivotY来指定“旋转轴心”的坐标。
- 一旦为补间动画指定了三个必要信息,Android就会根据动画的开始帧、结束帧、动画持续时间计算出需要在中间“补入”多少帧,并计算所有补入帧的图形。当用户浏览补间动画时,他眼中看到的依然是“逐帧动画”。
- 为了控制在动画期间需要动态“补入”多少帧,具体在动画运行的哪些时刻补入帧,需要借助于Interpolator
Interpolator
-
Interpolator 根据特定算法计算出整个动画所需要动态插入帧的密度和位置。简单地说,aterpolator负责控制动画的变化速度,这就使得基本的动画效果(AIpha、Scale、Translate Roete能以匀速变化、加速、减速、抛物线速度等各种速度变化。
-
Interpolator是一个接口,它定义了所有Interpolator都需要实现的方法:float getInterpolation(floatimput),开发者完全可以通过实现Interpolator来控制动画的变化速度。
Android为Interpolator提供了如下几个实现类,分别用于实现不同的动画变化速度。
- LinearInterpolator:动画以均匀的速度改变。
- AccelerateInterpolator:在动画开始的地方改变速度较慢,然后开始加速。
- AccelerateDecelerateInterpolator:在动画开始、结束的地方改变速度较慢,在中间的时候加速。
- CycleInterpolator:动画循环播放特定的次数,变化速度按正弦曲线改变。
- DecelerateInterpolator:在动画开始的地方改变速度较快,然后开始减速。
为了在动画资源文件中指定补间动画所使用的 Interpolator,定义补间动画的<set…/>元素支持
一个android:interpolator属性,该属性的属性值可指定为Android默认支持的Interpolator。例如:
@android:anim/linear_interpolator
@android:anim/accelerate_interpolator
@android:anim/accelerate_decelerate_interpolator
……
其实上面的写法很有规律,它们就是把系统提供的Interpolator实现类的类名的驼峰写法改为下画线写法即可。
一旦在程序中通过AnimationUtils 得到了代表补间动画的Animation 之后,接下来就可调用View的startAnimation(Animation anim)方法开始对该View执行动画了。
位移(translate)、旋转(rotate)、缩放(scale)、透明度(alpha)改变的补间动画
<?xml version="1.0" encoding="utf-8"?>
<!-- 定义动画匀速改变 -->
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/linear_interpolator" >
<translate
android:duration="500"
android:fromYDelta="100%"
android:toYDelta="0%" />
<rotate
android:duration="5000"
android:fromDegrees="0"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="720" />
<scale
android:duration="1000"
android:fillBefore="true"
android:fromXScale="1.0"
android:fromYScale="1.0"
android:pivotX="50%p"
android:pivotY="50%p"
android:toXScale="2.0"
android:toYScale="2.0" />
<rotate
android:duration="1000"
android:fromDegrees="0.5"
android:toDegrees="1" />
</set>
setCustomAnimations方法
setCustomAnimations (int enter, int exit, int popEnter, int popExit),该方法有4个参数:
- 第一个参数enter是指当一个Fragment被添加added 或者绑定attached到视图上,该Fragment进入视图时的animation或者animator的资源ID;
- 第二个参数exit是指当一个Fragment从视图上被移除removed或者解除绑定detached时,该Fragment移出视图时的animation或者animator的资源ID;
- 第三个参数popEnter是指当调用popBackStack()方法或者类似的方法弹出栈顶的Fragment后,Fragment栈的栈顶Fragment重新被添加readded或重新绑定reattached到视图上时,该Fragment进入视图时的animation或者animator的资源ID;
- 第四个参数popExit是指当调用popBackStack()方法或者类似的方法弹出栈顶的Fragment时,该弹出的Fragment即从视图上被移除removed或者解除绑定detached,该Fragment移出视图时的animation或者animator的资源ID。
getActivity().getSupportFragmentManager().beginTransaction()
.setCustomAnimations(R.anim.comment_down_animation,R.anim.comment_down_animation)
.hide(feedCommentFragment).commitAllowingStateLoss();
getChildFragmentManager().beginTransaction()
.setCustomAnimations(R.anim.comment_fullscreen_anim_enter, R.anim.comment_fullscreen_anim_out)
.show(commentFragment).commitAllowingStateLoss();
tips:setCustomAnimations方法必须成双出现,要么写两个要么写四个。上面部分代码表示在Activity、Fragment中加载新的Fragment的动画。