Android的动画分析

Android的动画可以分为三种:View动画,帧动画和属性动画。下面就简单介绍这三种动画的使用方法:
1、View动画
View动画通过对场景里的对象不断做图像变换(平移,缩放,旋转,透明度)从而产生动画效果,它是一种渐进式动画。View动画可以通过xml来定义,也可以通过代码来创建,对于View动画来说,建议采用xml来定义动画,因为xml格式的动画可读性更好。
在res/anim/filename.xml中定义如下View动画:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="true"
    android:shareInterpolator="true"
    android:duration="5000"
    >

    <translate android:fromXDelta="0"
        android:toXDelta="100"
        android:fromYDelta="0"
        android:toYDelta="100"
        />

    <scale android:fromXScale="0.5"
        android:toXScale="1.2"
        android:fromYScale="0.5"
        android:toYScale="1.2"
        android:pivotX="50%"
        android:pivotY="50%"
        />

    <rotate android:fromDegrees="0"
        android:toDegrees="180"
        android:pivotX="50%"
        android:pivotY="50%"
        />

    <alpha android:fromAlpha="1.0"
        android:toAlpha="0.5"/>
</set>

从上面的语法可以看出,View动画既可以是单个动画,也可以是由一系列动画组成的。
set标签表示动画集合,对应的是AnimationSet类,他可以包含若干个动画,也可以嵌套其他动画集合的。
android:fillAfter 表示动画结束以后View是否停留在结束的位置,true表示停留
android:shareInterpolator表示集合中的动画是否和集合共享一个插值器。如果集合不指定插值器,那么子动画需要单独指定所需要的插值器或者使用默认值。
translate标签表示平移动画,对应的是TranslateAnimation类,他可以使View实现平移的动画效果。
android:fromXDelta 表示x的起始值
android:toXDelta表示x的结束值
android:fromYDelta表示y的起始值
android:toYDelta表示y的结束值
scala标签表示缩放动画,对应的是ScaleAnimation类,他可以使View实现放大或缩小的动画效果。
android:fromXScale表示水平方向缩放的起始值
android:toXScale表示水平方向缩放的结束值
android:fromYScale表示竖直方向缩放的起始值
android:toYScale表示竖直方向缩放的结束值
android:pivotX表示缩放的轴点的x坐标
android:pivotY表示缩放的轴点的y坐标
rotate标签表示旋转动画,对应的是RotateAnimation类,他可以使View实现旋转的动画效果。
android:fromDegrees表示旋转的起始角度
android:toDegrees表示旋转的结束角度
android:pivotX表示旋转的轴点x坐标
android:pivotY表示旋转的轴点y坐标
alpha标签表示透明度动画,对应的是AlphaAnimation类,他可以改变View的透明度。
android:fromAlpha表示透明度的起始值
android:toAlpha表示透明度的结束值
在代码中可以通过如下方式使用上述动画:

Animation animtion = AnimationUtils.loadAnimation(this, R.anim.filename);
textView.startAnimation(animtion);

2、帧动画
帧动画是顺序播放一系列图像而产生的动画效果,可以简单理解为图片切换动画,但是帧动画容易产生OOM,如果图片过多过大的话。帧动画对应的类是AnimationDrawable。
在res/drawable中通过xml定义一个AnimationDrawable。

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="true">

    <item android:drawable="@drawable/image" android:duration="500"/>
    <item android:drawable="@drawable/ic_launcher" android:duration="500"/>
</animation-list>

android:oneshot表示动画是否播放一次。
将上述Drawable设置为View的背景并通过Drawable来播放动画。

textView.setBackgroundResource(R.drawable.frame_animation);
AnimationDrawable animationDrawable = (AnimationDrawable) textView.getBackground();
animationDrawable.start();

