Android Animation 之补间动画

1. 补间动画(Tween Animation)

补间动画可以在一个视图容器内执行一系列简单变换(位置、大小、旋转、透明度)。补间动画只需指定动画开始,以及动画结束”关键帧”, 而动画变化的”中间帧”则由系统计算并补齐。对应关系如下:

java类名 描述信息
AlphaAnimation 渐变透明度动画效果
RotateAnimation 画面转移旋转动画效果
ScaleAnimation 渐变尺寸伸缩动画效果
TranslateAnimation 画面转换位置移动动画效果
AnimationSet 一个持有其它动画元素alpha、scale、translate、rotate或者其它set元素的容器
  • 插值器(Interpolator)的属性

LinearInterpolator:动画以均匀的速度改变

AccelerateInterpolator:在动画开始的地方改变速度较慢,然后开始加速

AccelerateDecelerateInterpolator:在动画开始、结束的地方改变速度较慢,中间时加速

CycleInterpolator:动画循环播放特定次数,变化速度按正弦曲线改变: Math.sin(2 * mCycles * Math.PI * input)

DecelerateInterpolator:在动画开始的地方改变速度较快,然后开始减速

AnticipateInterpolator:反向,先向相反方向改变一段再加速播放

AnticipateOvershootInterpolator:开始的时候向后然后向前甩一定值后返回最后的值

BounceInterpolator: 跳跃,快到目的值时值会跳跃,如目的值100,后面的值可能依次为85,77,70,80,90,100

OvershottInterpolator:回弹,最后超出目的值然后缓慢改变到目的值

  • 插值器(Interpolator)的使用方式:

在标签中使用方式如下代码:

        android:interpolator="@android:anim/accelerate_decelerate_interpolator" 
  • 自定义插值器(Interpolator)

