美文网首页
android动画详解

android动画详解

作者: 朝花夕拾不起来 | 来源:发表于2017-03-10 14:25 被阅读163次

    转载:http://blog.csdn.net/yanbober/article/details/46481171

    Android系统提供了很多丰富的API去实现UI的2D与3D动画,最主要的划分可以分为如下几类:

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

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

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

    View Animation(视图动画)使用详解

    视图动画,也叫Tween(补间)动画可以在一个视图容器内执行一系列简单变换(位置、大小、旋转、透明度)。譬如,如果你有一个TextView对象,您可以移动、旋转、缩放、透明度设置其文本,当然,如果它有一个背景图像,背景图像会随着文本变化。

    补间动画通过XML或Android代码定义,建议使用XML文件定义,因为它更具可读性、可重用性。

    如下是视图动画相关的类继承关系:透明度动画,旋转动画,尺寸动画,位移动画,动画集合

    Paste_Image.png
    java类名 xml关键字 描述信息
    AlphaAnimation <alpha> 放置在res/anim/目录下 渐变透明度动画效果
    RotateAnimation <rotate> 放置在res/anim/目录下 画面转移旋转动画效果
    ScaleAnimation <scale> 放置在res/anim/目录下 渐变尺寸伸缩动画效果
    TranslateAnimation <translate> 放置在res/anim/目录下 画面转换位置移动动画效果
    AnimationSet <set> 放置在res/anim/目录下 一个持有其它动画元素alpha、scale、translate、rotate或者其它set元素的容器

    视图动画详细说明

    Animation属性详解

    xml属性 java方法 解释
    android:detachWallpaper setDetachWallpaper(boolean) 是否在壁纸上运行
    android:duration setDuration(long) 动画持续时间,毫秒为单位
    android:fillAfter setFillAfter(boolean) 控件动画结束时是否保持动画最后的状态
    android:fillBefore setFillBefore(boolean) 控件动画结束时是否还原到开始动画前的状态
    android:fillEnabled setFillEnabled(boolean) 与android:fillBefore效果相同
    android:interpolator setInterpolator(Interpolator) 设定插值器(指定的动画效果,譬如回弹等)
    android:repeatCount setRepeatCount(int) 重复次数
    android:repeatMode setRepeatMode(int) 重复类型有两个值,reverse表示倒序回放,restart表示从头播放
    android:startOffset setStartOffset(long) 调用start函数之后等待开始运行的时间,单位为毫秒
    android:zAdjustment setZAdjustment(int) 表示被设置动画的内容运行时在Z轴上的位置(top/bottom/normal),默认为normal

    无论我们补间动画的哪一种都已经具备了这种属性,也都可以设置使用这些属性中的一个或多个。

    Alpha属性详解

    xml属性 java方法 解释
    android:fromAlpha AlphaAnimation(float fromAlpha, …) 动画开始的透明度(0.0到1.0,0.0是全透明,1.0是不透明)
    android:toAlpha AlphaAnimation(…, float toAlpha) 动画结束的透明度,同上

    Rotate属性详解

    xml属性 java方法 解释
    android:fromDegrees RotateAnimation(float fromDegrees, …) 旋转开始角度,正代表顺时针度数,负代表逆时针度数
    android:toDegrees RotateAnimation(…, float toDegrees, …) 旋转结束角度,正代表顺时针度数,负代表逆时针度数
    android:pivotX RotateAnimation(…, float pivotX, …) 缩放起点X坐标(数值、百分数、百分数p,譬如50表示以当前View左上角坐标加50px为初始点、50%表示以当前View的左上角加上当前View宽高的50%做为初始点、50%p表示以当前View的左上角加上父控件宽高的50%做为初始点)
    android:pivotY RotateAnimation(…, float pivotY) 缩放起点Y坐标,同上规律

    Scale属性详解

    xml属性 java方法 解释
    android:fromXScale ScaleAnimation(float fromX, …) 初始X轴缩放比例,1.0表示无变化
    android:toXScale ScaleAnimation(…, float toX, …) 结束X轴缩放比例
    android:fromYScale ScaleAnimation(…, float fromY, …) 初始Y轴缩放比例
    android:toYScale ScaleAnimation(…, float toY, …) 结束Y轴缩放比例
    android:pivotX ScaleAnimation(…, float pivotX, …) 缩放起点X轴坐标(数值、百分数、百分数p,譬如50表示以当前View左上角坐标加50px为初始点、50%表示以当前View的左上角加上当前View宽高的50%做为初始点、50%p表示以当前View的左上角加上父控件宽高的50%做为初始点)
    android:pivotY ScaleAnimation(…, float pivotY) 缩放起点Y轴坐标,同上规律

    Translate属性详解

    xml属性 java方法 解释
    android:fromXDelta TranslateAnimation(float fromXDelta, …) 起始点X轴坐标(数值、百分数、百分数p,譬如50表示以当前View左上角坐标加50px为初始点、50%表示以当前View的左上角加上当前View宽高的50%做为初始点、50%p表示以当前View的左上角加上父控件宽高的50%做为初始点)
    android:fromYDelta TranslateAnimation(…, float fromYDelta, …) 起始点Y轴从标,同上规律
    android:toXDelta TranslateAnimation(…, float toXDelta, …) 结束点X轴坐标,同上规律
    android:toYDelta TranslateAnimation(…, float toYDelta) 结束点Y轴坐标,同上规律

    AnimationSet详解

    AnimationSet继承自Animation,是上面四种的组合容器管理类,没有自己特有的属性,他的属性继承自Animation,所以特别注意,当我们对set标签使用Animation的属性时会对该标签下的所有子控件都产生影响。

    视图动画使用方法

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:interpolator="@[package:]anim/interpolator_resource"
        android:shareInterpolator=["true" | "false"] >
        <alpha
            android:fromAlpha="float"
            android:toAlpha="float" />
        <scale
            android:fromXScale="float"
            android:toXScale="float"
            android:fromYScale="float"
            android:toYScale="float"
            android:pivotX="float"
            android:pivotY="float" />
        <translate
            android:fromXDelta="float"
            android:toXDelta="float"
            android:fromYDelta="float"
            android:toYDelta="float" />
        <rotate
            android:fromDegrees="float"
            android:toDegrees="float"
            android:pivotX="float"
            android:pivotY="float" />
        <set>
            ...
        </set>
    </set>
    ImageView spaceshipImage = (ImageView) findViewById(R.id.spaceshipImage);
    Animation hyperspaceJumpAnimation = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump);
    spaceshipImage.startAnimation(hyperspaceJumpAnimation);
    

    上面就是一个标准的使用我们定义的补间动画的模板。至于补间动画的使用,Animation还有如下一些比较实用的方法介绍:

    Animation类方法 解释
    reset() 重置Animation的初始化
    cancel() 取消Animation动画
    start() 开始Animation动画
    setAnimationListener(AnimationListener listener) 给当前Animation设置动画监听
    hasStarted() 判断当前Animation是否开始
    hasEnded() 判断当前Animation是否结束

    特别特别注意:补间动画执行之后并未改变View的真实布局属性值。切记这一点,譬如我们在Activity中有一个Button在屏幕上方,我们设置了平移动画移动到屏幕下方然后保持动画最后执行状态呆在屏幕下方,这时如果点击屏幕下方动画执行之后的Button是没有任何反应的,而点击原来屏幕上方没有Button的地方却响应的是点击Button的事件。

    视图动画Interpolator插值器详解

    插值器简介

    介绍补间动画插值器之前我们先来看一幅图,如下:

    Paste_Image.png
    java类 xml id值 描述
    AccelerateDecelerateInterpolator @android:anim/accelerate_decelerate_interpolator 动画始末速率较慢,中间加速
    AccelerateInterpolator @android:anim/accelerate_interpolator 动画开始速率较慢,之后慢慢加速
    AnticipateInterpolator @android:anim/anticipate_interpolator 开始的时候从后向前甩
    AnticipateOvershootInterpolator @android:anim/anticipate_overshoot_interpolator 类似上面AnticipateInterpolator
    BounceInterpolator @android:anim/bounce_interpolator 动画结束时弹起
    CycleInterpolator @android:anim/cycle_interpolator 循环播放速率改变为正弦曲线
    DecelerateInterpolator @android:anim/decelerate_interpolator 动画开始快然后慢
    LinearInterpolator @android:anim/linear_interpolator 动画匀速改变
    OvershootInterpolator @android:anim/overshoot_interpolator 向前弹出一定值之后回到原来位置

    可以看见其实各种插值器都是实现了Interpolator接口而已,同时可以看见系统提供了许多已经实现OK的插值器,具体如下:
    PathInterpolator 新增,定义路径坐标后按照路径坐标来跑。

    插值器使用方法

    <set android:interpolator="@android:anim/accelerate_interpolator">
      ...
    </set>
    

    插值器的自定义(内容省略,可看原文)

    Drawable Animation(Drawable动画)使用详解

    使用方式:https://developer.android.google.cn/guide/topics/graphics/drawable-animation.html

    可见,其父类就是Drawable

    Paste_Image.png

    Drawable动画详细说明

    我们依旧可以使用xml或者java方式实现帧动画。但是依旧推荐使用xml,具体如下:

    <animation-list> 必须是根节点,包含一个或者多个<item>元素,属性有:

    android:oneshot true代表只执行一次,false循环执行。
    <item> 类似一帧的动画资源。
    <item> animation-list的子项,包含属性如下:

    android:drawable 一个frame的Drawable资源。
    android:duration 一个frame显示多长时间。

    Drawable动画实例演示

    关于帧动画相对来说比较简单,这里给出一个常规使用框架,如下:

    <!-- 注意:rocket.xml文件位于res/drawable/目录下 -->
    <?xml version="1.0" encoding="utf-8"?>
    <animation-list xmlns:android="http://schemas.android.com/apk/res/android"
        android:oneshot=["true" | "false"] >
        <item
            android:drawable="@[package:]drawable/drawable_resource_name"
            android:duration="integer" />
    </animation-list>
    
    ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image);
    rocketImage.setBackgroundResource(R.drawable.rocket_thrust);
    
    rocketAnimation = (AnimationDrawable) rocketImage.getBackground();
    rocketAnimation.start();
    

    特别注意,AnimationDrawable的start()方法不能在Activity的onCreate方法中调运,因为AnimationDrawable还未完全附着到window上,所以最好的调运时机是onWindowFocusChanged()方法中。

    Property Animation(属性动画)使用详解

    在使用属性动画之前先来看几个常用的View属性成员:

    • translationX,translationY:控制View的位置,值是相对于View容器(父View)左上角坐标的偏移。
    • rotationX,rotationY:控制相对于轴心旋转。
    • x,y:控制View在容器(相对于屏幕左上角的坐标)中的位置,即左上角坐标加上translationX和translationY的值。
    • alpha:控制View对象的alpha透明度值。
      这几个常用的属性相信大家都很熟悉,接下来的属性动画我们就从这里展开。

    属性动画概述

    Android 3.0以后引入了属性动画,属性动画可以轻而易举的实现许多View动画做不到的事,上面也看见了,View动画无非也就做那几种事情,别的也搞不定,而属性动画就可以的,譬如3D旋转一张图片。其实说白了,你记住一点就行,属性动画实现原理就是修改控件的属性值实现的动画。

    具体先看下类关系:

    /**
     * This is the superclass for classes which provide basic support for animations which can be
     * started, ended, and have <code>AnimatorListeners</code> added to them.
     */
    public abstract class Animator implements Cloneable {
        ......
    }
    

    所有的属性动画的抽象基类就是他。我们看下他的实现子类:

    Paste_Image.png Paste_Image.png
    java类名 xml关键字 描述信息
    ValueAnimator <animator> 放置在res/animator/目录下在一个特定的时间里执行一个动画
    ObjectAnimator <objectAnimator> 放置在res/animator/目录下一个对象的一个属性动画
    AnimatorSet <set> 放置在res/animator/目录下动画集合

    剩下的看自己总结的android官方文档

    相关文章

      网友评论

          本文标题:android动画详解

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