美文网首页
android有三种动画类型

android有三种动画类型

作者: leonck | 来源:发表于2017-10-23 14:05 被阅读46次

    参考网上资料整理出来,随笔记录,仅当笔记

    帧动画(frame by frame animation)

    像幻灯片一样播放图片。

    <?xml version="1.0" encoding="utf-8"?>
    <animation-list xmlns:android="http://schemas.android.com/apk/res/android"
        android:oneshot="false">
        <item
            android:drawable="@drawable/autoreturn_tohome_01"
            android:duration="200"/>
        <item
            android:drawable="@drawable/autoreturn_tohome_02"
            android:duration="200"/>
        <item
            android:drawable="@drawable/autoreturn_tohome_03"
            android:duration="200"/>
    </animation-list>
    
    

    android:oneshot="false" 表示是否重复播放。
    开启动画

     frameAnim = view.leftIsUnLock.drawable as AnimationDrawable
     frameAnim?.start()
    
    间补动画(tweened animation)

    对view进行不断绘制,实现缩放(scale)、淡入淡出(alpha)、旋转(rotate)、平移(translate)4种操作。
    缩放:

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android" >
    
        <scale
            android:duration="1000"
            android:fillAfter="false"
            android:fromXScale="0.0"
            android:fromYScale="0.0"
            android:interpolator="@android:anim/accelerate_decelerate_interpolator"
            android:pivotX="50%"
            android:pivotY="50%"
            android:toXScale="1.4"
            android:toYScale="1.4" />
    
    </set><!--
         尺寸伸缩动画效果 scale
           属性:interpolator 指定一个动画的插入器
            在我试验过程中,使用android.res.anim中的资源时候发现
            有三种动画插入器:
                accelerate_decelerate_interpolator  加速-减速 动画插入器
                accelerate_interpolator        加速-动画插入器
                decelerate_interpolator        减速- 动画插入器
            其他的属于特定的动画效果
          浮点型值:
             
                fromXScale 属性为动画起始时 X坐标上的伸缩尺寸    
                toXScale   属性为动画结束时 X坐标上的伸缩尺寸     
            
                fromYScale 属性为动画起始时Y坐标上的伸缩尺寸    
                toYScale   属性为动画结束时Y坐标上的伸缩尺寸    
            
                说明:
                     以上四种属性值    
        
                        0.0表示收缩到没有 
                        1.0表示正常无伸缩     
                        值小于1.0表示收缩  
                        值大于1.0表示放大
            
                pivotX     属性为动画相对于物件的X坐标的开始位置
                pivotY     属性为动画相对于物件的Y坐标的开始位置
            
                说明:
                        以上两个属性值 从0%-100%中取值
                        50%为物件的X或Y方向坐标上的中点位置
            
            长整型值:
                duration  属性为动画持续时间
                说明:   时间以毫秒为单位
    
            布尔型值:
                fillAfter 属性 当设置为true ,该动画转化在动画结束后被应用
    
    -->
    

    淡入淡出:

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android" >
        <alpha
            android:duration="1000"
            android:fromAlpha="0.0"
            android:toAlpha="1.0" />
        <!--
         透明度控制动画效果 alpha
            浮点型值:
                fromAlpha 属性为动画起始时透明度
                toAlpha   属性为动画结束时透明度
                说明: 
                    0.0表示完全透明
                    1.0表示完全不透明
                以上值取0.0-1.0之间的float数据类型的数字
            
            长整型值:
                duration  属性为动画持续时间
                说明:     
                    时间以毫秒为单位
    
        -->
    </set>
    

    旋转:

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android" >
        <rotate
            android:duration="3000"
            android:fromDegrees="0"
            android:interpolator="@android:anim/accelerate_decelerate_interpolator"
            android:pivotX="50%"
            android:pivotY="50%"
            android:toDegrees="+350" />
        <!--
         rotate 旋转动画效果
           属性:interpolator 指定一个动画的插入器
                 在我试验过程中,使用android.res.anim中的资源时候发现
                 有三种动画插入器:
                    accelerate_decelerate_interpolator   加速-减速 动画插入器
                    accelerate_interpolator               加速-动画插入器
                    decelerate_interpolator               减速- 动画插入器
                 其他的属于特定的动画效果
                               
           浮点数型值:
                fromDegrees 属性为动画起始时物件的角度    
                toDegrees   属性为动画结束时物件旋转的角度 可以大于360度   
    
            
                说明:
                         当角度为负数——表示逆时针旋转
                         当角度为正数——表示顺时针旋转              
                         (负数from——to正数:顺时针旋转)   
                         (负数from——to负数:逆时针旋转) 
                         (正数from——to正数:顺时针旋转) 
                         (正数from——to负数:逆时针旋转)       
    
                pivotX     属性为动画相对于物件的X坐标的开始位置
                pivotY     属性为动画相对于物件的Y坐标的开始位置
                    
                说明:        以上两个属性值 从0%-100%中取值
                             50%为物件的X或Y方向坐标上的中点位置
    
            长整型值:
                duration  属性为动画持续时间
                说明:       时间以毫秒为单位
    
        -->
    
    </set>
    

    平移:

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android" >
    
        <translate
            android:duration="2000"
            android:fromXDelta="30"
            android:fromYDelta="30"
            android:toXDelta="-80"
            android:toYDelta="300" />
        <!--
         translate 位置转移动画效果
            整型值:
                fromXDelta 属性为动画起始时 X坐标上的位置    
                toXDelta   属性为动画结束时 X坐标上的位置
                fromYDelta 属性为动画起始时 Y坐标上的位置
                toYDelta   属性为动画结束时 Y坐标上的位置
                注意:
                         没有指定fromXType toXType fromYType toYType 时候,
                         默认是以自己为相对参照物             
            长整型值:
                duration  属性为动画持续时间
                说明:   时间以毫秒为单位
    
    
    
        -->
    
    </set>
    

    使用动画:

     myAnimation = AnimationUtils.loadAnimation(this, R.anim.alpha_anim);
     imgPic.startAnimation(myAnimation);
    

    在java 中实现动画

    private void ScaleAnimation() {
    ScaleAnimation(float fromX, float toX, float fromY, float toY,
               int pivotXType, float pivotXValue, int pivotYType, float pivotYValue) 
    //第一个参数fromX为动画起始时 X坐标上的伸缩尺寸    
    //第二个参数toX为动画结束时 X坐标上的伸缩尺寸     
    //第三个参数fromY为动画起始时Y坐标上的伸缩尺寸    
    //第四个参数toY为动画结束时Y坐标上的伸缩尺寸  
    /*说明:
                        以上四种属性值    
                        0.0表示收缩到没有 
                        1.0表示正常无伸缩     
                        值小于1.0表示收缩  
                        值大于1.0表示放大
    */
    //第五个参数pivotXType为动画在X轴相对于物件位置类型  
    //第六个参数pivotXValue为动画相对于物件的X坐标的开始位置
    //第七个参数pivotXType为动画在Y轴相对于物件位置类型   
    //第八个参数pivotYValue为动画相对于物件的Y坐标的开始位置
    myAnimation_Scale =new ScaleAnimation(0.0f, 1.4f, 0.0f, 1.4f,
                 Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
    
    属性动画(property animation)

    3.0之后引入,弥补了之前动画缺陷,几乎可以替代以上的动画。
    属性动画最重要的是ValueAnimation类

    属性动画的运行机制是通过不断地对值进行操作来实现的,而初始值和结束值之间的动画过渡就是由ValueAnimator这个类来负责计算的。它的内部使用一种时间循环的机制来计算值与值之间的动画过渡,我们只需要将初始值和结束值提供给ValueAnimator,并且告诉它动画所需运行的时长,那么ValueAnimator就会自动帮我们完成从初始值平滑地过渡到结束值这样的效果。除此之外,ValueAnimator还负责管理动画的播放次数、播放模式、以及对动画设置监听器等。

    最常用的是ObjectAnimator,它继承ValueAnimation类,使用ObjectAnimator 可以对任意对象的任意有get 和 set 方法的属性进行动画操作。
    如果我们想要将一个TextView在5秒中内从常规变换成全透明,再从全透明变换成常规,就可以这样写:

        ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f);  
        animator.setDuration(5000);  
        animator.start();  
    

    可以看到,我们还是调用了ofFloat()方法来去创建一个ObjectAnimator的实例,只不过ofFloat()方法当中接收的参数有点变化了。这里第一个参数要求传入一个object对象,我们想要对哪个对象进行动画操作就传入什么,这里我传入了一个textview。第二个参数是想要对该对象的哪个属性进行动画操作,由于我们想要改变TextView的不透明度,因此这里传入"alpha"。后面的参数就是不固定长度了,想要完成什么样的动画就传入什么值,这里传入的值就表示将TextView从常规变换成全透明,再从全透明变换成常规。之后调用setDuration()方法来设置动画的时长,然后调用start()方法启动动画。
    第二个参数可以传入那些值呢?ObjectAnimator内部的工作机制并不是直接对我们传入的属性名进行操作的,而是会去寻找这个属性名对应的get和set方法,所以传入的值一定要有set和get方法。
    例如上面传入的“alpha”,在view中一定有

        public void setAlpha(float value);  
        public float getAlpha();  
    
    • 属性动画组合
      实现组合动画功能主要需要借助AnimatorSet这个类,这个类提供了一个play()方法,如果我们向这个方法中传入一个Animator对象(ValueAnimator或ObjectAnimator)将会返回一个AnimatorSet.Builder的实例,AnimatorSet.Builder中包括以下四个方法:

      after(Animator anim) 将现有动画插入到传入的动画之后执行
      after(long delay) 将现有动画延迟指定毫秒后执行
      before(Animator anim) 将现有动画插入到传入的动画之前执行
      with(Animator anim) 将现有动画和传入的动画同时执行

    好的,有了这四个方法,我们就可以完成组合动画的逻辑了,那么比如说我们想要让TextView先从屏幕外移动进屏幕,然后开始旋转360度,旋转的同时进行淡入淡出操作,就可以这样写:

        ObjectAnimator moveIn = ObjectAnimator.ofFloat(textview, "translationX", -500f, 0f);  
        ObjectAnimator rotate = ObjectAnimator.ofFloat(textview, "rotation", 0f, 360f);  
        ObjectAnimator fadeInOut = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f);  
        AnimatorSet animSet = new AnimatorSet();  
        animSet.play(rotate).with(fadeInOut).after(moveIn);  
        animSet.setDuration(5000);  
        animSet.start();  
    

    可以看到,这里我们先是把三个动画的对象全部创建出来,然后new出一个AnimatorSet对象之后将这三个动画对象进行播放排序,让旋转和淡入淡出动画同时进行,并把它们插入到了平移动画的后面,最后是设置动画时长以及启动动画。

    • Animator监听器
      在很多时候,我们希望可以监听到动画的各种事件,比如动画何时开始,何时结束,然后在开始或者结束的时候去执行一些逻辑处理。这个功能是完全可以实现的,Animator类当中提供了一个addListener()方法,这个方法接收一个AnimatorListener,我们只需要去实现这个AnimatorListener就可以监听动画的各种事件了。

    大家已经知道,ObjectAnimator是继承自ValueAnimator的,而ValueAnimator又是继承自Animator的,因此不管是ValueAnimator还是ObjectAnimator都是可以使用addListener()这个方法的。另外AnimatorSet也是继承自Animator的,因此addListener()这个方法算是个通用的方法。
    添加一个监听器的代码如下所示:

        anim.addListener(new AnimatorListener() {  
            @Override  
            public void onAnimationStart(Animator animation) {  
            }  
          
            @Override  
            public void onAnimationRepeat(Animator animation) {  
            }  
          
            @Override  
            public void onAnimationEnd(Animator animation) {  
            }  
          
            @Override  
            public void onAnimationCancel(Animator animation) {  
            }  
        });  
    

    可以看到,我们需要实现接口中的四个方法,onAnimationStart()方法会在动画开始的时候调用,onAnimationRepeat()方法会在动画重复执行的时候调用,onAnimationEnd()方法会在动画结束的时候调用,onAnimationCancel()方法会在动画被取消的时候调用。
    但是也许很多时候我们并不想要监听那么多个事件,可能我只想要监听动画结束这一个事件,那么每次都要将四个接口全部实现一遍就显得非常繁琐。没关系,为此Android提供了一个适配器类,叫作AnimatorListenerAdapter,使用这个类就可以解决掉实现接口繁琐的问题了,如下所示:

        anim.addListener(new AnimatorListenerAdapter() {  
        });  
    

    这里我们向addListener()方法中传入这个适配器对象,由于AnimatorListenerAdapter中已经将每个接口都实现好了,所以这里不用实现任何一个方法也不会报错。那么如果我想监听动画结束这个事件,就只需要单独重写这一个方法就可以了,如下所示:

        anim.addListener(new AnimatorListenerAdapter() {  
            @Override  
            public void onAnimationEnd(Animator animation) {  
            }  
        });  
    
    • 使用XML编写动画
      我们可以使用代码来编写所有的动画功能,这也是最常用的一种做法。不过,过去的补间动画除了使用代码编写之外也是可以使用XML编写的,因此属性动画也提供了这一功能,即通过XML来完成和代码一样的属性动画功能。

    通过XML来编写动画可能会比通过代码来编写动画要慢一些,但是在重用方面将会变得非常轻松,比如某个将通用的动画编写到XML里面,我们就可以在各个界面当中轻松去重用它。

    如果想要使用XML来编写动画,首先要在res目录下面新建一个animator文件夹,所有属性动画的XML文件都应该存放在这个文件夹当中。然后在XML文件中我们一共可以使用如下三种标签:

    <animator>  对应代码中的ValueAnimator
    <objectAnimator>  对应代码中的ObjectAnimator
    <set>  对应代码中的AnimatorSet
    

    那么比如说我们想要实现一个从0到100平滑过渡的动画,在XML当中就可以这样写:

        <animator xmlns:android="http://schemas.android.com/apk/res/android"  
            android:valueFrom="0"  
            android:valueTo="100"  
            android:valueType="intType"/>  
    

    而如果我们想将一个视图的alpha属性从1变成0,就可以这样写:

        <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"  
            android:valueFrom="1"  
            android:valueTo="0"  
            android:valueType="floatType"  
            android:propertyName="alpha"/>  
    

    另外,我们也可以使用XML来完成复杂的组合动画操作,比如将一个视图先从屏幕外移动进屏幕,然后开始旋转360度,旋转的同时进行淡入淡出操作,就可以这样写:

        <set xmlns:android="http://schemas.android.com/apk/res/android"  
            android:ordering="sequentially" >  
          
            <objectAnimator  
                android:duration="2000"  
                android:propertyName="translationX"  
                android:valueFrom="-500"  
                android:valueTo="0"  
                android:valueType="floatType" >  
            </objectAnimator>  
          
            <set android:ordering="together" >  
                <objectAnimator  
                    android:duration="3000"  
                    android:propertyName="rotation"  
                    android:valueFrom="0"  
                    android:valueTo="360"  
                    android:valueType="floatType" >  
                </objectAnimator>  
          
                <set android:ordering="sequentially" >  
                    <objectAnimator  
                        android:duration="1500"  
                        android:propertyName="alpha"  
                        android:valueFrom="1"  
                        android:valueTo="0"  
                        android:valueType="floatType" >  
                    </objectAnimator>  
                    <objectAnimator  
                        android:duration="1500"  
                        android:propertyName="alpha"  
                        android:valueFrom="0"  
                        android:valueTo="1"  
                        android:valueType="floatType" >  
                    </objectAnimator>  
                </set>  
            </set>  
          
        </set>  
    

    最后XML文件是编写好了,那么我们如何在代码中把文件加载进来并将动画启动呢?只需调用如下代码即可:

        Animator animator = AnimatorInflater.loadAnimator(context, R.animator.anim_file);  
        animator.setTarget(view);  
        animator.start();  
    

    参考:http://blog.csdn.net/guolin_blog/article/details/43536355

    相关文章

      网友评论

          本文标题:android有三种动画类型

          本文链接:https://www.haomeiwen.com/subject/yjwruxtx.html