Android中的动画学习

Animation概述

Android中动画主要分为四种:补间动画(Tween Animation)、帧动画(Frame Animation)、布局动画(Layout Animation )、属性动画(Property Animation)。

Tween Animation(补间动画)

补间动画又分为四种,分别是Alpha(渐变透明度动画)、Scale(渐变尺寸缩放动画)、Translate(位置移动动画)、Rotate(旋转动画),补间动画文件需要放在res\anim目录中。

补间动画的共同属性

(1)Duration:动画持续时间(单位:毫秒)
(2)fillAfter:设置为true,动画转化在动画结束被应用
(3)fillBefore:设置为true,动画转化在动画开始前被应用
(4)interpolator:动画插入器(加速、减速插入器)
(5)repeatCount:动画重复次数
(6)repateMode:顺序重复/倒序重复
(7)startOffset:动画之间的时间间隔

Animation实现方式

(1)配置文件(/res/anim)—alpha,scale,translate,rotate
(2)Java代码实现—AlphaAnimation,ScaleAnimation,TranslateAnimation,RotateAnimation
例如:Java代码创建
//创建Alpha动画
Animation alpha=new AlphaAnimation(0.1f,1.0f);//透明度10%-100%
//设置动画时间为5秒
alpha.setDuration(5000);
//开始播放
img.startAnimation(alpha);
加载配置文件
Animation  scale=AnimationUtils.loadAnimation(MainActivity.this,R.anim.scale_anim);
//开始播放
img.startAnimation(scale);

AlphaAnimation(透明度动画)

(1)fromAlpha:动画起始时透明度
(2)toAlpha:动画终止时的透明度
(3)duration:持续时间

注意:0.0表示完全透明,1.0表示完全不透明

xml的实现

<alpha
    android:duration="1000"
    android:fromAlpha="0.1"
    android:toAlpha="1.0" >
</alpha>

在Activity的调用

loadAnimation = AnimationUtils.loadAnimation(this, R.anim.alpha);
image.startAnimation(loadAnimation);

通过java代码实现透明度动画,可以创建android.view.animation.AlphaAnimation对象,设置起始透明度(fromAlpha)和结束透明度(toAlpha)。定义方法如下:

AlphaAnimation alphaAnimation=new AlphaAnimation(float fromAlpha,float toAlpha);

ScaleAnimation(缩放动画)

(1) fromXScale,toXScale分别是起始和结束时x坐标上的伸缩尺寸
(2) fromYScale,toYScale分别是起始和结束时y坐标上的伸缩尺寸

(3) pivotX:表示沿X轴方向缩放的支点位置。如果该属性值为50%,则支点在沿X轴的中心位置
(4) pivotY:表示沿Y轴方向缩放的支点位置。如果该属性值为50%,则支点在沿Y轴的中心位置

注意:android的坐标系是从左上角开始,即左上角为原点(0,0),向右为x正方向(x增大),向下为y正方向(y增大)

xml的实现

<scale
    android:duration="2000"
    android:fillAfter="false"
    android:fromXScale="0.0"
    android:fromYScale="0.0"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:pivotX="50%"
    android:pivotY="50%"
    android:toXScale="1.0"
    android:toYScale="1.0" />

在Activity的调用

loadAnimation = AnimationUtils.loadAnimation(this, R.anim.scale);
image.startAnimation(loadAnimation);

通过java代码实现透明度动画,可以创建android.view.animation.ScaleAnimation对象。定义方法如下:

ScaleAnimation scaleAnimation=new ScaleAnimation(float fromX,float toX,float fromY,float toY,float pivotX,float pivotY);

TranslateAnimation(位移动画)

(1)fromXDelta,fromYDelta分别是起始时X、Y的坐标
(2)toXDelta,toYDelta分别是结束时X、Y的坐标

(3)interpolator表示动画渲染器。通过android:interpolator属性可以设置3个动画渲染器:accelerate_interpolator(动画加速器,使动画在开始的时候速度最慢,然后逐渐加速),decelerate_interpolator(动画减速器,使动画在开始的时候速度最快,然后逐渐减速.),accelerate_decelerate_interpolator(动画加速减速器,使动画在开始和结束的速度最慢,但在前半部分时开始加速,在后半部分时开始减速)

xml实现

<translate
    android:duration="1000"
    android:fromXDelta="10"
    android:fromYDelta="10"
    android:toXDelta="100"
    android:toYDelta="100" />

Activity的调用

loadAnimation = AnimationUtils.loadAnimation(this, R.anim.translate);
image.startAnimation(loadAnimation);

通过java代码实现位移动画,可以创建android.view.animation.TranslateAnimation对象,设置起始位置和结束位置。定义方法如下:

TranslateAnimation translateAnimation=new TranslateAnimation(float fromXDelta,float toXDelta,float fromYDelta,float toYDelta);

RotateAnimation(旋转动画)

