对于android的动画animation,个人认为还是非常重要的,这一部分,可以使您的应用动起来,用户的操作体验和使用乐趣明显的提高。
我这个Demo,主要是参考了网上的例子,写了一个小综合,对一些主要动画使用方式,做了一个说明。
1.总的效果图:
2.写在之前的话
本来在写之前,我进入了android官网,速度其慢,心里又一次骂了这个神奇的国度,虽然没有搜到animaition类的官方说明,但是惊喜的发现,官网的网站现在提供了中文,虽然翻译的一般般。大家也要记得,在日理万机后,还是要看看android官网,因为那上面的资料才是最权威的,没有之一。对于animation类的说明,也只有后补了。
3.Frame Animation(帧动画)
帧动画,您可以理解了放电影,顺序播放一组图片。这个动画最简单,但是也是比较笨,使用不灵活,特别是使用的图片多,比较占用资源。
使用方法如下:
private ImageView aniImageView = null;
private AnimationDrawable frameAnimationDraw = null;
private Animation animation = null;
aniImageView.setBackgroundResource(R.drawable.frame_animation);
frameAnimationDraw = (AnimationDrawable) aniImageView.getBackground();
frameAnimationDraw.start();
然后,我们在res/drawable目录下新建:frame_animation.xml文件
<?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/rotation_1" android:duration="200" />
<item android:drawable="@drawable/rotation_2" android:duration="200" />
<item android:drawable="@drawable/rotation_3" android:duration="200" />
<item android:drawable="@drawable/rotation_4" android:duration="200" />
<item android:drawable="@drawable/rotation_5" android:duration="200" />
</animation-list>
节点元素的说明:
XML属性 | 说明 |
drawable | 当前帧引用的drawable资源 |
duration | 当前帧显示的时间(毫秒为单位) |
oneshot | 如果为true,表示动画只播放一次停止在最后一帧上,如果设置为false表示动画循环播放。 |
variablePadding | If true, allows thedrawable’s padding to change based on the current state that is selected. |
visible | 规定drawable的初始可见性,默认为flase; |
AnimationDrawable说明:
AnimationDrawable | |
获取、设置动画的属性 |
|
int getDuration() | 获取动画的时长 |
int getNumberOfFrames() | 获取动画的帧数 |
boolean isOneShot() Void setOneShot(boolean oneshot) | 获取oneshot属性 |
void inflate(Resurce r,XmlPullParser p, |
|
增加、获取帧动画 | |
Drawable getFrame(int index) | 获取某帧的Drawable资源 |
void addFrame(Drawable frame,int duration) | 为当前动画增加帧(资源,持续时长) |
动画控制 | |
void start() | 开始动画 |
void run() | 外界不能直接掉调用,使用start()替代 |
boolean isRunning() | 当前动画是否在运行 |
void stop() | 停止当前动画 |
4.Tweened Animations:该类提供了旋转,移动,伸展,淡入淡出等效果
在这一部分,我们重点讲一讲是如何使用代码来实现这四个动画的。
4.1 AlphaAnimation----渐变透明度动画效果
animation = new AlphaAnimation(0.1f, 1.0f);
animation.setDuration(1000);
aniImageView.startAnimation(animation);
4.2 RotateAnimation----画面旋转动画效果
animation = new RotateAnimation(0, 360,
Animation.RELATIVE_TO_SELF, 0.5f,
Animation.RELATIVE_TO_SELF, 0.5f);
animation.setRepeatCount(2);
animation.setDuration(1000);
aniImageView.startAnimation(animation);
4.3 ScaleAnimation----渐变尺寸伸缩动画效果
animation = new ScaleAnimation(0.1f, 3.0f,0.1f,3.0f);
animation.setDuration(1000);
aniImageView.startAnimation(animation);
4.4 TranslateAnimation----画面转换位置移动动画效果
animation = new TranslateAnimation(0.1f, 300.0f,0.1f,300.0f);
animation.setDuration(1000);
aniImageView.startAnimation(animation);
Java代码中的通用属性:
setDuration(long durationMillis): 设置动画持续事件(单位:毫秒)
setFillAfter(boolean fillAfter): 如果fillAfter设为true,则动画执行后,控件将停留在动画结束的状态
setFillBefore(boolean fillBefore): 如果fillBefore设为true,则动画执行后,控件将回到动画开始的状态
setStartOffset(long startOffset): 设置动画执行之前等待的时间(单位:毫秒)
setRepeatCount(int repeatCount):设置动画重复的次数
setInterpolator(Interpolator i): 设置动画的变化速度
setInterpolator(new AccelerateDecelerateInterpolator()):先加速,后减速
setInterpolator(new AccelerateInterpolator()):加速
setInterpolator(new DecelerateInterpolator()):减速
setInterpolator(new CycleInterpolator()):动画循环播放特定次数,速率改变沿着正弦曲线
setInterpolator(new LinearInterpolator()):匀速
AccelerateDecelerateInterpolator | 在动画开始与介绍的地方速率改变比较慢,在中间的时候加速 |
AccelerateInterpolator | 在动画开始的地方速率改变比较慢,然后开始加速 |
CycleInterpolator | 动画循环播放特定的次数,速率改变沿着正弦曲线 |
DecelerateInterpolator | 在动画开始的地方速率改变比较慢,然后开始减速 |
LinearInterpolator | 在动画的以均匀的速率改变 |
5.我们使用XML文件的方式来实现Tweened Animations的四种动画效果。
5.1 XML中的通用属性:
android:duration: 设置动画持续事件(单位:毫秒)android:fillAfter: 如果fillAfter设为true,则动画执行后,控件将停留在动画结束的状态
android:fillBefore: 如果fillBefore设为true,则动画执行后,控件将回到动画开始的状态
android:startOffset(long startOffset): 设置动画执行之前等待的时间(单位:毫秒)
android:repeatCount(int repeatCount): 设置动画重复的次数
android:interpolator:设置动画的变化速度
android:interpolator="@android:anim/accelerate_decelerate_interpolator":先加速,后减速
android:interpolator="@android:anim/accelerate_interpolator":加速
android:interpolator="@android:anim/decelerate_interpolator":减速
android:interpolator="@android:anim/cycle_Interpolator":动画循环播放特定次数,速率改变沿着正弦曲线
android:interpolator="@android:anim/linear_Interpolator":匀速
表一 | ||
属性[类型] | 功能 |
|
Duration[long] | 属性为动画持续时间 | 时间以毫秒为单位 |
fillAfter [boolean] | 当设置为true,该动画转化在动画结束后被应用 | |
fillBefore[boolean] | 当设置为true,该动画转化在动画开始前被应用 | |
interpolator | 指定一个动画的插入器 | 有一些常见的插入器 |
repeatCount[int] | 动画的重复次数 |
|
repeatMode[String] | 定义重复的行为 | 1:"restart" 2:"reverse" eg: android:repeatMode="reverse" |
startOffset[long] | 动画之间的时间间隔,从上次动画停多少时间开始执行下个动画 | |
zAdjustment[int] | 定义动画的Z Order的改变 | 0:保持Z Order不变 |
5.2 AlphaAnimation
animation = AnimationUtils.loadAnimation(this, R.anim.alpha_anim);
aniImageView.startAnimation(animation);
在res/anim/alpha_anim.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
android:fromAlpha="0.1"
android:toAlpha="1.0"
android:repeatCount="2"
android:duration="2000"
/>
</set>
表二 | ||
XML节点 | 功能说明 | |
alpha | 渐变透明度动画效果 | |
<alpha | ||
fromAlpha | 属性为动画起始时透明度 | 0.0表示完全透明 |
toAlpha | 属性为动画结束时透明度 |
5.3 RotateAnimation
animation = AnimationUtils.loadAnimation(this, R.anim.rotate_anim);
aniImageView.startAnimation(animation);
在res/anim/rotate_anim.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<rotate
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromDegrees="0"
android:toDegrees="360"
android:pivotX="50%"
android:pivotY="50%"
android:repeatCount="4"
android:duration="500"
/>
</set>
表五 | |||
rotate | 画面转移旋转动画效果 | ||
<rotate | |||
fromDegrees | 为动画起始时物件的角度 | 说明 | |
toDegrees | 属性为动画结束时物件旋转的角度可以大于360度 | ||
pivotX | 为动画相对于物件的X、Y坐标的开始位 | 说明:以上两个属性值从0%-100%中取值 | |
|
|
|
|
5.4 ScaleAnimation
animation = AnimationUtils.loadAnimation(this, R.anim.scale_anim);
aniImageView.startAnimation(animation);
在res/anim/scale_anim.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromXScale="0.0"
android:toXScale="4.0"
android:fromYScale="0.0"
android:toYScale="4.0"
android:pivotX="50%"
android:pivotY="50%"
android:fillAfter="true"
android:duration="500"
/>
</set>
表三 | |||
scale | 渐变尺寸伸缩动画效果 | ||
<scale | |||
fromXScale[float] fromYScale[float] | 为动画起始时,X、Y坐标上的伸缩尺寸 | 0.0表示收缩到没有 | |
toXScale [float] | 为动画结束时,X、Y坐标上的伸缩尺寸 | ||
pivotX[float] | 为动画相对于物件的X、Y坐标的开始位置 | 属性值说明:从0%-100%中取值,50%为物件的X或Y方向坐标上的中点位置 | |
|
|
|
|
5.5 TranslateAnimation
animation = AnimationUtils.loadAnimation(this, R.anim.translate_anim);
aniImageView.startAnimation(animation);
在res/anim/translate_anim.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="10"
android:toXDelta="100"
android:fromYDelta="10%"
android:toYDelta="100%"
android:repeatCount="3"
android:duration="3000"
/>
</set>
表四 | |||
translate | 画面转换位置移动动画效果 | ||
<translate | |||
fromXDelta | 为动画、结束起始时 X坐标上的位置 |
| |
fromYDelta | 为动画、结束起始时 Y坐标上的位置 |
| |
|
|
|
|
6 AnimationSet---组合动画,几个动画同时播放。
AnimationSet set = new AnimationSet(true);
animation = new TranslateAnimation(0.1f, 100.0f,0.1f,100.0f);
set.addAnimation(animation);
animation = new AlphaAnimation(0.1f, 1.0f);
set.addAnimation(animation);
animation = new ScaleAnimation(0.1f, 2.0f,0.1f,2.0f);
set.addAnimation(animation);
animation = new RotateAnimation(0, 360,
Animation.RELATIVE_TO_SELF, 0.5f,
Animation.RELATIVE_TO_SELF, 0.5f);;
set.addAnimation(animation);
set.setDuration(1000);
aniImageView.startAnimation(set);
7.AnimationListener----动画接口,主要是监听动画播放前,动画播放中,动画结束后三个时刻的一些操作。
animation = AnimationUtils.loadAnimation(this, R.anim.translate_anim);
animation.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation arg0) {
// TODO Auto-generated method stub
aniTV.setVisibility(View.VISIBLE);
aniTV.setText("animation onAnimationStart");
}
@Override
public void onAnimationRepeat(Animation arg0) {
// TODO Auto-generated method stub
aniTV.setVisibility(View.VISIBLE);
aniTV.setText("animation onAnimationRepeat");
Log.i(TAG, "onAnimationRepeat");
}
@Override
public void onAnimationEnd(Animation arg0) {
// TODO Auto-generated method stub
aniTV.setVisibility(View.VISIBLE);
aniTV.setText("animation onAnimationEnd");
}
});
animation.setRepeatCount(5);
aniImageView.startAnimation(animation);
8.startActivity的动画:
startActivity(new Intent(this, MainActivity.class));
overridePendingTransition(R.anim.slide_in_right,R.anim.slide_out_left);
finish();
slide_in_right.xml
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator"
android:fromXDelta="100%"
android:toXDelta="0"
android:duration="500" />
slide_out_left.xml
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator"
android:fromXDelta="0"
android:toXDelta="-100%"
android:duration="500" />
9.android:layoutAnimation动画效果----这个主要是对ListView,GridView的item设置动画。
<ListView
android:id="@+id/listView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:scrollbars="vertical"
android:layoutAnimation="@anim/list_anim_layout"
/>
list_anim_layout.xml
<layoutAnimation
xmlns:android="http://schemas.android.com/apk/res/android"
android:delay="0.5"
android:animationOrder="normal"
android:animation="@anim/slide_in_right"/>
这个详细可以参考:
ListView,GridView之LayoutAnimation特殊动画的实现
http://gundumw100.iteye.com/blog/1874545
10.Demo代码下载地址:
http://download.csdn.net/detail/hfreeman2008/7887365
11.参考资料:
1.http://blog.csdn.net/feng88724/article/details/6320507
2.http://blog.csdn.net/feng88724/article/details/6318430