• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

Andriod anim 补间(Tween)动画与Interpolator以及setCustomAnimations方法

互联网 diligentman 6天前 5次浏览

补间(Tween)动画

Android 使用Animation代抽象的动画类,它包括如下几个子类。

  1. AlphaAnimation:透明度改变的动画。创建该动画时要指定动画开始时的透明度、结束时的透明度和动画持续时间。其中透明度可从0变化到1。
  2. ScaleAnimation:大小缩放的动画。创建该动画时要指定动画开始时的缩放比(以X、Y轴的缩放参数来表示)、结束时的缩放比(以X、Y轴的缩放参数来表示),并指定动画持续时间。由于缩放时以不同点为中心的缩放效果并不相同,因此指定缩放动画时还要通过pivotX、pivotY来指定“缩放中心”的坐标。
  3. TranslateAnimation:位移变化的动画。创建该动画时只要指定动画开始时的位置(以X、Y坐标来表示)、结束时的位置(以X、Y坐标来表示),并指定动画持续时间即可。
  4. RotateAnimation:旋转动画。创建该动画时只要指定动画开始时的旋转角度、结束时的旋转角度,并指定动画持续时间即可。由于旋转时以不同点为中心的旋转效果并不相同,因此指定旋转动画时还要通过pivotX、pivotY来指定“旋转轴心”的坐标。
  • 一旦为补间动画指定了三个必要信息,Android就会根据动画的开始帧、结束帧、动画持续时间计算出需要在中间“补入”多少帧,并计算所有补入帧的图形。当用户浏览补间动画时,他眼中看到的依然是“逐帧动画”。
  • 为了控制在动画期间需要动态“补入”多少帧,具体在动画运行的哪些时刻补入帧,需要借助于Interpolator

Interpolator

  • Interpolator 根据特定算法计算出整个动画所需要动态插入帧的密度和位置。简单地说,aterpolator负责控制动画的变化速度,这就使得基本的动画效果(AIpha、Scale、Translate Roete能以匀速变化、加速、减速、抛物线速度等各种速度变化。

  • Interpolator是一个接口,它定义了所有Interpolator都需要实现的方法:float getInterpolation(floatimput),开发者完全可以通过实现Interpolator来控制动画的变化速度。

Android为Interpolator提供了如下几个实现类,分别用于实现不同的动画变化速度。

  1. LinearInterpolator:动画以均匀的速度改变。
  2. AccelerateInterpolator:在动画开始的地方改变速度较慢,然后开始加速。
  3. AccelerateDecelerateInterpolator:在动画开始、结束的地方改变速度较慢,在中间的时候加速。
  4. CycleInterpolator:动画循环播放特定的次数,变化速度按正弦曲线改变。
  5. 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个参数

  1. 第一个参数enter是指当一个Fragment被添加added 或者绑定attached到视图上,该Fragment进入视图时的animation或者animator的资源ID;
  2. 第二个参数exit是指当一个Fragment从视图上被移除removed或者解除绑定detached时,该Fragment移出视图时的animation或者animator的资源ID;
  3. 第三个参数popEnter是指当调用popBackStack()方法或者类似的方法弹出栈顶的Fragment后,Fragment栈的栈顶Fragment重新被添加readded或重新绑定reattached到视图上时,该Fragment进入视图时的animation或者animator的资源ID;
  4. 第四个参数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的动画。


喜欢 (0)