Android 动画-[Android_YangKe]

作者: Android_YangKe | 来源:发表于2018-04-28 17:47 被阅读201次

    转载请注明 Android_YangKe,谢谢!

    动画是具体图形,物体运动轨迹的记录。Android 中动画共三类,分别为:

    • 帧动画(Frame Animation)
    • 补间动画(Tween Animation)
    • 属性动画(Property Animation)

    下面我们按照 帧动画 --> 补间动画 --> 属性动画 --> 依次熟悉。

    帧动画

    相信大家都见过 gif 图片,当我们使用工具预览此类图片时可以看出它由多张连续渐变图片组成。Android 帧动画大体上可以理解为一张张图片按一定顺序切换。下面我们看个简单例子:

    yangke.gif

    代码实现:

    <?xml version="1.0" encoding="utf-8"?>
    <!--main_loading.xml-->
    <animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false">
    <item android:drawable="@drawable/a01" android:duration="100" />
    <item android:drawable="@drawable/a02" android:duration="100" />
    ... 省略...
    <item android:drawable="@drawable/a08" android:duration="100" />
    <item android:drawable="@drawable/a09" android:duration="100" />
    </animation-list>
    
    //Java 代码引用
    AnimationDrawable animationDrawable = (AnimationDrawable) getResources().getDrawable(R.drawable.main_loading);
    view.setBackground(animationDrawable);
    animationDrawable.start();
    

    通过上面代码我们可以看出实现帧动画非常简单。首先通过 animation-list标签将多张有序的图片顺序摆放,其次通过AnimationDrawablestart函数执行,最后一个事先约定好的动画就呈现了。

    帧动画主要特点及应用场景是什么?可以实现不规则轨迹动画,作用的对象没有事件要求。一般在加载条场景中应用。

    使用注意事项:
    移动设备内存有限,图片是内存杀手,当我们在使用帧动画时,一定要控制图片质量,控制图片数量,谨慎编码,否则低内存设备有 OOM 风险。

    补间动画
    • 透明度渐变 View
    • 位置移动 View
    • 旋转 View
    • 拉伸 View

    补间动画是 Android 中很常用的一种动画,它可以针对 View 做简单的动画操作。由于此动画的操作都是基于 View 改变,所以相对帧动画而言此动画会更加节省系统资源。下面我们看几个常用的动画:

    渐变动画

    yangke.gif

    代码实现:

    <?xml version="1.0" encoding="utf-8"?>
    <!--ptr_alpha.xml-->
    <alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="3000"
    android:fillAfter="true"
    android:fromAlpha="1.0"
    android:toAlpha="0.1" />
    
    //Java 代码引用
    Animation anim = AnimationUtils.loadAnimation(context, R.anim.ptr_alpha); 
    view.startAnimation(anim);
    

    平移动画

    yangke.gif

    代码实现:

    <?xml version="1.0" encoding="utf-8"?>
    <!--ptr_slide_in_from_bottom.xml-->
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@android:integer/config_longAnimTime"
    android:fromYDelta="100%p"
    android:toYDelta="0" />
    
    //Java 代码中引用
    Animation bottomToTop = AnimationUtils.loadAnimation(context, R.anim.ptr_slide_in_from_bottom);
    view.startAnimation(bottomToTop);
    

    旋转动画

    yangke.gif

    代码实现:

    <?xml version="1.0" encoding="utf-8"?>
    <!--ptr_rotate.xml-->
    <rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000"
    android:fromDegrees="0"
    android:pivotX="50%"
    android:pivotY="50%"
    android:repeatCount="infinite"
    android:toDegrees="360" />
    
    //Java 代码中引用
    Animation bottomToTop = AnimationUtils.loadAnimation(this, R.anim.ptr_rotate);
    view.startAnimation(bottomToTop);
    

    拉伸动画

    yangke.gif

    代码实现:

    <?xml version="1.0" encoding="utf-8"?>
    <!--ptr_scale.xml-->
    <scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000"
    android:fromXScale="100%"
    android:fromYScale="100%"
    android:pivotY="50%"
    android:pivotX="50%"
    android:repeatCount="infinite"
    android:toXScale="150%"
    android:toYScale="150%" />
    
    //Java 代表调用
    Animation bottomToTop = AnimationUtils.loadAnimation(this, R.anim.ptr_scale);
    view.startAnimation(bottomToTop);
    

    补间动画的实现方式比较简单,三五行代码就可以实现一种效果。但细心的小伙伴可能已经发现此类动画只能作用于 View,也就是说 startAnimation 函数只有 View 才有,这是补间动画的局限性之一。此时我们对一个 View 设置平移动画,当 View 位置移动后,我们再次点击此 View 事件也是无法触发的。

    举个简单例子:
    屏幕 (x1, y1)点上有一个按钮,当我们点击此按钮时使用平移动画将按钮移动到(x10, y10)点,当动画结束后我们再次点击此按钮(x10,y10)点击事件是无法触发的(有兴趣的小伙伴写个 demo,代码比较简单这里就不贴出来了)。

    补间动画没有真正的修改 View 属性,只是改变了视觉效果而已。

    补间动画主要特点及应用场景是什么?可以直接作用于 View,使用简单,只是视觉上有动画现象,没有真正修改 View 属性。使用此动画的同时无法响应点击事件,相对帧动画而言比较节省系统资源。

    使用注意事项:
    点击事件无法与动画同时兼顾,无法实现复杂的动画效果。

    属性动画

    属性动画是 Android 3.0 后推出的 API,弥补了补间动画执行后其属性不变的问题,不再局限于 View,也不限定于只能实现移动、缩放、旋转和淡入淡出这几种动画操作。

    更强大的是上面我们所说的按钮点击事件问题在属性动画上进行了完善、升级,最终展示给用户的不仅仅是视觉上的改变,同时动画对象的属性也进行了设置。如果我们通过属性动画来移动一个按钮,那么这个按钮是真正意义上的移动了,因为动画执行完毕后其所有属性会重新赋值。

    下面我们看下属性动画中的两个 API

    • ValueAnimator
    • ObjectAnimator

    ValueAnimator
    ValueAnimator 是整个属性动画机制中很核心的一个类,其运行机制是通过不断地修改对象的值来实现动画。使用过程中我们只需要将初始值和结束值提供给ValueAnimator,并且告诉它动画所需运行的时长,那么ValueAnimator就会自动帮我们完成从初始值平滑地过渡到结束值这样的效果。除此之外ValueAnimator还负责管理动画的播放次数、播放模式、以及对动画设置监听器等。

    ObjectAnimator
    ObjectAnimator作为ValueAnimator的子类,也就是说ObjectAnimator具有ValueAnimator类几乎所有的函数和属性。同时其内部封装了很多实用的方法,便于研发人员快速实现动画效果。事实证明项目中我们使用ObjectAnimator的比重的确偏大。

    到这里相信你对帧动画、补间动画、属性动画的理论知识有了一定认识,同时也掌握了如何使用简单的动画。不要走开,属性动画下节继续。

    完~

    喜欢有帮助的话: 双击、评论、转发,动一动你的小手让更多的人知道!关注 Android_YangKe

    相关文章

      网友评论

      本文标题:Android 动画-[Android_YangKe]

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