如果有需要,可以在 xml 或 java 文件中自定义插值器,两种方式代码示例如下:

    //方法一、新建 xml 文件方式
    <?xml version="1.0" encoding="utf-8"?>
    <InterpolatorName xmlns:android="http://schemas.android.com/apk/res/android"
        android:attribute_name="value"/>
        ...
    </set>

    //方法二、新建 java 文件方式
    public class AccelerateDecelerateInterpolator extends BaseInterpolator
            implements NativeInterpolatorFactory {
        ......
        public float getInterpolation(float input) {
            return (float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f;
        }
        ......
    }

1.1 Animation 属性及方法

xml属性 java方法 解释
android:detachWallpaper setDetachWallpaper(boolean) 是否在壁纸上运行
android:duration setDuration(long) 动画持续时间,毫秒为单位
android:fillAfter setFillAfter(boolean) 控件动画结束时是否保持动画最后的状态
android:fillBefore setFillBefore(boolean) 控件动画结束时是否还原到开始动画前的状态
android:fillEnabled setFillEnabled(boolean) 与android:fillBefore效果相同
android:interpolator setInterpolator(Interpolator) 设定插值器(指定的动画效果,譬如回弹等)
android:repeatCount setRepeatCount(int) 重复次数
android:repeatMode setRepeatMode(int) 重复类型有两个值,reverse表示倒序回放,restart表示从头播放
android:startOffset setStartOffset(long) 调用 start 函数之后等待开始运行的时间,单位为毫秒
android:zAdjustment setZAdjustment(int) 表示被设置动画的内容运行时在Z轴上的位置(top/bottom/normal),默认为normal
Animation类的方法 解释
reset() 重置Animation的初始化
cancel() 取消Animation动画
start() 开始Animation动画
setAnimationListener(AnimationListener listener) 给当前Animation设置动画监听
hasStarted() 判断当前Animation是否开始
hasEnded() 判断当前Animation是否结束
View 类的常用动画操作方法 解释
startAnimation(Animation animation) 对当前View开始设置的Animation动画
clearAnimation() 取消当View在执行的Animation动画

1.2 AlphaAnimation 属性

xml属性 java方法 解释
android:fromAlpha AlphaAnimation(float fromAlpha, …) 动画开始的透明度(0.0到1.0,0.0是全透明,1.0是不透明)
android:toAlpha AlphaAnimation(…, float toAlpha) 动画结束的透明度,同上
  • 使用示例(完全透明 -> 完全不透明;用时 2s):

    <alpha xmlns:android="http://schemas.android.com/apk/res/android"  
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"  
        android:fromAlpha="1.0"  
        android:toAlpha="0.1"  
        android:duration="2000"/>
    

1.3 RotateAnimation 属性

xml属性 java方法 解释
android:fromDegrees RotateAnimation(float fromDegrees, …) 旋转开始角度,正代表顺时针度数,负代表逆时针度数
android:toDegrees RotateAnimation(…, float toDegrees, …) 旋转结束角度,正代表顺时针度数,负代表逆时针度数
android:pivotX RotateAnimation(…, float pivotX, …) 缩放起点X坐标(数值、百分数、百分数p,譬如50表示以当前View左上角坐标加50px为初始点、50%表示以当前View的左上角加上当前View宽高的50%做为初始点、50%p表示以当前View的左上角加上父控件宽高的50%做为初始点)
android:pivotY RotateAnimation(…, float pivotY) 缩放起点Y坐标,同上规律
  • 使用示例(旋转一周):

    <rotate xmlns:android="http://schemas.android.com/apk/res/android"  
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"  
        android:fromDegrees="0"  
        android:toDegrees="360"  
        android:duration="1000"  
        android:repeatCount="1"  
        android:repeatMode="reverse"/> 
    

1.4 ScaleAnimation 属性

xml属性 java方法 解释
android:fromXScale ScaleAnimation(float fromX, …) 初始X轴缩放比例,1.0表示无变化
android:toXScale ScaleAnimation(…, float toX, …) 结束X轴缩放比例
android:fromYScale ScaleAnimation(…, float fromY, …) 初始Y轴缩放比例
android:toYScale ScaleAnimation(…, float toY, …) 结束Y轴缩放比例
android:pivotX ScaleAnimation(…, float pivotX, …) 缩放起点X轴坐标(数值、百分数、百分数p,譬如50表示以当前View左上角坐标加50px为初始点、50%表示以当前View的左上角加上当前View宽高的50%做为初始点、50%p表示以当前View的左上角加上父控件宽高的50%做为初始点)
android:pivotY ScaleAnimation(…, float pivotY) 缩放起点Y轴坐标,同上规律
  • 使用示例(以图像中心点为轴心放大图像):

    <scale xmlns:android="http://schemas.android.com/apk/res/android"  
        android:interpolator="@android:anim/accelerate_interpolator"  
        android:fromXScale="0.2"  
        android:toXScale="1.5"  
        android:fromYScale="0.2"  
        android:toYScale="1.5"  
        android:pivotX="50%"  //缩放的中轴点X/Y坐标,即距离自身左边缘的位置
        android:pivotY="50%"  
        android:duration="2000"/>
    

1.5 TranslateAnimation 属性

xml属性 java方法 解释
android:fromXDelta TranslateAnimation(float fromXDelta, …) 起始点X轴坐标(数值、百分数、百分数p,譬如50表示以当前View左上角坐标加50px为初始点、50%表示以当前View的左上角加上当前View宽高的50%做为初始点、50%p表示以当前View的左上角加上父控件宽高的50%做为初始点)
android:fromYDelta TranslateAnimation(…, float fromYDelta, …) 起始点Y轴从标,同上规律
android:toXDelta TranslateAnimation(…, float toXDelta, …) 结束点X轴坐标,同上规律
android:toYDelta TranslateAnimation(…, float toYDelta) 结束点Y轴坐标,同上规律
  • 使用示例(沿 X 轴平移):

    <translate xmlns:android="http://schemas.android.com/apk/res/android"  
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"  
        android:fromXDelta="0"  
        android:toXDelta="320"  
        android:fromYDelta="0"  
        android:toYDelta="0"  
        android:duration="2000"/>
    

1.6 AnimationSet 属性

AnimationSet 继承自 Animation ,是上面四种动画的组合容器管理类,没有自己特有的属性,他的属性继承自 Animation 。

所以特别注意,当我们对set标签使用 Animation 的属性时会对该标签下的所有子控件都产生影响!

  • 代码示例:

    <set xmlns:android="http://schemas.android.com/apk/res/android"  
        android:interpolator="@android:anim/decelerate_interpolator"  
        android:shareInterpolator="true" >  
    
        <scale  
            android:duration="2000"  
            android:fromXScale="0.2"  
            android:fromYScale="0.2"  
            android:pivotX="50%"  
            android:pivotY="50%"  
            android:toXScale="1.5"  
            android:toYScale="1.5" />  
    
        <rotate  
            android:duration="1000"  
            android:fromDegrees="0"  
            android:repeatCount="1"  
            android:repeatMode="reverse"  
            android:toDegrees="360" />  
    
        <translate  
            android:duration="2000"  
            android:fromXDelta="0"  
            android:fromYDelta="0"  
            android:toXDelta="320"  
            android:toYDelta="0" />  
    
        <alpha  
            android:duration="2000"  
            android:fromAlpha="1.0"  
            android:toAlpha="0.1" />  
    </set>
    

猜你喜欢

转载自blog.csdn.net/baidu_33221362/article/details/81004370