Android 三种动画总结

本文详细介绍了Android中的三种动画:帧动画、补间动画和属性动画。包括它们的使用场景、实现方式及具体示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android 里有3种动画,帧动画,补间动画,属性动画。

  • View Animation: 视图动画在古老的Android版本系统中就已经提供了,只能被用来设置View的动画。

  • Drawable Animation: 这种动画(也叫Frame动画、帧动画)其实可以划分到视图动画的类别,专门用来一个一个的显示Drawable的resources,就像放幻灯片一样。

  • Property Animation: 属性动画只对Android 3.0(API 11)以上版本的Android系统才有效,这种动画可以设置给任何Object,包括那些还没有渲染到屏幕上的对象。这种动画是可扩展的,可以让你自定义任何类型和属性的动画。


一、帧动画            路径为 res/drawable

            帧动画使用的类是     AnimationDrawable

            帧动画实现的方式有2种

        一、1.在res/drawable文件夹新建animation-list 的xml文件frame_animation

              2.在文件中添加图片

<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false">

    <item android:drawable="@drawable/alipay_msp_success1"
        android:duration="100"/>
    <item android:drawable="@drawable/alipay_msp_success2"
        android:duration="100"/>
    <item android:drawable="@drawable/alipay_msp_success3"
        android:duration="100"/>
    <item android:drawable="@drawable/alipay_msp_success4"
        android:duration="100"/>
    <item android:drawable="@drawable/alipay_msp_success5"
        android:duration="100"/>
    <item android:drawable="@drawable/alipay_msp_success6"
        android:duration="100"/>
    <item android:drawable="@drawable/alipay_msp_success7"
        android:duration="100"/>
    <item android:drawable="@drawable/alipay_msp_success8"
        android:duration="100"/>
    <item android:drawable="@drawable/alipay_msp_success9"
        android:duration="100"/>
    <item android:drawable="@drawable/alipay_msp_success10"
        android:duration="100"/>
    <item android:drawable="@drawable/alipay_msp_success11"
        android:duration="100"/>
    <item android:drawable="@drawable/alipay_msp_success12"
        android:duration="100"/>
    <item android:drawable="@drawable/alipay_msp_success13"
        android:duration="100"/>
    <item android:drawable="@drawable/alipay_msp_success14"
        android:duration="100"/>
    <item android:drawable="@drawable/alipay_msp_success15"
        android:duration="100"/>
    <item android:drawable="@drawable/alipay_msp_success16"
        android:duration="100"/>
    <item android:drawable="@drawable/alipay_msp_success17"
        android:duration="100"/>
    <item android:drawable="@drawable/alipay_msp_success18"
        android:duration="100"/>
    <item android:drawable="@drawable/alipay_msp_success19"
        android:duration="100"/>
    <item android:drawable="@drawable/alipay_msp_success20"
        android:duration="100"/>
    <item android:drawable="@drawable/alipay_msp_success21"
        android:duration="100"/>
</animation-list>

根节点是animation-list(动画列表),里面有一个或者多个item节点组成,oneshot属性表示是否只播放一次,true表示只会播放一次,false表示一直循环播放,内部用item节点声明一个动画帧,android:drawable指定此帧动画所对应的图片资源,android:druation代表此帧持续的时间,整数,单位为毫秒。

    在activity中获取该动画

private void initView() {
    iv = (ImageView) findViewById(R.id.iv);
    //获取image view的背景
    AnimationDrawable background = (AnimationDrawable) iv.getBackground();
    background.start();
    //
    iv.setBackgroundResource(R.drawable.frame_animation);
    AnimationDrawable background1 = (AnimationDrawable) iv.getBackground();

    //
    AnimationDrawable animationDrawable = (AnimationDrawable) getResources().getDrawable(
            R.drawable.frame_animation);
    iv.setBackground(animationDrawable);
}

    二、直接在activity中使用帧动画

@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
private void frameAnimation(){
   AnimationDrawable animationDrawable = new AnimationDrawable();
    // 为AnimationDrawable添加动画帧  
    animationDrawable.addFrame(
            getResources().getDrawable(R.drawable.alipay_msp_success1), 50);
    animationDrawable.addFrame(
            getResources().getDrawable(R.drawable.alipay_msp_success2), 50);
    animationDrawable.addFrame(
            getResources().getDrawable(R.drawable.alipay_msp_success3), 50);
    animationDrawable.addFrame(
            getResources().getDrawable(R.drawable.alipay_msp_success4), 50);
    
    // 设置为循环播放  
    animationDrawable.setOneShot(false);
    iv.setBackground(animationDrawable);
    animationDrawable.start();
}
    

二、补间动画    Tween动画    ObjectAnimation     路径为res/anim 文件夹下      只能给view用

    补间动画的分类 四种                                   

alpha:    透明度动画效果        AlphaAnimation

scale:    缩放动画效果            ScaleAnimation

translate:  位置移动动画效果        TranslateAnimation

rotate:    旋转动画效果           RotateAnimation

这四种动画能够分别带来不同的效果体验,又能混合在一起完成酷炫的动画效果。

如何使用 

    和帧动画一样分两种方式 


    一、在xml中定义

                1.在 res/anim的文件夹里创建动画效果.xml文件

                    2.定义各种动画的xml文件

                  3.在java代码中获取动画通过 AnimationUtils.loadAnimation()方法
        Animation animation = AnimationUtils.loadAnimation(MainActivity.this,R.anim.rotate);  
        然后通过view.startAnimation()方法执行

    二、在java代码中直接使用

   
//平移动画
TranslateAnimation translateAnimation = new TranslateAnimation(
        0, 500, 0, 500);
