Android开发艺术探索 第七章 Android动画深入分析

本章讲解:view动画,帧动画,动画使用特殊场景,属性动画,动画使用注意事项

1.view动画:平移缩放旋转淡入淡出动画(补间动画),帧动画。

补间动画动画集合示例:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="true"                            //动画结束后是否停留在结束位置       
    android:duration="1000"                             //动画持续时间
    android:shareInterpolator="true">                   //是否共享差值器
    
    <alpha                                              //透明度动画(淡入淡出动画)
        android:fromAlpha="0.1"                       //透明度起始值 比如0.1
        android:toAlpha="1.0"/>                       //透明度结束值 比如1
    
    <scale                                              //缩放动画
        android:fromXScale="0.5"                        //水平缩放的起始值 比如:0.5
        android:fromYScale="0.5"                        //竖直方向的起始值 比如:0.5
        android:toXScale="1.0"                          //水平方向的结束值 比如:1.0
        android:toYScale="1.0"                          //竖直方向的结束值 比如:1.0
        android:pivotX="1.0"                            //缩放的轴点的x坐标。
        android:pivotY="1.0"/>                          //缩放的轴点的y坐标。
    
    <translate                                          //平移动画
        android:fromXDelta="0.1"                        //平移动画水平方向起始值
        android:fromYDelta="0.1"
        android:toXDelta="1.0"                          //平移动画水平方向结束值
        android:toYDelta="1.0"/>
    
    <rotate                                             //旋转动画
        android:fromDegrees="0"                         //旋转动画开始角度 比如:0
        android:toDegrees="180"                         //旋转动画结束角度 比如:180       
        android:pivotX="1"                              //轴点x坐标值
        android:pivotY="1" />
</set>

2.帧动画:顺序播放一组预先定义好的图片,类似电影播放。对应标签<animation-list>。缺点:容易引起oom

3.自定义view动画。

        流程:继承Animation,重写initialize和applyTransformation方法,initialize做一些初始化操作,applyTransformation做矩阵变换的操作。

4.view动画使用的特殊场景。

①.LayoutAnimation:LayoutAnimation作用于ViewGroup,为ViewGroup指定一个动画,当他的子元素出场会具有此动画,一般用于ListView,RecycleView。对应标签符<LayoutAnimation>

②.Activity的切换效果。

主要用到overridePendingTransition(int enterAnim,int exitAnim),注意这个方法在startActivity或者finish之后被调用才生效。

5.属性动画:在一段时间内完成对象的一个属性值改变成另一个属性值。

①.比如:改变x坐标位置进行平移,改变backgroundColor颜色值让背景色实现渐变,对view做平移缩放旋转淡入淡出等。

示例xml如下

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="sequentially|together">       //sequentially 子动画顺序播放  together  子动画同时播放
    <objectAnimator                                 //ObjectAnimator
        android:propertyName="string"               //属性名
        android:duration="int"                    
        android:valueFrom="float|int|color"         //表示属性的起始值
        android:valueTo="float|int|color"           //表示属性的结束值
        android:startOffset="int"                   //动画延时,动画开始后多少毫秒真正播放动画
        android:repeatCount="int"                   //动画重复次数
        android:repeatMode="restart"                //动画重复模式
        android:valueType="colorType"/>             //属性类型

    <animator                                       //ValueAnimator
        android:duration="int"
        android:valueFrom="float|int|color"
        android:valueTo="float|int|color"
        android:startOffset="int"
        android:repeatCount="int"
        android:repeatMode="restart"
        android:valueType="colorType"/>

</set>

②.插值器和估值器。

TimeInterpolator:时间插值器。根据当前流逝时间的百分比计算出当前属性改变的百分比,可以实现Interpolator接口来实现一个自定义的时间插值器。

TypeEveluator:类型估值器。根据当前变化的百分比(即时间插值器返回的值),计算出属性改变后的值。可以实现TypeEveluator接口来实现一个自定义的类型估值器。

③.属性动画的监听器(AnimatorUpdateListener和AnimatorListener)

AnimatorListener监听开始结束取消和重复播放。

AnimatorUpdateListener监听整个动画过程的进度

④.对任意属性进行动画。

比如对Button的width属性进行动画

ObjectAnimator.ofInt(mButton,"width",500).setDuration(500).start();

发现上述动画没有效果,因为setWidth方法不是对宽度设值的,源码中如下:

@android.view.RemotableViewMethod
public void setWidth(int pixels) {
    mMaxWidth = mMinWidth = pixels;
    mMaxWidthMode = mMinWidthMode = PIXELS;

    requestLayout();
    invalidate();
}

对属性abc做动画并且想让动画生效需要满足以下两点:

(1).object必须提供setAbc方法,如果动画需要传递初始值,还需要getAbc方法,因为系统需要获取abc的属性值(如果不满足直接crash)

(2).object的setAbc对属性abc所做的改变必须通过某种方式反映出来,比如:ui带来改变(如果此条不满足,不会有任何效果也不会crash)

以上问题官方告诉我们三种解决方式:

(1).给你的对象加set和get方法,如果你有权限的话。

(2).添加包装类包装原始对象,间接提供get和set方法。

(3).采用ValueAnimator,监听动画过程,自己实现属性的改变。

6.使用动画注意事项:

①.oom问题:主要是帧动画中,易出现oom,可以将动画压缩或者才有surfaceView

②.内存泄漏:属性动画中有一类无限循环的动画,在activity退出要及时停止。

③.view动画问题:在view动画结束后需要clearAnimation清除动画,否则可能view调用setVisibility(GONE)失效。

④.view动画结束后真正的位置还是原先的位置,属性动画结束后真正的位置是动画完成的位置。

⑤.使用动画过程建议开启硬件加速,这样更加流畅。

猜你喜欢

转载自blog.csdn.net/gongjdde/article/details/89315813