对于android的动画animation,个人认为还是非常重要的,这一部分,可以使您的应用动起来,用户的操作体验和使用乐趣明显的提高。
我这个Demo,主要是参考了网上的例子,写了一个小综合,对一些主要动画使用方式,做了一个说明。
本来在写之前,我进入了android官网,速度其慢,心里又一次骂了这个神奇的国度,虽然没有搜到animaition类的官方说明,但是惊喜的发现,官网的网站现在提供了中文,虽然翻译的一般般。大家也要记得,在日理万机后,还是要看看android官网,因为那上面的资料才是最权威的,没有之一。对于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();
<?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() |
停止当前动画 |
在这一部分,我们重点讲一讲是如何使用代码来实现这四个动画的。
animation = new AlphaAnimation(0.1f, 1.0f); animation.setDuration(1000); aniImageView.startAnimation(animation);
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);
animation = new ScaleAnimation(0.1f, 3.0f,0.1f,3.0f); animation.setDuration(1000); aniImageView.startAnimation(animation);
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 |
在动画的以均匀的速率改变 |
表一 |
||
属性[类型] |
功能 |
|
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不变 |
animation = AnimationUtils.loadAnimation(this, R.anim.alpha_anim); aniImageView.startAnimation(animation);
<?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 |
属性为动画结束时透明度 |
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%中取值 |
|
|
|
|
|
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方向坐标上的中点位置 |
|
|
|
|
|
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坐标上的位置 |
|
|
|
|
|
|
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);
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);
startActivity(new Intent(this, MainActivity.class)); overridePendingTransition(R.anim.slide_in_right,R.anim.slide_out_left); finish();
<?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" />
<?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" />
<ListView android:id="@+id/listView" android:layout_width="fill_parent" android:layout_height="wrap_content" android:scrollbars="vertical" android:layoutAnimation="@anim/list_anim_layout" />
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android" android:delay="0.5" android:animationOrder="normal" android:animation="@anim/slide_in_right"/>
这个详细可以参考:
http://gundumw100.iteye.com/blog/1874545
http://download.csdn.net/detail/hfreeman2008/7887365
1.http://blog.csdn.net/feng88724/article/details/6320507
2.http://blog.csdn.net/feng88724/article/details/6318430
3.http://blog.csdn.net/tianjf0514/article/details/7566304
4.http://blog.csdn.net/liyide381/article/details/8532726