动画资源

来源:互联网 发布:鬼吹灯故事解析 知乎 编辑:程序博客网 时间:2024/06/08 01:05
一、分类:
(一)、概要:
        3.0以前,android支持两种动画模式,补间动画(tween animation),帧动画(frame animation),在android3.0中又引入了一个新的动画系统:属性动画(property animation)。
        这三种动画模式在SDK中被称为view animation,drawable animation,property animation

    (二)、动画资源分类:
    1. 属性动画:Property Animation
    2. 帧动画:Frame Animation (Drawable Animation)
    3. 补间动画:Tween Animation (View Animation)
      • 透明度补间动画
      • 缩放补间动画
      • 旋转补间动画
      • 移动补间动画
       
    •  Alpha:渐变透明度动画效果 
    •  Scale:渐变尺寸伸缩动画效果 
    •  Translate:画面转换位置移动动画效果 
    •  Rotate:画面转换位置移动动画效果
    二、补间动画:
            Tween Animation就是一系列View形状的变换,如大小的缩放、透明度的改变、水平位置的改变、旋转位置改变,动画的定义既可以用java代码定义也可以用XML定义。建议用XML定义。
            用XML定义的动画放在/res/anim/文件夹内,XML文件的根元素为<set> , 二级节点可为<alpha>,<scale>,<translate>,<rotate>。

    (一)、Tween Animation共同的属性:
    1、duration[long] 属性为动画持续时间 时间以毫秒为单位
    2、fillAfter [boolean] 当设置为true ,该动画转化在动画结束后被应用
    3、fillBefore[boolean] 当设置为true ,该动画转化在动画开始前被应用
    4、interpolator   指定一个动画的插入器 有一些常见的插入器 
    • accelerate_decelerate_interpolator    加速-减速 动画插入器 
    • accelerate_interpolator   加速-动画插入器 
    • decelerate_interpolator   减速- 动画插入器 
    其他的属于特定的动画效果
    5、repeatCount[int] 动画的重复次数
    6、repeatMode[String] 定义重复的行为
    • "restart" 、"reverse"   
    • eg: android:repeatMode="reverse"
    7、startOffset[long] 动画之间的时间间隔,从上次动画停多少时间开始执行下个动画
    8、zAdjustment[int] 定义动画的Z Order的改变 0:保持Z Order不变
    1:保持在最上层
    -1:保持在最下层

    (二)、用xml资源实现补间动画:
    <alpha
    android:fromAlpha=”0.0″
    android:toAlpha=”1.0″
    android:duration=”3000″ />

    【说明:】
    1.fromAlpha:属性为动画起始时透明度
    • 0.0表示完全透明
    • 1.0表示完全不透明
    • 以上值取0.0-1.0之间的float数据类型的数字
    2.toAlpha:属性为动画结束时透明度


    <scale
    android:interpolator= "@android:anim/accelerate_decelerate_interpolator"
    android:fromXScale=”0.0″
    android:toXScale=”1.4″
    android:fromYScale=”0.0″
    android:toYScale=”1.4″
    android:pivotX=”50%”
    android:pivotY=”50%”
    android:fillAfter=”false”
    android:startOffset=“700”
    android:duration=”700″
    android:repeatCount=”10″ />
    【说明:】
    1.fromXScale[float] 
    2.fromYScale[float] 为动画起始时,X、Y坐标上的伸缩尺寸 
    • 0.0表示收缩到没有
    • 1.0表示正常无伸缩
    • 值小于1.0表示收缩
    • 值大于1.0表示放大
    3.toXScale [float] 为动画结束时,X坐标上的伸缩尺寸
    4.toYScale[float] 为动画结束时,Y坐标上的伸缩尺寸
    5.pivotX[float]  
    6.pivotY[float] 为动画相对于物件的X、Y坐标的开始位置 
    属性值说明:从0%-100%中取值,50%为物件的X或Y方向坐标上的中点位置

    <translate
    android:fromXDelta=”30″
    android:toXDelta=”-80″
    android:fromYDelta=”30″
    android:toYDelta=”300″
    android:duration=”2000″ />
    【说明:】
    1.fromXDelta
    2.toXDelta 为动画结束起始时 X坐标上的位置 
    3.fromYDelta
    4.toYDelta 为动画结束起始时 Y坐标上的位置

    <rotate
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:fromDegrees=”0″
    android:toDegrees=”+350″
    android:pivotX=”50%”
    android:pivotY=”50%”
    android:duration=”3000″ />
    【说明:】
    1.fromDegrees 为动画起始时物件的角度 
    说明:当角度为负数——表示逆时针旋转
    当角度为正数——表示顺时针旋转
    (负数from——to正数:顺时针旋转)
    (负数from——to负数:逆时针旋转)
    (正数from——to正数:顺时针旋转)
    (正数from——to负数:逆时针旋转)
    2.toDegrees 属性为动画结束时物件旋转的角度 可以大于360度
    3.pivotX
    4.pivotY 为动画相对于物件的X、Y坐标的开始位 
    说明:以上两个属性值 从0%-100%中取值,50%为物件的X或Y方向坐标上的中点位置 


    (三)、用java代码实现补间动画:

    publicclass MainActivity extends Activity {
    private ImageView imageView_main;
    private Animation animation = null;


    @Override
    protectedvoid onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    imageView_main = (ImageView) findViewById(R.id.imageView_main);
    }


    publicvoid clickButton(View view) {
    switch (view.getId()) {
    case R.id.button_main_alpha:
    animation = new AlphaAnimation(0.0f, 1.0f);
    break;
    case R.id.button_main_scale:
    animation = new ScaleAnimation(0.0f, 1.0f, 0.0f, 1.0f,
    Animation.RELATIVE_TO_SELF, 0.5f,
    Animation.RELATIVE_TO_SELF, 1.0f);
    break;
    case R.id.button_main_translate:
    animation = new TranslateAnimation(0, 150, 0, 0);
    break;
    case R.id.button_main_rotate:
    animation = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF,
    0.5f, Animation.RELATIVE_TO_SELF, 1.0f);
    break;
    default:
    break;
    }
    animation.setDuration(3000);
    imageView_main.setAnimation(animation);
    }
    }


    【注释】:
        AccelerateDecelerateInterpolator   在动画开始与介绍的地方速率改变比较慢,在中间的时候加速
        AccelerateInterpolator                     在动画开始的地方速率改变比较慢,然后开始加速
        AnticipateInterpolator                      开始的时候向后然后向前甩
        AnticipateOvershootInterpolator     开始的时候向后然后向前甩一定值后返回最后的值
        BounceInterpolator                          动画结束的时候弹起
        CycleInterpolator                             动画循环播放特定的次数,速率改变沿着正弦曲线
        DecelerateInterpolator                    在动画开始的地方快然后慢
        LinearInterpolator                            以常量速率改变
        OvershootInterpolator                      向前甩一定值后再回到原来位置

    参考:
    http://blog.csdn.net/harvic880925/article/details/40049763
    http://download.csdn.net/detail/harvic880925/8038491

    三、帧动画:
            Frame AnimationAnimationDrawable对象):帧动画,就像GIF图片,通过一系列Drawable依次显示来模拟动画的效果。
            必须以<animation-list>为根元素,以<item>表示要轮换显示的图片,duration属性表示各项显示的时间。XML文件要放在/res/anim/或者/res/animator目录下。
    (一)、实例代码:
    一、res/anim/frame_animation.xml的代码:


    <animation-listxmlns:android="http://schemas.android.com/apk/res/android"

    android:oneshot="true">

    <itemandroid:drawable="@drawable/anim1"android:duration="50"/>

    <itemandroid:drawable="@drawable/anim2"android:duration="50"/>

    <itemandroid:drawable="@drawable/anim3"android:duration="50"/>

    <itemandroid:drawable="@drawable/anim4"android:duration="50"/>

    <itemandroid:drawable="@drawable/anim5"android:duration="50"/>

    <itemandroid:drawable="@drawable/anim6"android:duration="50"/>

    <itemandroid:drawable="@drawable/anim7"android:duration="50"/>

    <itemandroid:drawable="@drawable/anim8"android:duration="50"/>

    <itemandroid:drawable="@drawable/anim9"android:duration="50"/>

    <itemandroid:drawable="@drawable/anim10"android:duration="50"/>

    <itemandroid:drawable="@drawable/anim11"android:duration="50"/>

    <itemandroid:drawable="@drawable/anim12"android:duration="50"/>

    </animation-list>


    【备注:】
    drawable 当前帧引用的drawable资源
    duration 当前帧显示的时间(毫秒为单位)
    oneshot 如果为true,表示动画只播放一次停止在最后一帧上,如果设置为false表示动画循环播放。


    二、MainActivity.java代码:


    public class MainActivity extends Activity {

    private ImageView imageView_main_show;

    private AnimationDrawable animationDrawable = null;


    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);


    imageView_main_show = (ImageView) findViewById(R.id.imageView_main_show);

    imageView_main_show.setBackgroundResource(R.anim.frame_animation);

    animationDrawable = (AnimationDrawable) imageView_main_show.getBackground();

    }


    public void clickButton(View view) {

    switch (view.getId()) {

    case R.id.button_main_start:

    if (!animationDrawable.isRunning()) {

                                    //一组动画是否只播放一次

    animationDrawable.setOneShot(false);

    animationDrawable.start();

    }

    break;

    case R.id.button_main_stop:

    if (animationDrawable.isRunning()) {

    animationDrawable.stop();

    }

    break;

    }

    }


    @Override

    public void onWindowFocusChanged(boolean hasFocus) {

    super.onWindowFocusChanged(hasFocus);

    if (!animationDrawable.isRunning()) {

    animationDrawable.setOneShot(false);

    animationDrawable.start();

    }

    }

    }



    【备注:】
            SDK中提到,不要在onCreate()中调用start(),因为AnimationDrawable还没有完全跟Window相关联,如果想要界面显示时就开始动画的话,可以在onWindowFoucsChanged()中调用start()。


    四、属性动画:
    (一)、概念:
            属性动画,这个是在Android 3.0中才引进的。Property Animation故名思议就是通过动画的方式改变对象的属性.属性动画更改的是对象的实际属性,在View Animation(Tween Animation)中,其改变的是View的绘制效果,真正的View的属性保持不变。可以将属性动画理解为增强版的补间动画
            比如无论如何缩放Button的大小,Button的有效点击区域还是没有应用动画时的区域,其位置与大小都不变。而在Property Animation中,改变的是对象的实际属性,如Button的缩放,Button的位置与大小属性值都改变了。
            Property Animation不止可以应用于View,还可以应用于任何对象。Property Animation只是表示一个值在一段时间内的改变,当值改变时要做什么事情完全是你自己决定的。

    (二)、常用属性:
    1. Duration动画的持续时间,默认300ms。android:duration属性
    2. Time interpolation:时间插值。LinearInterpolator、AccelerateDecelerateInterpolator,定义动画的变化率。android:interpolator属性
    3. Repeat count and behavior:重复次数、以及重复模式;可以定义重复多少次;重复时从头开始,还是反向。android:repeatCount属性
    4. Animator sets: 动画集合,你可以定义一组动画,一起执行或者顺序执行。<set/>,该元素的android:ordering属性指定该组动画是按次序播放还是同时播放。
    5. Frame refresh delay:帧刷新延迟(帧刷新频率,每个多久播放一帧);默认为10ms,但最终依赖系统的当前状态。
    (三)、属性动画API:相关的类
    1. ObjectAnimator 动画的执行类(是ValueAnimator的子类,使用简单常用。少数场景下,由于其存在一些限制,再考虑使用ValueAnimator)
    2. ValueAnimator 动画的执行类
    3. AnimatorSet 用于控制一组动画的执行:线性,一起,每个动画的先后执行等。
    4. AnimatorInflater 用户加载属性动画的xml文件
    5. TypeEvaluator 类型估值,主要用于设置动画操作属性的值。
    6. TimeInterpolator 时间插值
    • 总的来说,属性动画就是,动画的执行类来设置动画操作的对象的属性、持续时间,开始和结束的属性值,时间差值等,然后系统会根据设置的参数动态的变化对象的属性。

    (一)、实例代码:
    一、res/anim/property_anim.xml的代码:

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

        android:ordering="sequentially">

    <objectAnimator

            android:duration="4000"

            android:propertyName="x"

            android:valueTo="300"

            android:valueType="intType"/>

    <objectAnimator

            android:duration="4000"

            android:propertyName="y"

            android:valueTo="400"

            android:valueType="intType"/>

        

    <objectAnimator

            android:duration="4000"

            android:propertyName="x"

            android:valueTo="0"

            android:valueType="intType"/>

    <objectAnimator

            android:duration="4000"

            android:propertyName="y"

            android:valueTo="0"

            android:valueType="intType"/>

    </set>




    二、MainActivity.java代码:



    publicclass MainActivity extends Activity {

    private ImageView imageView_main_obj;

    private Move move;


    @Override

    publicvoid onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    imageView_main_obj = (ImageView) findViewById(R.id.imageView_main_obj);

    move = new Move();


    imageView_main_obj.setOnClickListener(new OnClickListener() {

    @Override

    publicvoid onClick(View v) {

    setTitle(move.getX() + ":" + move.getY());

    }

    });

    }


    class Move {

    privateinty;

    privateintx;


    publicint getY() {

    returny;

    }


    publicvoid setY(int y) {

    this.y = y;

    imageView_main_obj.layout(imageView_main_obj.getLeft(), y,

    imageView_main_obj.getRight(),

    y + imageView_main_obj.getMeasuredHeight());

    }


    publicint getX() {

    returnx;

    }


    publicvoid setX(int x) {

    this.x = x;

    imageView_main_obj.layout(x, imageView_main_obj.getTop(), x

    imageView_main_obj.getMeasuredWidth(),

    imageView_main_obj.getBottom());

    }

    }


    publicvoid clickButton(View view) {

    // 装载属性动画资源

    AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(this,

    R.animator.property_anim);

    // 设置要控制的对象

    set.setTarget(move);

    // 开始动画

    set.start();

    }

    }


    【备注说明:】

    <objectAnimator

            android:duration="4000"

            android:propertyName="x"

            android:valueTo="300"

            android:valueType="intType"/>


    【备注:】
    • android:ordering说明一系列动画动作的执行顺序,有两个选择: sequentially 和together,顺序执行还是一起执行; 
    • objectAnimator 是设定动画实施的对象;
    • duration是该动画动作执行从开始到结束所用的时间;
    • android:repeatCount="infinite"   可以是整数或者infinite
    • android:repeatMode="restart"    可以是restart 或者 reverse
    • android:valueFrom=" "     整数|浮点数|颜色


    二、scale标签

    下面先看看Scale标签应用插值器后,都会变成什么样。

    先看下XML代码:(从控件中心点,从0放大到1.4倍,保持结束时的状态)

    <?xml version="1.0" encoding="utf-8"?><scale xmlns:android="http://schemas.android.com/apk/res/android"    android:interpolator="@android:anim/accelerate_decelerate_interpolator"    android:fromXScale="0.0"    android:toXScale="1.4"    android:fromYScale="0.0"    android:toYScale="1.4"    android:pivotX="50%"    android:pivotY="50%"    android:duration="700"     android:fillAfter="true"/>
    下面一个个看看,每个xml值对应的scale动画是怎样的。


                       AccelerateInterpolator                                                 DecelerateInterpolator                    

    在动画开始的地方速率改变比较慢,然后开始加速                   在动画开始的地方快然后慢

         

                AnticipateInterpolator                                            AnticipateOvershootInterpolator 

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

       

                 BounceInterpolator                                                      CycleInterpolator       

                动画结束的时候弹起                             动画循环播放特定的次数,速率改变沿着正弦曲线

       

                            LinearInterpolator                                  OvershootInterpolator  

                          以常量速率改变                                向前甩一定值后再回到原来位置

       

    三、rotate标签

    下面先看看rotate标签应用插值器后,都会变成什么样。

    先看下XML代码:(从控件中心点,从0放大到1.4倍,保持结束时的状态)

    [html]view plaincopy在CODE上查看代码片派生到我的代码片
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <rotate xmlns:android="http://schemas.android.com/apk/res/android"  
    3.     android:interpolator="@android:anim/accelerate_decelerate_interpolator"  
    4.     android:fromDegrees="0"  
    5.     android:toDegrees="360"  
    6.     android:pivotX="50%"  
    7.     android:pivotY="50%"  
    8.     android:duration="700"   
    9.     android:fillAfter="true"  
    10. />  
    AccelerateDecelerateInterpolator   在动画开始与介绍的地方速率改变比较慢,在中间的时候加速


                       AccelerateInterpolator                                                 DecelerateInterpolator                    

    在动画开始的地方速率改变比较慢,然后开始加速                   在动画开始的地方快然后慢

          

                AnticipateInterpolator                                            AnticipateOvershootInterpolator 

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

       

                 BounceInterpolator                                                      CycleInterpolator       

                动画结束的时候弹起                             动画循环播放特定的次数,速率改变沿着正弦曲线

       

                            LinearInterpolator                                  OvershootInterpolator  

                          以常量速率改变                                向前甩一定值后再回到原来位置

       

    四、alpha标签

    下面先看看alpha标签应用插值器后,都会变成什么样。

    将透明度从0变成1.0,使用不同的插值器看看有什么不同(因为只是透明度的变化,所以基本看不出来有什么不同)
    [html]view plaincopy在CODE上查看代码片派生到我的代码片
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <alpha xmlns:android="http://schemas.android.com/apk/res/android"  
    3.     android:interpolator="@android:anim/accelerate_decelerate_interpolator"  
    4.     android:fromAlpha="0.0"  
    5.     android:toAlpha="1.0"  
    6.     android:duration="3000"   
    7.     android:fillAfter="true"  
    8. />  
    AccelerateDecelerateInterpolator   在动画开始与介绍的地方速率改变比较慢,在中间的时候加速

                       AccelerateInterpolator                                                 DecelerateInterpolator                    

    在动画开始的地方速率改变比较慢,然后开始加速                   在动画开始的地方快然后慢

       

                AnticipateInterpolator                                            AnticipateOvershootInterpolator 

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

       

                 BounceInterpolator                                                      CycleInterpolator       

                动画结束的时候弹起                             动画循环播放特定的次数,速率改变沿着正弦曲线

       

                            LinearInterpolator                                   OvershootInterpolator  

                          以常量速率改变                                 向前甩一定值后再回到原来位置

       

    五、translate标签

    下面先看看translate标签应用插值器后,都会变成什么样。

    把控件从(0,0)平移到(-200,-200)的位置,保持结束时状态不变,使用不同插值器。
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <translate xmlns:android="http://schemas.android.com/apk/res/android"  
    3.     android:interpolator="@android:anim/accelerate_decelerate_interpolator"  
    4.     android:fromXDelta="0"     
    5.     android:toXDelta="-200"    
    6.     android:fromYDelta="0"    
    7.     android:toYDelta="-200"    
    8.     android:duration="2000"    
    9.     android:fillAfter="true"  
    10. />  

         AccelerateDecelerateInterpolator   在动画开始与介绍的地方速率改变比较慢,在中间的时候加速

         AccelerateInterpolator                                                 DecelerateInterpolator                    

         在动画开始的地方速率改变比较慢,然后开始加速                   在动画开始的地方快然后慢

         AnticipateInterpolator                                            AnticipateOvershootInterpolator 

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

        BounceInterpolator                                                      CycleInterpolator      
        动画结束的时候弹起                             动画循环播放特定的次数,速率改变沿着正弦曲线
        LinearInterpolator                                  OvershootInterpolator  

         以常量速率改变                                向前甩一定值后再回到原来位置





    知行办公,专业移动办公平台

    https://zx.naton.cn/

    原创团队:

    【总监】十二春秋之,3483099@qq.com;
    【Master】zelo,616701261@qq.com;【运营】运维艄公,897221533@qq.com;
    【产品设计】流浪猫,364994559@qq.com;【体验设计】兜兜,2435632247@qq.com;
    【iOS】淘码小工,492395860@qq.com;iMcG33K,imcg33k@gmail.com;
    【Android】人猿居士,1059604515@qq.com;思路的顿悟,1217022114@qq.com;
    【java】首席工程师MR_W,feixue300@qq.com;【测试】土镜问道,847071279@qq.com;
    【数据】喜乐多,42151960@qq.com;【安全】保密,你懂的。




    原创粉丝点击