转 android-Animation详解 animation详解

android - Animation详解

Drawable 最强大的功能是:显示Animation。AndroidSDK介绍了2种Animation:

在使用Animation前,我们先学习如何定义Animation,这对我们使用Animation会有很大的帮助。Animation是以XML格式定义的,定义好的XML文件存放在res/anim中。由于Tween Animation与Frame Animation的定义、使用都有很大的差异,我们将分开介绍,本篇幅中介绍TweenAnimation的定义与使用,后续篇幅再详细介绍FrameAnimation。按照XML文档的结构【父节点,子节点,属性】来介绍Tween Animation,其由4种类型:

在介绍以上4种类型前,先介绍Tween Animation共同的节点属性。

表一

属性[类型]功能
Duration[long]属性为动画持续时间时间以毫秒为单位
fillAfter [boolean]当设置为true ,该动画转化在动画结束后被应用
fillBefore[boolean]当设置为true ,该动画转化在动画开始前被应用

interpolator

指定一个动画的插入器有一些常见的插入器
accelerate_decelerate_interpolator
加速-减速 动画插入器
accelerate_interpolator
加速-动画插入器
decelerate_interpolator
减速- 动画插入器
其他的属于特定的动画效果
repeatCount[int]动画的重复次数
repeatMode[String]定义重复的行为

1:"restart"2:"reverse"eg:android:repeatMode="reverse"

startOffset[long]动画之间的时间间隔,从上次动画停多少时间开始执行下个动画
zAdjustment[int]定义动画的Z Order的改变0:保持Z Order不变
1:保持在最上层
-1:保持在最下层

看了以上节点,大家是不是都想开始定义动画了。下面我们就开始结合具体的例子,介绍4种类型各自特有的节点元素。

表二

XML节点功能说明
alpha渐变透明度动画效果
android:fromAlpha=”0.1″
android:toAlpha=”1.0″
android:duration=”3000″ />
fromAlpha

属性为动画起始时透明度

0.0表示完全透明
1.0表示完全不透明
以上值取0.0-1.0之间的float数据类型的数字
toAlpha属性为动画结束时透明度

表三

scale渐变尺寸伸缩动画效果
android:interpolator=“@android:anim/accelerate_decelerate_interpolator”
android:fromXScale=”0.0″
android:toXScale=”1.4″
android:fromYScale=”0.0″
android:toYScale=”1.4″
android:pivotX=”50%”
android:pivotY=”50%”
android:fillAfter=”false”
android:startOffset=“700”
android:duration=”700″
android:repeatCount=”10″ />
fromXScale[float] fromYScale[float]为动画起始时,X、Y坐标上的伸缩尺寸0.0表示收缩到没有
1.0表示正常无伸缩
值小于1.0表示收缩
值大于1.0表示放大
toXScale [float]
toYScale[float]
为动画结束时,X、Y坐标上的伸缩尺寸
pivotX[float]
pivotY[float]
为动画相对于物件的X、Y坐标的开始位置属性值说明:从0%-100%中取值,50%为物件的X或Y方向坐标上的中点位置

表四

translate画面转换位置移动动画效果
android:fromXDelta=”30″
android:toXDelta=”-80″
【转】android-Animation详解 animation详解
android:fromYDelta=”30″
android:toYDelta=”300″
android:duration=”2000″ />
fromXDelta
toXDelta
为动画、结束起始时 X坐标上的位置
fromYDelta
toYDelta
为动画、结束起始时 Y坐标上的位置

表五

rotate画面转移旋转动画效果
android:interpolator=”@android:anim/accelerate_decelerate_interpolator”
android:fromDegrees=”0″
android:toDegrees=”+350″
android:pivotX=”50%”
android:pivotY=”50%”
android:duration=”3000″ />
fromDegrees为动画起始时物件的角度说明
当角度为负数——表示逆时针旋转
当角度为正数——表示顺时针旋转
(负数from——to正数:顺时针旋转)
(负数from——to负数:逆时针旋转)
(正数from——to正数:顺时针旋转)
(正数from——to负数:逆时针旋转)
toDegrees属性为动画结束时物件旋转的角度 可以大于360度
pivotX
pivotY
为动画相对于物件的X、Y坐标的开始位说明:以上两个属性值 从0%-100%中取值
50%为物件的X或Y方向坐标上的中点位置

