android之动画(一)通过AnimationDrawable控制逐帧动画


android与逐帧动画:

效果图:

当我们点击按钮时,该图片会不停的旋转,当再次点击按钮时,会停止在当前的状态。

 

activity代码:

[java]  view plain copy
  1. package cn.com.chenzheng_java.animation;  
  2.   
  3. import android.app.Activity;  
  4. import android.graphics.drawable.AnimationDrawable;  
  5. import android.os.Bundle;  
  6. import android.view.View;  
  7. import android.widget.ImageView;  
  8. /** 
  9.  * @description android中的逐帧动画. 
  10.  * 逐帧动画的原理很简单,跟电影的播放一样,一张张类似的图片不停的切换,当切换速度达到一定值时, 
  11.  * 我们的视觉就会出现残影,残影的出现保证了视觉上变化的连续性,这时候图片的切换看在我们眼中就跟真实的一样了。 
  12.  * 想使用逐帧动画: 
  13.  * 第一步:需要在res/drawable文件夹下新建一个xml文件,该文件详细定义了动画播放时所用的图片、切换每张图片 
  14.  *        所用的时间、是否为连续播放等等。(有些文章说,在res/anim文件夹下放置该文件,事实证明,会出错哦) 
  15.  * 第二步:在代码中,将该动画布局文件,赋值给特定的图片展示控件,如本例子中的ImageView。 
  16.  * 第三步:通过imageView.getBackGround()获取相应的AnimationDrawable对象,然后通过该对象的方法进行控制动画 
  17.  * @author chenzheng_java 
  18.  * 
  19.  */  
  20. public class Animation1Activity extends Activity {  
  21.     ImageView imageView ;  
  22.     @Override  
  23.     public void onCreate(Bundle savedInstanceState) {  
  24.         super.onCreate(savedInstanceState);  
  25.         setContentView(R.layout.animation1);  
  26.           
  27.         imageView = (ImageView) findViewById(R.id.imageView_animation1);  
  28.         imageView.setBackgroundResource(R.drawable.animation1_drawable);  
  29.           
  30.     }  
  31.       
  32.       
  33.     public void myClickHandler(View targetButton){  
  34.         // 获取AnimationDrawable对象  
  35.         AnimationDrawable animationDrawable = (AnimationDrawable)imageView.getBackground();  
  36.           
  37.         // 动画是否正在运行  
  38.         if(animationDrawable.isRunning()){  
  39.             //停止动画播放  
  40.             animationDrawable.stop();  
  41.         }  
  42.         else{  
  43.             //开始或者继续动画播放  
  44.             animationDrawable.start();  
  45.         }  
  46.           
  47.           
  48.     }  
  49. }  

 

animation1.xml文件:

[xhtml]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent" android:layout_height="match_parent"  
  4.     android:orientation="vertical">  
  5.     <Button  android:id="@+id/button_animation1" android:text="动画开始"  
  6.         android:layout_gravity="center_horizontal" android:layout_width="wrap_content"  
  7.         android:layout_height="wrap_content" android:onClick="myClickHandler"></Button>  
  8.     <ImageView android:id="@+id/imageView_animation1"  
  9.         android:layout_width="fill_parent"   
  10.         android:layout_height="wrap_content" android:layout_weight="1"></ImageView>  
  11. </LinearLayout>  

存放动画文件的xml文件:

[xhtml]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <!--   
  3.     根标签为animation-list,其中oneshot代表着是否只展示一遍,设置为false会不停的循环播放动画  
  4.     根标签下,通过item标签对动画中的每一个图片进行声明  
  5.     android:duration 表示展示所用的该图片的时间长度  
  6.  -->  
  7. <animation-list  
  8.   xmlns:android="http://schemas.android.com/apk/res/android"  
  9.   android:oneshot="false"  
  10.   >  
  11.     <item android:drawable="@drawable/a1" android:duration="50"></item>  
  12.     <item android:drawable="@drawable/a2" android:duration="50"></item>  
  13.     <item android:drawable="@drawable/a3" android:duration="50"></item>  
  14.     <item android:drawable="@drawable/a4" android:duration="50"></item>  
  15.     <item android:drawable="@drawable/a5" android:duration="50"></item>  
  16.     <item android:drawable="@drawable/a6" android:duration="50"></item>  
  17. </animation-list>  

除此之外:在AnimationDrawable中,我们还可以看到如下的几个重要方法:

setOneShot(boolean flag) 和在配置文件中进行配置一样,可以设置动画是否播放一次,false为连续播放;

addFrame (Drawable frame, int duration) 动态的添加一个图片进入该动画中


 

android之动画(二)通过动画布局声明文件和关联文件为容器布局----布局动画


先上图:

当然,在这里你是无法看到动态的动画效果的,当然如果你将笔者的代码运行,自然是可以看到动画效果的。这里的效果是说,当我们的list中的每一项最终显示为上图中的样子前展示给我们的动画效果。

让我们看看activity代码:

[java]  view plain copy
  1. package cn.com.chenzheng_java.animation;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.widget.ArrayAdapter;  
  6. import android.widget.ListView;  
  7. /** 
  8.  * @description 布局动画 
  9.  * 何谓布局动画:将容器内的视图制作成动画,它是补间动画的一种。当 
  10.  * 前的例子中,我们要将listView容器中的内容做成动画 
  11.  * @author chenzheng_java 
  12.  * @since 2011/03/24 
  13.  */  
  14. public class Animation2Activity extends Activity{  
  15.     ListView listView;  
  16.     String[]city = new String[]{  
  17.             "中关村",  
  18.             "海淀剧院",  
  19.             "海淀医院",  
  20.             "人民大学"  
  21.     };  
  22.       
  23.       
  24. @Override  
  25. protected void onCreate(Bundle savedInstanceState) {  
  26.     super.onCreate(savedInstanceState);  
  27.     setContentView(R.layout.animation2);  
  28.     listView = (ListView) findViewById(R.id.listView_animation2);  
  29.     ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, city);  
  30.     listView.setAdapter(adapter);  
  31. }  
  32.   
  33.   
  34. }  

