android开发笔记之animation(一)

     对于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表示动画循环播放。
variablePaddingIf 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属性
设置oneshot属性

void inflate(Resurce r,XmlPullParser p,
AttributeSet attrs)

 

增加、获取帧动画

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

指定一个动画的插入器

有一些常见的插入器
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
:保持在最下层


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
android:fromAlpha=”0.1″
android:toAlpha=”1.0″
android:duration=”3000″ />

fromAlpha

属性为动画起始时透明度

0.0表示完全透明
1.0
表示完全不透明
以上值取0.0-1.0之间的float数据类型的数字

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
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

为动画相对于物件的XY坐标的开始位

说明:以上两个属性值0%-100%中取值
50%
为物件的XY方向坐标上的中点位置

 

 

 

 


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
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]

为动画起始时,XY坐标上的伸缩尺寸

0.0表示收缩到没有
1.0
表示正常无伸缩
值小于1.0表示收缩
值大于1.0表示放大

toXScale [float]
toYScale[float]

为动画结束时,XY坐标上的伸缩尺寸

pivotX[float]
pivotY[float]

为动画相对于物件的XY坐标的开始位置

属性值说明:从0%-100%中取值,50%为物件的XY方向坐标上的中点位置

 

 

 

 


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
android:fromXDelta=”30″
android:toXDelta=”-80″
android:fromYDelta=”30″
android:toYDelta=”300″
android:duration=”2000″ />

fromXDelta
toXDelta

为动画、结束起始时 X坐标上的位置

 

fromYDelta
toYDelta

为动画、结束起始时 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

3.http://blog.csdn.net/tianjf0514/article/details/7566304

4.http://blog.csdn.net/liyide381/article/details/8532726

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hfreeman2008

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值