按照上面的讲述学习完了Tween Animation的定义,对TweenAnimation有了详细的了解,再去了解下Android SDK的animationpackage(android.view.animation),其提供了操作Tween Animation所有的类。

AndroidSDK提供了基类:Animation,包含大量的set/getXXXX()函数来设置、读取Animation的属性,也就是前面表一中显示的各种属性。TweenAnimation由4种类型:alpha、scale、translate、roate,在AndroidSDK中提供了相应的类,Animation类派生出了AlphaAnimation、ScaleAnimation、TranslateAnimation、RotateAnimation分别实现了平移、旋转、改变 Alpha值等动画,每个子类都在父类的基础上增加了各自独有的属性。再去看下这几个类的构造函数,是不是与我们在表二、表三、表四、表五种定义的属性完全一样。

在了解了TweenAnimation的定义,对android.view.animation有了一些基本的认识后,开始介绍TweenAnimation如何使用。AndroidSDK提供了2种方法:1、直接从XML资源中读取Animation;2、使用Animation子类的构造函数来初始化Animation对象。第二种方法在看了AndroidSDK中各个类的说明就知道如何使用了,下面简要说明从XML资源中读取Animation,按照应用程序开发的过程,介绍整个使用的过程,如下:

  1. 创建Android工程;
  2. 导入一张图片资源;
  3. 在res/layout/main.xml中添加一个ImageView Widget;
  4. 在res下创建新的文件夹且命名为:anim,并在此文件夹下面定义Animation XML 文件;
  5. 修改OnCreate()中的代码,显示动画资源;

关键代码,解析如下:


//main.xml中的ImageView


ImageView spaceshipImage = (ImageView)findViewById(R.id.spaceshipImage);


//加载动画


Animation hyperspaceJumpAnimation =


AnimationUtils.loadAnimation(this,R.anim.hyperspace_jump);


//使用ImageView显示动画


spaceshipImage.startAnimation(hyperspaceJumpAnimation);


这里简要解析如下:

Android 中的 Animation 应用(二)

对Tween Animation的本质做个总结:Tween Animation通过对 View 的内容完成一系列的图形变换(包括平移、缩放、旋转、改变透明度)来实现动画效果。具体来讲,预先定义一组指令,这些指令指定了图形变换的类型、触发时间、持续时间。这些指令可以是以XML 文件方式定义,也可以是以源代码方式定义。程序沿着时间线执行这些指令就可以实现动画效果。

在这里,我们需要对2个问题进行深入的解析:

如何控制动画的运行?

这个问题,我们也就也就是上一篇幅中提到的TweenAnimation,估计大家对什么是Interpolator、到底有什么作用,还是一头雾水,在这里做个详细的说明。按照AndroidSDK中对interpolator的说明:interpolator定义一个动画的变化率(the rate ofchange)。这使得基本的动画效果(alpha, scale, translate, rotate)得以加速,减速,重复等。

用通俗的一点的话理解就是:动画的进度使用 Interpolator 控制。Interpolator定义了动画的变化速度,可以实现匀速、正加速、负加速、无规则变加速等。Interpolator 是基类,封装了所有Interpolator 的共同方法,它只有一个方法,即 getInterpolation (float input),该方法maps a point on the timeline to a multiplier to be applied to thetransformations of an animation。Android 提供了几个 Interpolator子类,实现了不同的速度曲线,如下:

AccelerateDecelerateInterpolator在动画开始与介绍的地方速率改变比较慢,在中间的时候加速
AccelerateInterpolator在动画开始的地方速率改变比较慢,然后开始加速
CycleInterpolator动画循环播放特定的次数,速率改变沿着正弦曲线
DecelerateInterpolator在动画开始的地方速率改变比较慢,然后开始减速
LinearInterpolator在动画的以均匀的速率改变

对于 LinearInterpolator ,变化率是个常数,即 f (x) = x.

public float getInterpolation(float input) {

return input;
}
Interpolator其他的几个子类,也都是按照特定的算法,实现了对变化率。还可以定义自己的 Interpolator子类,实现抛物线、自由落体等物理效果。