3、属性动画
属性动画是通过动态的改变对象的属性从而达到动画的效果。它是API11新加入的属性。它和View对象不同,他对作用对象进行了扩展,他可以对任何对象做动画,甚至也可以没有对象。几个常用的动画类是:ValueAnimator,ObjectAnimator和AnimatorSet。属性动画除了可以通过代码实现以外,也可以通过xml来定义。属性动画需要定义在res/animator中.
针对这三种动画类的代码简单用法如下:

//ValueAnimator
ValueAnimator valueAnimator = ValueAnimator.ofInt(0,1);
//ObjectAnimator
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(textView,"translationY",100);
//AnimatorSet
AnimatorSet set = new AnimatorSet();
set.playTogether(valueAnimator,objectAnimator);

xml中这三种动画类的简单用法是:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="together">

    <objectAnimator android:propertyName="translationY"
        android:duration="1000"
        android:valueFrom="100"
        android:valueTo="300"
        android:startOffset="200"
        android:repeatCount="0"
        android:repeatMode="restart"
        android:valueType="intType"/>
    
    <animator android:duration="500"
        android:valueFrom="0"
        android:valueTo="10"
        android:startOffset="100"
        android:repeatCount="0"
        android:repeatMode="reverse"
        android:valueType="intType"/>
</set>

set标签对应AnimatorSet
android:ordering 表示动画集合的播放顺序,“together”表示动画集合中的子动画同时播放,“sequentially”表示动画集合中的子动画按顺序播放。
objectAnimator标签对应ObjectAnimator类。
android:propertyName表示属性动画作用的属性名称
android:valueFrom表示属性起始值
android:valueTo表示属性结束值
android:startOffset表示动画的延时时间
android:repeatCount表示动画的重复次数。默认为0,-1表示无限重复
android:repeatMode=表示动画的重复模式。restart 从头开始,reverse 逆向重复
android:valueType表示属性的类型。有intType和floatType。如果propertyName指定的是颜色,那么valueType可以不做指定,系统会自动根据颜色的类型的属性来处理。
在代码中使用上面的属性动画:

AnimatorSet set1 = (AnimatorSet) AnimatorInflater.loadAnimator(this,R.animator.property_animator);
set1.setTarget(textView);
set1.start();

在实际应用中还是尽量使用动态创建属性动画,因为一般的属性值是无法提前确定的。
我们需要注意的是:我们对object的任意属性abc做动画,要想让动画生效,需要同时满足两个条件:
1、object需要提供setAbc方法,如果动画没有传递起始值,那么还要提供getAbc方法,因为系统需要去取abc属性的起始值(如果这条不满足,直接crash)
2、object的setAbc对属性abc所做的改变必须能够通过某种方法反映出来,比如对UI的改变(如果这条不满足,动画无效果,但不会crash)。
那么针对上述问题,官网给出如下3中解决方案:
1、给你的对象加上get和set方法,如果你有权限的话。
2、用一个类包装原始对象,间接为其提供get/set方法。
3、使用ValueAnimator,监听动画过程,自己实现属性的改变。
4、使用动画的注意事项
1、OOM问题
主要出现在帧动画,当图片过多过大时就容易出现OOM,那么应该尽量避免使用帧动画。
2、内存泄漏
在属性动画中有一种无限循环的动画,那么需要在Activity退出时及时停止,否则就会造成Activity无法释放而导致内存泄漏。而View动画则不会产生这样的问题。
3、View动画的问题
View动画是对View的影响做动画,并未真正改变View的状态,因此有时候会出现动画完成后View无法隐藏的现象,即setVisibility(View.GONE)失效了,这时候只要调用view.clearAnimation()清除view的动画即可。
4、不要使用px
在动画的过程中尽量使用dp,因为使用px在不同的设备上会有不同的效果。
5、动画元素的交互
Android3.0之前的系统上,不管是View动画还是属性动画,新位置都无法触发事件,同时老位置仍然可以触发事件。3.0以后,属性动画的单击事件触发位置为移动后的位置,而View动画仍然在原位置。
6、硬件加速
在动画的过程中,建议开启动画加速,这样会提高动画的流畅性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值