android进阶(七)-----Android动画深入分析

android动画分三种:补间动画、帧动画和属性动画。

下面我们一一说明

一、补间动画:

支持四种动画效果,分别是位移动画(TranslateAnimation)、缩放动画(ScaleAnimation)、旋转动画(RotateAnimation)和透明度动画(AlphaAnimation)。这四种动画既可以通过XML来定义,也可以通过代码动态创建,建议使用XML定义。

示例代码:

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android"

android:interpolator="@[package]anim/test_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:pcvotY="float"/>



<set>

<alpha

android:fromAlpha="float"

android:toAlpha="float"/>

</set>

</set>

从上面例子可以看出,补间动画既可以是单个动画,也可以由一系列动画组合而成。

1、<set>表示动画集合,对应java AnimationSet类,可以包含多个动画,并且可以嵌套其他动画集合。

android:interpolator:差值器,差值器影响动画的速度

android:shareInterpolator:集合中的动画是否和集合共享同一个差值器。如果集合不指定差值器,那么子动画就需要单独制定差值器或使用默认值

2、<translate>平移动画,对应java TranslateAnimation类,可以使一个View在水平或竖直方向完成平移的动画

android:fromXDelta:x的起始值

android:toXDelta::x的结束值

android:fromYDelta:y的起始值

android:toYDelta:y的结束值

3、<scale>缩放动画,对应java ScaleAnimation,可以使View方法或缩小的动画

android:fromXScale:水平方向缩放的起始值

android:toXScale:水平方向缩放的结束值

android:fromYScale:竖直方向缩放的起始值

android:toYScale:竖直方向缩放的结束值

android:pivotX:缩放的轴点X座标,影响缩放效果

android:pivotY:缩放的轴点Y座标,影响缩放效果

4、<rotate>旋转动画,对应java RotateAnimation,使View旋转的动画

android:fromDegrees:旋转开始的角度

android:toDegrees:旋转结束的角度

android:pivotX:旋转的轴点X座标

android:pivotY:旋转的轴点Y座标

5、<alpha>透明度动画,对应java AlphaAnimationo,可以改变View透明度

android:fromAlpha:透明度的起始值

android:toAlpha:透明度的结束值

android:duration:动画持续时间

android:fillAfter:动画结束以后View是否停留在结束位置

 

二、帧动画

帧动画是顺序播放一组预先定义号的图片,类似于视频播放

<?xml version="1.0" encoding="utf-8"?>

<animation-list xmlns:android="http://schemas.android.com/apk/res/android"

android:oneshot="false">

<item android:drawable="@drawable/image1" android:duration="100"/>

<item android:drawable="@drawable/image2" android:duration="100"/>

<item android:drawable="@drawable/image3" android:duration="100"/>

</animation-list>

帧动画容易引起OOM,使用帧动画应尽量避免使用尺寸较大的图片

 

三、属性动画

1、属性动画是API 11新加入的特性,可以对任何对象的属性进行动画,默认时间间隔300ms。

常用的几个动画类是:ValueAnimator、ObjectAnimator、AnimatorSet。其中ObjectAnimator继承自ValueAnimator,AnimatorSet是动画集合。

(1)改变一个对象的translationY属性

ObjectAnimator.ofFloat(myObject,"translationY",-myObject.getHeight()).start()

(2)改变一个对象的背景色:在3秒内从0xFFFF8080到0xFF8080FF渐变

ValueAnimator colorAnim = objectAnimator.ofInt(this,"backgroundColor",0xFFFF8080,0xFF8080FF)

colorAnim.setDuration(3000);

colorAnim.setEvaluator(new ArgbEvaluator());

colorAnim.setRepeatCount(ValueAnimator.INFINITE);

colorAnim.setRepeatMode(ValueAnimator.REVERSE);

colorAnim.start();

(3)动画集合,5秒内对View的旋转、平移、缩放和透明度发送改变

AnimatorSet set = new AnimatorSet();

set.playTogether{

ObjectAnimator.ofFloat(myView,"rotationX",0,360),

ObjectAnimator.ofFloat(myView,"rotationY",0,180),

ObjectAnimator.ofFloat(myView,"rotation",0,-90),

ObjectAnimator.ofFloat(myView,"translationX",0,90),

ObjectAnimator.ofFloat(myView,"translationY",0,90),

ObjectAnimator.ofFloat(myView,"scaleX",1,1.5f),

ObjectAnimator.ofFloat(myView,"scaleY",1,0.5f),

ObjectAnimator.ofFloat(myView,"alpha",1,0.25f,1),

}

set.setDuration(5000).start();

2、差值器和估值器

(1)TimeInterpolator时间差值器:作用是根据时间流逝的百分比来计算当前属性值改变的百分比,系统预置的有LinearInterpolator(线性差值器:匀速动画)、AccelerateDecelerateInterpolator(加减速差值器:动画两头慢中间快)和DecelerateInterpolator(减速差值器:动画越来越慢)

(2)TypeEvaluator估值器:作用是根据当前属性改变的百分比计算改变后的属性值,系统预置的有IntEvaluator(整型属性)、FloatEvaluator(浮点型属性)和ArgbEvaluator(Color属性)

3、属性动画的监听器

属性动画提供了监听器用于监听动画的播放过程,主要有两个接口:AnimatorUpdateListener和AnimatorListener

AnimatorListener可以监听动画的开始、结束、取消和重复播放

AnimatorUpdateListener可以监听动画的整个过程,动画由很多帧组成,没播放一帧,onAnimationUpdate就会被调用一次。

 

四、补间动画的特殊使用场景

补间动画除了以上四种形式,还可以在一些特殊的场景下使用,如ViewGroup控制子元素出场效果、Activity切换效果

1、LayoutAnimation:作用于ViewGroup,为ViewGroup指定一个动画,子元素出场时都会具有这种动画

代码实例:

<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"

android:delay="0.5"

android:animationOrder="normal"

android:animation="@anim/item">

delay:表示子元素开始动画的时间延迟

animationOrder:表示子元素动画的顺序,有三种选项:normal(顺序显式)、reverse(逆序显式)和random(随机显式)

2、Activity的切换效果

Activity有默认的切换效果,也可以自定义。主要用到overridePendingTransition(int enterAnim, int exitAnim)方法,这个方法必须在startActivity(Intent)或finish()之后被调用才生效。

enterAnim:当Activity被打开时需要的动画资源id

exitAnim:当Activity被暂停时,所需的动画资源id

 

五、动画的使用注意事项

1、OOM:主要出现在帧动画中,当图片数量多且大的时候很容易出现OOM,尽量避免使用帧动画

2、内存泄漏:属性动画中有一类无限循环的动画,需要在Activity退出时及时停止,否则将导致Activity无法释放而造成内存泄漏

3、兼容性问题:动画在3.0以下系统有兼容性问题

4、补间动画的问题:补间动画是对View的映像做动画,并没有改变View的状态,有时候会出现动画完成后View无法隐藏的现象,这个时候调用view.clearAnimation()清除View动画即可

5、不要使用PX:使用动画过程中,尽量使用dp,否则会导致在不同设备上有不同的效果

6、硬件加速:使用动画过程中,建议开启硬件加速,提升动画流畅性

 

发布了68 篇原创文章 · 获赞 17 · 访问量 9万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章