动画的运行模式

动画的运行模式有两种:

额外补充说明:Transformation 类

Transformation 记录了仿射矩阵 Matrix,动画每触发一次,会对原来的矩阵做一次运算, View 的 Bitmap与这个矩阵相乘就可实现相应的操作(旋转、平移、缩放等)。Transformation 类封装了矩阵和 alpha值,它有两个重要的成员,一是 mMatrix,二是 mAlpha。Transformation 类图如下所示:


总结说明

图形变换通过仿射矩阵实现。图形变换是图形学中的基本知识,简单来讲,每种变换都是一次矩阵运算。在 Android 中,Canvas类中包含当前矩阵,当调用 Canvas.drawBitmap (bmp, x, y, Paint) 绘制时,Android 会先把bmp 做一次矩阵运算,然后将运算的结果显示在 Canvas 上。这样,编程人员只需不断修改 Canvas 的矩阵并刷新屏幕,View里的对象就会不停的做图形变换,因此就形成了动画。

Android 中的Animation 应用(三)

前面我们详细介绍了TweenAniamation,这节我将介绍另外一种动画Frame Animation。在前面已经说过,FrameAnimation是顺序播放事先做好的图像,与电影类似。不同于animation package, AndroidSDK提供了另外一个类AnimationDrawable来定义、使用FrameAnimation。

Frame Animation可以在XMLResource定义(还是存放到res/anim文件夹下),也可以使用AnimationDrawable中的API定义。由于TweenAnimation与FrameAnimation有着很大的不同,因此XML定义的格式也完全不一样,其格式是:首先是animation-list根节点,animation-list根节点中包含多个item子节点,每个item节点定义一帧动画:当前帧的drawable资源和当前帧持续的时间。下面对节点的元素加以说明:

XML属性说明
drawable当前帧引用的drawable资源
duration当前帧显示的时间(毫秒为单位)
oneshot如果为true,表示动画只播放一次停止在最后一帧上,如果设置为false表示动画循环播放。
variablePaddingIf true, allows the drawable’s padding tochange based on the current state that is selected.
visible规定drawable的初始可见性,默认为flase;

下面就给个具体的XML例子,来定义一帧一帧的动画:


android:oneshot=”true”>


上面的XML就定义了一个FrameAnimation,其包含3帧动画,3帧动画中分别应用了drawable中的3张图片:rocket_thrust1,rocket_thrust2,rocket_thrust3,每帧动画持续200毫秒。

然后我们将以上XML保存在res/anim/文件夹下,命名为rocket_thrust.xml,显示动画的代码,如下:在OnCreate()中增加如下代码:


ImageView rocketImage = (ImageView)findViewById(R.id.rocket_image);


rocketImage.setBackgroundResource(R.anim.rocket_thrust);


rocketAnimation = (AnimationDrawable)rocketImage.getBackground();


最后还需要增加启动动画的代码:


public boolean onTouchEvent(MotionEvent event) {


if (event.getAction() == MotionEvent.ACTION_DOWN) {


rocketAnimation.start();


return true;

}

return super.onTouchEvent(event);
}

代码运行的结果想必大家应该就知道了(3张图片按照顺序的播放一次),不过有一点需要强调的是:启动FrameAnimation动画的代码rocketAnimation.start();不能在OnCreate()中,因为在OnCreate()中AnimationDrawable还没有完全的与ImageView绑定,在OnCreate()中启动动画,就只能看到第一张图片。
下面,阅读Android SDK中对AnimationDrawable的介绍,有个简单的了解:

AnimationDrawable

获取、设置动画的属性
int getDuration()获取动画的时长
int getNumberOfFrames()获取动画的帧数
boolean isOneShot()

Void setOneShot(boolean oneshot)

获取oneshot属性
设置oneshot属性
void inflate(Resurce r,XmlPullParserp,
AttributeSet attrs)
增加、获取帧动画
Drawable getFrame(int index)获取某帧的Drawable资源
void addFrame(Drawable frame,intduration)为当前动画增加帧(资源,持续时长)
动画控制
void start()开始动画
void run()外界不能直接掉调用,使用start()替代
boolean isRunning()当前动画是否在运行
void stop()停止当前动画

