Android动画总结

作者: 奔跑吧李博 | 来源:发表于2018-02-27 21:48 被阅读226次

    动画应该是很基础的东西了,但是由于自己的记性不太好,总是记不住那些参数和方法,只是知道怎么用而已。所以每次用的时候都去百度或者Google。属性动画的属性确实有点多,这次终于鼓足了勇气作一个总结,让动画的种种用法彻底地记在脑子里面。

    动画分类:

    动画分为帧动画(Frame Animation)、补间动画(Tweened Animation)和属性动画。

    帧动画

    帧动画就像放电影一样,连续播放一张张的图片形成动画。

    1. 在drawable文件夹下创建一个animlist.xml文件,内容如下:
    <?xml version="1.0" encoding="utf-8"?>
    <animation-list xmlns:android="http://schemas.android.com/apk/res/android"
        android:oneshot="false">
        <item android:drawable="@mipmap/mike_volume_part1" android:duration="150"></item>
        <item android:drawable="@mipmap/mike_volume_part2" android:duration="150"></item>
        <item android:drawable="@mipmap/mike_volume_part3" android:duration="150"></item>
        <item android:drawable="@mipmap/mike_volume_part4" android:duration="150"></item>
    </animation-list>
    

    动画的每一帧150毫秒,一共4帧。oneshot表示是否重复播放。

    1. 播放帧动画
            ivFrame.setImageResource(R.drawable.animlist);
            AnimationDrawable drawable = (AnimationDrawable) ivFrame.getDrawable();
            drawable.start();  //开始
            //drawable.stop();  //结束
    

    演示效果:


    giphy (1).gif

    补间动画

    XML配置中属性名:

    alpha 透明度动画
    scale 缩放动画
    translate 移动动画
    rotate 旋转动画

    代码中动画类名:

    AlphaAnimation 透明度动画
    ScaleAnimation 缩放动画
    TranslateAnimation 移动动画
    RotateAnimation 旋转动画

    Alpha属性值说明

    fromAlpha 起始时透明度,范围0-1
    toAlpha 结束时透明度,范围0-1

    Scale属性值说明

    fromXScale 起始时X轴上的缩放比例
    toXScale 结束时X轴上的缩放比例
    fromYScale 起始时Y轴上的缩放比例
    toYScale 结束时Y轴上的缩放比例
    pivotX 缩放中心点X坐标位置
    pivotY 缩放中心点Y坐标位置

    Translate属性值说明

    fromXDelta 起始时动画在X坐标的位置
    toXDelta 结束时动画在X坐标的位置
    fromYDelta 起始时动画在Y坐标的位置
    toYDelta 结束时动画在Y坐标的位置

    Rotate属性值说明

    fromDegrees 起始时控件角度
    toDegrees 结束时控件角度
    pivotX 旋转中心点X坐标位置

    pivotY 旋转中心点Y坐标位置

    属性:

    fillAfter 为ture时,该动画结束后保持结束时的状态
    interpolator 设置动画插值器
    duration 设置动画持续时间
    startOffset 动画在几秒开始执行

    将以上各个动画类型办个组合来举个栗子:

    在anim文件夹下创建了animset.xml文件,内容如下:

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android">
        <alpha android:fromAlpha="0" android:toAlpha="1" android:duration="2000"/>
    
        <rotate android:fromDegrees="0" android:toDegrees="720" android:pivotX="50%" android:pivotY="50%" android:duration="2000"/>
    
        <scale android:fromXScale="1" android:toXScale="2" android:fromYScale="1" android:toYScale="2"
            android:pivotY="50%" android:pivotX="50%" android:duration="2000"/>
    
        <translate android:fromXDelta="0" android:toXDelta="300" android:fromYDelta="0" android:toYDelta="300" android:duration="2000"/>
    </set>
    

    加载该动画方式:

            Animation animation = AnimationUtils.loadAnimation(getApplicationContext(),R.anim.animset);
            animation.setFillAfter(true);
            ivTween.startAnimation(animation);
    

    演示效果:


    giphy (2).gif

    属性动画:ObjectAnimator用法

    调用方法:
    public static ObjectAnimator ofFloat(Object target, String propertyName, float... values)

    • 第一个参数用于指定这个动画要操作的是哪个控件
    • 第二个参数用于指定这个动画要操作这个控件的哪个属性
    • 第三个参数是可变长参数,这个就跟 ValueAnimator 中的可变长参数的意义一样了,用于设置属性的变化过程。

    任性一下,这么多字符串,我怎么知道有哪些属性啊?!如果写错了呢?

    1、透明度:alpha  
    public void setAlpha(float alpha)  
    
    2、旋转度数:rotation、rotationX、rotationY  
    public void setRotation(float rotation)  
    public void setRotationX(float rotationX)  
    public void setRotationY(float rotationY)  
    
    3、平移:translationX、translationY  
    public void setTranslationX(float translationX)   
    public void setTranslationY(float translationY)  
    
    4、缩放:scaleX、scaleY  
    public void setScaleX(float scaleX)  
    public void setScaleY(float scaleY)
    

    多个属性动画调用:

        private void valueAnim(){
            ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(ivTween,"alpha",0,1);
            objectAnimator.setDuration(2000);
            objectAnimator.start();
    
            ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(ivTween,"scaleX",1,2);
            objectAnimator1.setDuration(2000);
            objectAnimator1.start();
    
            ObjectAnimator objectAnimator2 = ObjectAnimator.ofFloat(ivTween,"scaleY",1,2);
            objectAnimator2.setDuration(2000);
            objectAnimator2.start();
    
            ObjectAnimator objectAnimator3 = ObjectAnimator.ofFloat(ivTween,"rotation",0,360);
            objectAnimator3.setDuration(2000);
            objectAnimator3.start();
        }
    

    演示效果:


    giphy (3).gif
    动画监听器:

    AnimatorListener,用于监听动画执行的过程。AnimatorUpdateListener,用于监听动画执行过程中的值变化。

            objectAnimator.addListener(new Animator.AnimatorListener() {
                @Override
                public void onAnimationStart(Animator animation) {
                    //动画开始时调用
                }
    
                @Override
                public void onAnimationEnd(Animator animation) {
                    //动画结束时调用
                }
    
                @Override
                public void onAnimationCancel(Animator animation) {
                    //动画取消时调用
                }
    
                @Override
                public void onAnimationRepeat(Animator animation) {
                    //动画重复执行时调用
                }
            });
    
            //动画执行过程中不断执行,可以获取得到当前动画执行的值
            objectAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
    
                }
            });
    

    github代码地址,demo简单,需要的可参考一下。

    相关文章

      网友评论

      • 15ecf25f298a:写一个复杂动画效果吧,综合运用的,给个链接
        奔跑吧李博:@持续进化的程序猿 好的,后面加上发给你

      本文标题:Android动画总结

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