您的位置:首页 > 移动开发 > Android开发

Android Animation的用法总结

2016-07-25 18:01 471 查看
序言:Android动画应用最多的个人认为就是启动页面的动画了,之前都是使用Timer实现这个效果,最近在研究别人的项目的时候发现都是使用Android Animation效果,所以专门研究了一下这方面的内容。

Android动画框架

Android动画框架定义了透明度、旋转、缩放和位移几种常见的动画,而且控制的是整个view,实现原理是每次绘制视图时View所在的ViewGroup中的drawChild函数获取该View的Animation的Transformation值,然后调用canvas.concat(transformToApply.getMatrix()),通过矩阵运算完成动画帧。如果动画没有完成就继续调用invalidate()函数,启动下次绘制来驱动动画,从而完成整个动画的绘制

以上这段话出自徐宜生的《Android群英传》第七章Android动画机制与使用技巧开篇,帮助我们更好的理解Android Anmation的原理

Android视图动画

Android视图动画既可以通过XML来描述也可以通过java代码来控制整个动画过程

XML配置文件,Android视图动画可以分为:alpha、scale、translate、rotate

Java类,Android视图动画提供了AlphaAniamtion、RotateAnimation、ScaleAnimation、TranslateAnimation四种动画方式

我们可以通过下表来了解一下四种动画的具体效果

XML中JAVA代码中效果
alphaAlphaAnimation为视图增加透明度的变换动画
scaleScaleAnimation为视图的缩放增加动画效果
translateTranslateAnimation为视图移动时增加位移动画
RotateRotateAnimation为视图增加旋转的变换动画

Android动画还可以分为两种模式:Tween(补间)和Frame(逐帧)

Tween动画,就是对场景里对象不断的进行图像变化来产生动画效果,如旋转、平移、缩放、渐变

Frame动画,逐帧动画,也就是说播放事先做好的图像,类似于gif图片原理

这两种划分模式之间的关系如下:

TweenFrame
alpha(AlphaAnimation)translate(TranslateAniamtion)
scale(ScaleAniamtion)rotate(RotateAniamtion)

Android动画的简单使用

下面来分别以XML和Java两种方式展示视图动画的简单使用

PS:
1.XML定义动画时,在res目录下创建anim文件夹
2.这里只写对应的标签布局,多余的代码不再贴出
3.XML和Java两种方式任选一种即可


缩放动画(Scale)

XML配置

<!--属性
1.android:fromXScale 浮点值,起始时X轴上相对自身的缩放比例,1.0代表无变化,0.5代表起始时缩小一倍,2.0代表放大一倍
2.android:toXScale 浮点值,结束时X轴上相对于自身的缩放比例
3.android:fromYScale 浮点值,起始时Y轴上相对于自身的缩放比例
4.android:toYScale 浮点值,结束时Y轴上相对于自身的缩放比例
5.android:pivotX 缩放起点X坐标
6.android:pivotY 缩放起点Y坐标
pivotX和pivotY决定了起始点坐标,以pivotX为例它的值可以是数值、百分数、百分数p三种形式,
比如当前数值为50时,表示在当前控件左上角(原点)加上50px,作为起始X坐标;
如果是50%,表示在当前控件的左上角加上自己的宽度的50%作为起始点X坐标;
如果是50%p,加上P表示取值的基数是父控件,那么表示在原点基础上加上父控件宽度的50%作为起始点X坐标。
7.android:duration 动画持续时间

-->
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXScale="0.0"
android:toXScale="1.4"
android:fromYScale="0.0"
android:toYScale="1.4"
android:pivotX="50"
android:pivotY="50"
android:duration="700" />


Java代码