总结说明

Frame Animation的定义、使用比较简单,在这里已经详细介绍完了,更加深入的学习还是到AndroidSDK去仔细了解吧,在Android SDK中也包含很多这方面的例子程序。注:Frame Animation 的XML 文件中不定义 interpolator属性,因为定义它没有任何意义。

一、AnimationSet的具体使用方法

1.AnimationSet是Animation的子类;

2.一个AnimationSet包含了一系列的Animation;

3.针对AnimationSet设置一些Animation的常见属性(如startOffset,duration等),可以被包含在AnimationSet当中的Animation集成;

例:一个AnimationSet中有两个Animation,效果叠加

java代码:

AnimationSet animationSet = new AnimationSet(true);  AlphaAnimation alphaAnimation = new AlphaAnimation(1, 0);  RotateAnimation rotateAnimation = new RotateAnimation(0, 360,          Animation.RELATIVE_TO_SELF,0.5f,          Animation.RELATIVE_TO_SELF,0.5f);  rotateAnimation.setDuration(1000);  animationSet.addAnimation(rotateAnimation);   animationSet.addAnimation(alphaAnimation);  image.startAnimation(animationSet);  

二、Interpolator的具体使用方法

Interpolator定义了动画变化的速率,在Animations框架当中定义了一下几种Interpolator

AccelerateDecelerateInterpolator:在动画开始与结束的地方速率改变比较慢,在中间的时候速率快。

AccelerateInterpolator:在动画开始的地方速率改变比较慢,然后开始加速

CycleInterpolator:动画循环播放特定的次数,速率改变沿着正弦曲线

DecelerateInterpolator:在动画开始的地方速率改变比较慢,然后开始减速

LinearInterpolator:动画以均匀的速率改变

例在set标签上:

xml代码:

android:interpolator="@android:anim/accelerate_interpolator"  

如果一个set中包含了两种动画效果,要想这两种动画效果共享一个interpolator,可以在set标签上添加:

xml代码:

android:shareInterpolator="true"  
如果不想共享一个interpolator,则可以在alpha等标签上添加。

另以上方法是在xml上处理interpolator,如果是在代码上设置共享一个interpolator,则可以在AnimationSet设置interpolator,如果不设置共享一个interpolator则可以在alpha等的对象上面设置interpolator:

java代码:

animationSet.setInterpolator(newAccelerateInterpolator());

java代码:

alphaAnimation.setInterpolator(newAccelerateInterpolator());

三、Frame-By-Frame Animations的使用方法

Frame-By-Frame Animations是一帧一帧的格式显示动画效果。类似于电影胶片拍摄的手法。

例子程序:

多张图片展示一个人行走的动画。

Main.xml

xml代码:

  

爱华网本文地址 » http://www.413yy.cn/a/25101016/318635.html

更多阅读

转 隶书口诀浅解 隶书的结构技法口诀

隶书口诀浅解中国民间的隶书口诀浅解隶书,是源于篆书的书体,创始于秦代,盛行于汉代。今天所谈的是东汉隶书成熟期的字体,亦是我们通常使用的隶书。这种书体,既古体巧拙又规矩易认,既工整严谨又生动活泼,不仅有其艺术价值--在书法园地中一直

log4j配置详解转 log4j2 配置详解

一 最好与commons-logging一起用,why?1.标准接口,即使将来脱离了log4j也一样用2.简化了编码,减少耦合度:不需在代码中指定log4j配制文件位置,代码中不需要引用log4j的包3.基本所有框架都是这么用的。。。。。。(我相信群众)附加提供一下co

Android编译详解之lunch命令 android编译过程详解

Android的优势就在于其开源,手机和平板生产商可以根据自己的硬件进行个性定制自己的手机产品,如小米,LePhone,M9等,因此,在我们在对Android的源码进行定制的时候,很有必要了解下,Android的编译过程。如果你从来没有做过Android代码的编译,那

声明:《转 android-Animation详解 animation详解》为网友你懂她也懂分享!如侵犯到您的合法权益请联系我们删除