animation2.xml布局文件:

 

[xhtml]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent" android:layout_height="fill_parent"  
  4.     android:orientation="vertical">  
  5.     <ListView android:layout_width="fill_parent"   
  6.     android:id="@+id/listView_animation2"  
  7.     android:persistentDrawingCache="animation|scrolling"  
  8.     android:layoutAnimation="@anim/animation2_drawable"  
  9.     android:layout_height="wrap_content"></ListView>  
  10. </LinearLayout>  
  11. <!--   
  12.     我们可以看到,在ListView的布局设置中,我们设置了两个和动画相关的属性:  
  13.     android:persistentDrawingCache:该属性建议进行设置,它会对动画和滚动效果进行优化。  
  14.     android:layoutAnimation:当前布局容器所对应的动画关联文件,注意,这里指定的是动画关联文件,而并非动画声明文件  
  15.  -->  

动画声明文件:

scale_anim.xml

[xhtml]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <set xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:interpolator="@android:anim/accelerate_interpolator">  
  4.     <scale  
  5.     android:fromXScale="1"   
  6.     android:toXScale="1"  
  7.     android:fromYScale="0.1"   
  8.     android:toYScale="1.0"   
  9.     android:duration="1000"  
  10.     android:pivotX="50%"  
  11.     android:pivotY="50%"   
  12.     android:startOffset="100">  
  13.     </scale>  
  14.   
  15. </set>  
  16. <!--   
  17.     动画声明文件     该文件位于res/anim文件夹下  
  18.     对动画的具体行为进行定义:  
  19.     android:fromXScale="1"   
  20.     android:toXScale="1"指定了在X轴上,不进行缩放  
  21.       
  22.     android:fromYScale="0.1"   
  23.     android:toYScale="1.0" 指定了再Y轴上,从十分之一开始方法,一直放大到正常大小  
  24.       
  25.     android:duration="1000"动画展示的时间  
  26.       
  27.     android:pivotX="50%"  
  28.     android:pivotY="50%" 在动画执行的中间点,对象的大小在X/Y轴上都是50%  
  29.       
  30.     android:startOffset="100" 改动画执行之前等待的毫秒数  
  31.  -->  

动画关联文件:

animation2_drawable.xml

[xhtml]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:delay="30%"  
  4.     android:animationOrder="reverse"  
  5.     android:animation="@anim/scale_anim"  
  6. >  
  7. </layoutAnimation>  
  8.   
  9. <!-- 动画关联文件      该文件位于res/anim文件夹下  
  10.     该文件是容器和动画声明文件的中间媒介,它绑定到了一个动画声明文件,  
  11.     并且对该动画的一些播放属性进行了设置,例如这里的  
  12.     android:delay 每一项动画应该在延迟动画总时间的30%开始执行(当前列表有多个动画时使用),  
  13.                 延迟动画总时间对应着动画声明文件中android:startOffset的总和  
  14.     android:animationOrder:列表中的动画的执行顺序(当前列表有多个动画时使用)  
  15.     android:animation 指定了动画声明文件  
  16.  -->  

 

代码中的注释已经说得很明白了,我就不多说了。我们这里需要注意的是,布局文件中,动画声明文件和动画关联文件的位置都是在res/anim文件夹下哦。

-----------------------------------------------------------------------------------------------

上面只是展示了一个缩放动画,那么常见的动画还有那些呢?

[xhtml]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <set xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:interpolator="@android:anim/accelerate_interpolator">  
  4.     <!-- rotate旋转动画,围绕着文本的中心旋转一圈 -->  
  5.     <rotate  
  6.         android:fromDegrees="0.0"  
  7.         android:toDegrees="360"  
  8.         android:pivotY="50%"  
  9.         android:pivotX="50%"  
  10.         android:duration="5000"  
  11.     ></rotate>  
  12.     <!-- translate代表着移动动画,改动画将文本从当前所分配的显示空间的顶部移动到底部 -->  
  13.     <translate   
  14.         android:fromYDelta="-100%"  
  15.         android:toYDelta="0"  
  16.         android:duration="10000"  
  17.     ></translate>  
  18.     <!-- alpha代表着可见度渐变动画,从不可见,变为完全可见 -->  
  19.     <alpha  
  20.         android:fromAlpha="0.0"  
  21.         android:toAlpha="1.0"  
  22.         android:duration="3000"  
  23.     ></alpha>  
  24. </set>  

在这里,我们可以看到,无论是哪个动画声明文件中,都有这么一行代码:

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

那么,这行代码到底是干什么用的呢?

这东西,我们在android中叫做插值器。它告诉系统我们的动画的实现细节,例如一个颜色随着时间的变化而变化时,是按照线性变换,还是指数变换?还是开始的时候很快,后边渐渐地开始变慢呢?

我们都知道,@android方式代表着,这里引用的是android系统提供的一个xml布局文件。实际上,这个布局文件是android.view.animation下一个类的映射。这一类的类主要有:

AccelerateDecelerateInterpolator

AccelrateInterpolator

CycleInterpolator

LinearInterpolator



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值