/**
* ScaleAnimation也有两种方法,类似于rotate这里介绍第二种
* ScaleAnimation缩放动画效果
* ScaleAnimation(float fromX, float toX, float fromY, float toY,int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
* fromX:   动画起始时X坐标上的伸缩尺寸
* toX:     动画结束时X坐标上的伸缩尺寸
* fromY:   动画起始时Y坐标上的伸缩尺寸
* toY:     动画结束时Y坐标上的伸缩尺寸
* pivotXType:      动画在X轴相对于物件位置类型
* pivotXValue:     动画相对于物件的X坐标的开始位置
* pivotYType:      动画在Y轴相对于物件位置类型
* pivotYValue:     动画相对于物件的Y坐标的开始位置
*/
//ScaleAniamtion sa=new ScaleAnimation(0,2,0,2);
ScaleAniamtion sa=new ScaleAnimation(1.0f,1.2f,1.0f,1.0f,
Animation.RELATIVE_TO_SELF,0.5f,
Animation.RELATIVE_TO_SELF,0.5f);
view.startAniamtion(sa);


ScaleAniamtion有以下几个构造函数

// 第一个从XML文件加载动画,基本用不到
ScaleAnimation(Context context, AttributeSet attrs)

//下面三个根据需要自行选择
ScaleAnimation(float fromX, float toX, float fromY, float toY);

ScaleAnimation(float fromX, float toX, float fromY, float toY, float pivotX, float pivotY)

ScaleAnimation(float fromX, float toX, float fromY, float toY, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)


透明度动画(alpha)

XML中定义动画

<alpha
android:fromAlpha="0.1"
android:toAlpha="0.8"
android:dration="4000"/>
<!--属性:
fromAlpha,动画起始时的透明度
toAlpha,动画结束时的透明度
注:0.0表示完全透明,1.0表示完全不透明,值取0.0-1.0之间的浮点型数字
duration 动画持续时间,以毫秒为单位
-->


Java代码

/**
* 第一个参数fromAlpha,动画开始时透明度
* 第二个参数头Alpha,动画结束时透明度
* setDuration()设置动画持续时间XX毫秒
*/
AlphaAnimation alphaAniamtion = new AlphaAniamtion(0,1);
alphaAnimation.setDuration(3000);
view.startAniamtion(alphaAnimation);


AlphaAniamtion对应有两个构造函数

// 同样,从本地XML加载动画,基本不用
AlphaAnimation(Context context, AttributeSet attrs);
//下面是最常用到的
AlphaAnimation(float fromAlpha, float toAlpha)


旋转动画(Rotate)

XML配置

<rotate
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromDegrees="0"
android:toDegrees="+200"
android:pivotX<
bee9
/span>="50%"
android:pivotY="50%"
android:duration="3000"
android:fillAfter="true"/>
<!--属性介绍
1.interpolater 设定插值器,也就是指定的动作效果,比如弹跳效果等
2.android:fromDegrees 开始旋转的角度位置,正值代表顺时针方向度数,负值代表逆时针方向度数
3.android:toDegrees 结束时旋转到的角度位置,正负值同上
4.android:pivotX 缩放起点X轴坐标,具体介绍同Scale
5.android:pivotY 起始点Y坐标,介绍同Scale
-->


Java代码

/**
* 第一种方法的参数分别是旋转的起始角度和旋转中心的坐标点
* 第二种方法通过设置参数来控制旋转动画的参考系,这里设置旋转参考系为自身中心点,该方法对应参数如下:
* 1. fromDegrees,动画起始时的旋转角度
* 2. toDegrees,动画旋转到的角度
* 3. pivotXType, 动画在X轴相对于物件位置类型
* 4. pivotXValue,动画相对于物件的X坐标的开始位置
* 5. pivotYType,动画在Y轴相对于物件位置的类型
* 6. pivotYValue,动画相对于物件的Y坐标的开始位置
* 最后设置动画持续时间并开启动画
*/
RotateAnimation ra = new RotateAnimation(0,360,100,100);
//RotateAnimation ra = new RotateAnimation(0,360,
//                  RotateAniamtion.RELATIVE_TO_SELF,0.5f,
//                  RotateAnimation.RELATIVE_TO_SLEF,0.5f);
ra.setDuration(3000);
view.startAnimation(ra);


RotateAniamtion对应的构造函数有:

//同样,第一个也不常用
RotateAnimation(Context context, AttributeSet attrs)