(1) fromDegrees 起始的角度
(2) toDegrees 终止的角度
(3) pivotX、pivotY分别为旋转动画相对于x,y的坐标开始位置
(4) repeatCount设置旋转的次数,需要整数值。如果该值为0,表示不重复显示动画。如果属性值大于0,会再次显示该属性指定的次数。如果想要不停的旋转,可以将android:repeatCount属性值设为infinite或-1。该属性的默认值是0.
(5) repeatMode:设置重复的模式,默认值是restart。该属性只有当android:repeatCount设置成大于0的数或infinite时才起作用。android:repeatMode属性值除了可以是restart外,还可以设为reverse。

xml的调用

<rotate
    android:duration="1000"
    android:fromDegrees="0"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:pivotX="50%"
    android:pivotY="50%"
    android:toDegrees="-360" />

Activity的调用

loadAnimation = AnimationUtils.loadAnimation(this, R.anim.rotate);
image.startAnimation(loadAnimation);

通过java代码实现旋转动画,可以创建android.view.animation.RotateAnimation对象,设置旋转开始角度(fromDegrees)、旋转结束角度(toDegrees)、旋转支点横坐标(pivotX)、旋转支点纵坐标(pivotY)。定义方法如下:

RotateAnimation rotateAnimation=new RotateAnimation(float fromDegrees,float toDegrees,float pivotX,float pivotY);

多个动画是可以组合使用的

<scale
      android:duration="1000"
      android:fromXScale="0.1"
      android:fromYScale="0.1"
      android:pivotX="50%"
      android:pivotY="50%"
      android:toXScale="1.0"
      android:toYScale="1.0" />
<alpha
      android:duration="1000"
      android:fromAlpha="0"
      android:toAlpha="1.0" />

Layout Animation(布局动画)

LayoutAnimation可以用来为ViewGroups添加动画,并按照预定的顺序,把一个动画(或者动画集合)应用到ViewGroup中的每一个View中。可以使用LayoutAnimationController来指定一个应用到ViewGroup中的每一个子View中的动画。

例如:在listview中添加布局动画,动态添加

listView=(ListView) findViewById(R.id.listView);
List<String>list=new ArrayList<String>();
for(int i=0;i<20;i++)
{
   list.add("动画"+i);
}
ArrayAdapter<String>adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list);
   listView.setAdapter(adapter);
   LayoutAnimationController lac=new LayoutAnimationController(AnimationUtils.loadAnimation(this, R.anim.zoom_in));
   lac.setOrder(LayoutAnimationController.ORDER_NORMAL);
   listView.setLayoutAnimation(lac);
   listView.startLayoutAnimation();

FrameAnimation(逐帧动画)

使用animation-list标签来分组一个item标签集合,定义要显示的图片,指定显示它的时间(以毫秒为单位)。

其中<animation-list> 标签的一个关键属性是android:oneshot,如果该属性值为true,表示帧动画只运行一遍,也就是从第一个图像切换到最后一个图像后,动画就会停止。如果该属性值为false,表示帧动画循环播放。android:oneshot是可选属性,默认值是false。

<item>标签的android:drawable属性指定了动画中的静态图像资源ID。帧动画的播放顺序就是<item>标签的定义顺序。android:duration指定了每个图像的停留时间。

创建XML文件要放在/res/drawable/目录下,必须以animation-list为根元素。

AnimationDrawable类中与帧动画相关的方法:

(1)start:开始播放帧动画

(2)stop:停止播放帧动画

(3)setOneShot:设置是否只播放一遍帧动画(和<animation-list> 标签的中android:oneshot的属性一样)

(4)addFrame:向AnimationDrawable对象添加新的帧。该方法有两个参数,第一个参数是一个Drawable对象,表示添加的帧。该参数值可以是静态图像,也可以是另一个动画。第二个参数是表示新添加帧的停留时间。

(5)isOneShot:判断当前帧动画是否只播放一遍。该方法返回通过setOneShot方法或者android:oneshot设置的值

(6)isRunning:判断当前帧动画是否正在播放

(7)getNumberOfFrames:返回动画的帧数。也就是<animation-list> 标签的中<item>标签数

(8)getFrame:根据帧索引获得指定帧的Drawable对象,帧从0开始

(9)getDuration:获得指定帧的停留时间

xml实现

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

    <item
        android:drawable="@drawable/one"
        android:duration="500"/>
    <item
        android:drawable="@drawable/two"
        android:duration="500"/>
    <item
        android:drawable="@drawable/three"
        android:duration="500"/>
    <item
        android:drawable="@drawable/four"
        android:duration="500"/>
    <item
        android:drawable="@drawable/five"
        android:duration="500"/>
    <item
        android:drawable="@drawable/six"
        android:duration="500"/>

</animation-list>

编写完xml完之后,需要装载动画文件,并创建AnimationDrawable对象。AnimationDrawable是Drawable的子类,并在Drawable的基础上提供了控制动画的功能。

Activity实现

image.setImageResource(R.drawable.anim_list);
AnimationDrawable anim = (AnimationDrawable) image.getDrawable();
anim.start();

废话不说,具体看下面的例子吧

https://github.com/kongkongdaren/AnimationDemo

猜你喜欢

转载自blog.csdn.net/wen_haha/article/details/80682675