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:detachWallpapersetDetachWallpaper(boolean)是否在壁纸上运行
android:durationsetDuration(long)动画持续时间,毫秒为单位
android:fillAftersetFillAfter(boolean)控件动画结束时是否保持动画最后的状态
android:fillBeforesetFillBefore(boolean)控件动画结束时是否还原到开始动画前的状态
android:fillEnabledsetFillEnabled(boolean)与android:fillBefore效果相同
android:interpolatorsetInterpolator(Interpolator)设定插值器(指定的动画效果,譬如回弹等)
android:repeatCountsetRepeatCount(int)重复次数
android:repeatModesetRepeatMode(int)重复类型有两个值,reverse表示倒序回放,restart表示从头播放
android:startOffsetsetStartOffset(long)调用 start 函数之后等待开始运行的时间,单位为毫秒
android:zAdjustmentsetZAdjustment(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:fromAlphaAlphaAnimation(float fromAlpha, …)动画开始的透明度(0.0到1.0,0.0是全透明,1.0是不透明)
android:toAlphaAlphaAnimation(…, 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:fromDegreesRotateAnimation(float fromDegrees, …)旋转开始角度,正代表顺时针度数,负代表逆时针度数
android:toDegreesRotateAnimation(…, float toDegrees, …)旋转结束角度,正代表顺时针度数,负代表逆时针度数
android:pivotXRotateAnimation(…, float pivotX, …)缩放起点X坐标(数值、百分数、百分数p,譬如50表示以当前View左上角坐标加50px为初始点、50%表示以当前View的左上角加上当前View宽高的50%做为初始点、50%p表示以当前View的左上角加上父控件宽高的50%做为初始点)
android:pivotYRotateAnimation(…, 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:fromXScaleScaleAnimation(float fromX, …)初始X轴缩放比例,1.0表示无变化
android:toXScaleScaleAnimation(…, float toX, …)结束X轴缩放比例
android:fromYScaleScaleAnimation(…, float fromY, …)初始Y轴缩放比例
android:toYScaleScaleAnimation(…, float toY, …)结束Y轴缩放比例
android:pivotXScaleAnimation(…, float pivotX, …)缩放起点X轴坐标(数值、百分数、百分数p,譬如50表示以当前View左上角坐标加50px为初始点、50%表示以当前View的左上角加上当前View宽高的50%做为初始点、50%p表示以当前View的左上角加上父控件宽高的50%做为初始点)
android:pivotYScaleAnimation(…, 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:fromXDeltaTranslateAnimation(float fromXDelta, …)起始点X轴坐标(数值、百分数、百分数p,譬如50表示以当前View左上角坐标加50px为初始点、50%表示以当前View的左上角加上当前View宽高的50%做为初始点、50%p表示以当前View的左上角加上父控件宽高的50%做为初始点)
android:fromYDeltaTranslateAnimation(…, float fromYDelta, …)起始点Y轴从标,同上规律
android:toXDeltaTranslateAnimation(…, float toXDelta, …)结束点X轴坐标,同上规律
android:toYDeltaTranslateAnimation(…, 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>
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值