//
RotateAnimation(float fromDegrees, float toDegrees)

RotateAnimation(float fromDegrees, float toDegrees, float pivotX, float pivotY)

RotateAnimation(float fromDegrees, float toDegrees, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)


位移动画(Translate)

XML配置

<!--
四个参数:
1.fromXDelta 动画起始时,在X轴上移动的位置,同样可以是数值、百分数、百分数p三种形式
2.toXDelta 动画结束时,在X轴上移动的位置
3.fromYDelta 动画开始时,在Y轴上移动的位置,数值、百分数、百分数p三种选择
4.toYDelta 动画结束时,在Y轴上移动的位置
-->
<translate
android:fromXDelta="0"
android:toXDelta="-80"
android:fromYDelta="0"
android:toYDelta="-100"
android:duration="3000">
</translate>


Java代码

//参数见同上方XML注释
TranslateAnimation ta=new TranslateAnimation(0,200,0,300);
ta.setDuration(3000);
view.setAnimation(ta);


对应构造函数是:

//第一个同样不常用
TranslateAnimation(Context context, AttributeSet attrs)

//
TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)

TranslateAnimation(int fromXType, float fromXValue, int toXType, float toXValue, int fromYType, float fromYValue, int toYType, float toYValue)


组合动画(AnimationSet)

Android视图除了提供了ScaleAniamtion、AlphaAniamtion、TranslateAniamtion、RotateAniamtion四种动画以外,还提供了AnimationSet动画集合来组合使用动画效果,方法如下:

AnimationSet as = new AnimationSet(true);
as.setDuration(1000);

ScaleAnimation sa = new ScaleAniamtion(0,1,0,1);
sa.serDuration(1000);
as.add(sa);

TranslateAnimation ta =new TranslateAnimation(0,100,0,200);
ta.setDuration(1000);
as.add(ta);

view.startAniamtion(as);


Animation监听方法

对于动画事件,Android提供了监听回调事件,添加相应的监听方法如下,通过这个监听可以获取到动画开始、结束、重复事件,然后根据需要进行相应的处理。

animation.setAnimationListener(new Aniamtion.AniamtionListener(){
@override
public void onAnimationStart(Animation animation){

}

@override
public void onAnimationEnd(Animation animation){

}

@override
public void onAnimationRepeat(Animation animation){

}
});


补充

Animation类是所有动画的基类,它所具有的属性和意义如下:

属性介绍:左边是XML属性,右边是Java代码

XML属性Java代码意义
android:durationsetDuration(long l)动画持续时间,单位毫秒
android:fillAftersetFillAfter(boolean)设置为true,控件动画结束时,将保持最后时刻的状态
android:fillBeforesetFillBefore(boolean)设置为true,控件动画结束时还原到开始前的状态
android:fillEnabledsetFillEnabled(boolean)同fillBefore,结束时将控件初始化
android:repeatCountsetRepeatCount(int)重复次数
android:repeatModesetRepeatMode()重复类型,有reverse和restart两个值,reverse表示倒序回放,restart表示重新放一遍,必须与repeatCount一起使用才有效果。
android:interpolatorsetInterpolator设定插值器,即指定动画效果
关于插值器,想要了解更多可以看这篇blog,讲解比较详细。

http://blog.csdn.net/harvic880925/article/details/40049763

总结

我们可以很明显的看出来,XML和Java代码的使用是十分相似的,这也是Android动画的简单应用,大家想要深入了解可以去官方文档或者参考下方参考文献的这些博客。

PS:徐大神书中给的例子里,动画设置的参数都没有加f(浮点数),而我在网上看的博客都是大都是加了的,这里可以根据需要自行决定,一般都是需要使用浮点的


文献参考

1. 徐宜生《Android群英传》

2. http://www.open-open.com/lib/view/open1335777066015.html

3. http://www.jb51.net/article/32340.htm

4. http://blog.csdn.net/feng88724/article/details/6318430

5. http://blog.csdn.net/harvic880925/article/details/39996643

第五篇是一个动画系列的详细研究,有兴趣的可以看一下
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 动画