translateAnimation.setDuration(2000);
iv.startAnimation(translateAnimation);

//淡入淡出动画
AlphaAnimation alphaAnimation=new AlphaAnimation(0,1);
alphaAnimation.setDuration(2000);
iv.startAnimation(alphaAnimation);

//旋转动画
RotateAnimation rotateAnimation=new RotateAnimation(0,90);
rotateAnimation.setDuration(2000);
iv.startAnimation(rotateAnimation);

//缩放动画
ScaleAnimation scaleanimation =new ScaleAnimation(1f,2.0f,1f,2.0f);
scaleanimation.setDuration(2000);
iv.startAnimation(scaleanimation);


在上面我们提到四种Tween动画都有其独有的属性又有其从Animation类继承的公共的属性,我们对这四种动画的讨论也将从两方面:一方面是独有的属性,另一方面是从Animation类继承的属性,从Animation这个类继承的属性用法都一样,

公共属性

android:duration="3000" // 动画持续时间(ms),必须设置,动画才有效果 
 android:startOffset ="1000" // 动画延迟开始时间(ms) 
 android:fillBefore = “true// 动画播放完后,视图是否会停留在动画开始的状态,默认为true
android:fillAfter = “false// 动画播放完后,视图是否会停留在动画结束的状态,优先于fillBefore值,默认为false android:fillEnabled= “true// 是否应用fillBefore值,对fillAfter值无影响,默认为true
android:repeatMode= “restart” // 选择重复播放动画模式,restart代表正序重放,reverse代表倒序回放,默认为restart| android:repeatCount = “0// 重放次数(所以动画的播放次数=重放次数+1),为infinite时无限重复 
 android:interpolator = @[package:]anim/interpolator_resource // 插值器,即影响动画的播放速度,

1 、Alpha动画(渐变透明度动画)
 
Alpha的特有属性
android:fromAlpha:动画开始时的透明度,变化范围为0.0-1.0,0.0表示完全透明,1.0表示完全不透明
android:toAlpha:动画结束是的透明度,变化范围和意义同上。

2 平移动画translate         

平移动画特有属性
android:fromXDelta:起始点X轴坐标,可以是数值、百分数、百分数p 三种样式,
android:fromYDelta:起始点Y坐标,可以是数值、百分数、百分数p三种样式。
android:toXDelta:结束点X坐标
android:toYDelta:结束点Y坐标

3 scale缩放动画
  独有属性
android:fromXScale起始的X方向上相对自身的缩放比例,类型float,比如1.0代表自身无变化,0.5代表起始时缩小一倍,2.0代表放大一倍
android:toXScale:结尾的X方向上相对自身的缩放比例,类型float
android:fromYScale:起始的Y方向上相对自身的缩放比例,类型float
android:toYScale:结尾的Y方向上相对自身的缩放比例,类型float
android:pivotX: 缩放起点X轴坐标,可以是数值、百分数、百分数p
android:pivotY:缩放起点Y轴坐标,取值及意义与pivotX一样

4、roate动画,旋转动画 

独有属性
android:fromDegrees:动画开始时旋转的角度位置,float类型,正值代表顺时针方向度数,负值代码逆时针方向度数
android:toDegrees: 动画结束时旋转到的角度位置,float类型,正值代表顺时针方向度数,负值代码逆时针方向度数
android:pivotX:旋转点X轴坐标,float类型,可以是数值、百分数、百分数p三种样式,比如50、50%、50%p,当为数值时,表示在当前View的左上角,即原点处加上50px,做为旋转点X坐标,如果是50%;表示在当前控件的左上角加上自己宽度的50%做为旋转点X坐标;如果是50%p,那么就是表示在当前控件的左上角加上父控件宽度的50%做为旋转点X坐标。
android:pivotY:旋转点Y轴坐标,取值及意义跟android:pivotX一样。

5.set集合

    就是把以上几种动画放到一起

也是可以通过xml 或者java代码形式实现

xml形式

<set xmlns:android="http://schemas.android.com/apk/res/android">

    <alpha
        android:duration="2000"
        android:fromAlpha="0"
        android:toAlpha="1">

    </alpha>
    <rotate
        xmlns:android ="http://schemas.android.com/apk/res/android"
        android:fromDegrees="0"
        android:toDegrees="360"
        android:pivotX="50%"
        android:pivotY="50%"
        android:duration="5000">
    </rotate>
    
    <translate
        xmlns:android ="http://schemas.android.com/apk/res/android"
        android:fromXDelta="0"
        android:fromYDelta="0"
        android:toXDelta="200"
        android:toYDelta="300"
        android:duration="5000">
    </translate>

</set>
Animation animation4= AnimationUtils.loadAnimation(this, R.anim.set);
iv.startAnimation(animation4);

java代码形式

//组合动画
AnimationSet setAnimation = new AnimationSet(true);
// 步骤1:创建组合动画对象(设置为true)

// 步骤2:设置组合动画的属性
// 特别说明以下情况
// 因为在下面的旋转动画设置了无限循环(RepeatCount = INFINITE)
// 所以动画不会结束,而是无限循环
// 所以组合动画的下面两行设置是无效的
setAnimation.setRepeatMode(Animation.RESTART);
setAnimation.setRepeatCount(1);// 设置了循环一次,但无效

setAnimation.addAnimation(alphaAnimation);
setAnimation.addAnimation(scaleanimation);
setAnimation.addAnimation(rotateAnimation);
setAnimation.addAnimation(translateAnimation);

iv.startAnimation(setAnimation);


属性动画,下章再讲

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值