|
Android 之AnimationDrawable
AnimationDrawable是Android实现动画的一种简单的形式。这里用一个Demo来简单讲解下。
首先最基本的,我们可以参见DOC上的说明,它的资料最正宗!强烈建议大家要去官网的文档上搜索下,然后认真看看,对学英语都是有好处的,当然,学英语不是主要目的。
下面摘抄了主要的文字部分。
Class Overview
An object used to create frame-by-frame animations, defined by a series of Drawable objects, which can be used as a View object's background.
The simplest way to create a frame-by-frame animation is to define the animation in an XML file, placed in the res/drawable/ folder, and set it as the background to a View object. Then, call run() to start the animation.
An AnimationDrawable defined in XML consists of a single
<animation-list>
element, and a series of nested<item>
tags. Each item defines a frame of the animation. See the example below.
spin_animation.xml file in res/drawable/ folder:
<!-- Animation frames are wheel0.png -- wheel5.png files inside the res/drawable/ folder -->
<animation-list android:id = "selected" androidneshot = "false" >
<item android:drawable = "@drawable/wheel0" android:duration = "50" />
<item android:drawable = "@drawable/wheel1" android:duration = "50" />
<item android:drawable = "@drawable/wheel2" android:duration = "50" />
<item android:drawable = "@drawable/wheel3" android:duration = "50" />
<item android:drawable = "@drawable/wheel4" android:duration = "50" />
<item android:drawable = "@drawable/wheel5" android:duration = "50" />
</animation-list>
Here is the code to load and play this animation.
// Load the ImageView that will host the animation and
// set its background to our AnimationDrawable XML resource.
ImageView img = (ImageView)findViewById (R.id.spinning_wheel_image);
img.setBackgroundResource(R.drawable.spin_animation);
// Get the background, which has been compiled to an AnimationDrawable object.
AnimationDrawable frameAnimation=(AnimationDrawable)img.getBackground();
// Start the animation (looped playback by default).
frameAnimation.start();
以上的资料大家也可以在DOC中看的很明白。
下面我以几个DEMO来做测试,具体说明大家见我里面的说明,我作了很多注释,方便大家阅读。
Android播放gif动画 (MainActivity中第一种方式的代码文字说明)
Android不支持直接播放gif动能,如果在程序中将gif分解,然后播放各个图片这个会很消耗内存,因此我们要提前将动画分解,将其放入资源文件中。
1.在drawable新建xml文件,battery_anim.xml,内容:
<animation-list android:oneshot="false"
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:duration="150" android:drawable="@drawable/battery_anim0" />
<item android:duration="150" android:drawable="@drawable/battery_anim1" />
<item android:duration="150" android:drawable="@drawable/battery_anim2" />
<item android:duration="150" android:drawable="@drawable/battery_anim3" />
<item android:duration="150" android:drawable="@drawable/battery_anim4" />
<item android:duration="150" android:drawable="@drawable/battery_anim5" />
</animation-list>
对应的item 为顺序的图片从开始到结束,duration为每张逐帧播放间隔,oneshot 为false 代表循环播放,设置为true 即播放一次即停止。
2.在main.xml文件中插入ImageView控件代码如下:
<ImageView android:visibility="visible"
android:layout_width="wrap_content"
android:layout_marginTop="100dip" android:layout_centerHorizontal="true"
android:layout_height="wrap_content"
android:background="@drawable/battery_anim"
android:id="@+id/batteryStatus"></ImageView>
3.java代码如下:
ImageView imageView = null;
AnimationDrawable anim = null;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
imageView = (ImageView) findViewById(R.id.ImageView01);
Button mybtn = (Button) findViewById(R.id.Button01);
mybtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method
AnimationDrawable anim = new AnimationDrawable();
Object ob = imageView.getBackground();
anim = (AnimationDrawable) ob;
anim.stop();
anim.start();
}
});
}
4.效果展示:如果程序运行所示。
MainActivity中第二种方式的代码说明:
如果需要一打开就动画显示://mHandler.postDelayed(mRunnable, START_DELAY);
这句话的意思是开启一个线程,开始执行操作。
MainActivity中第三种方式的代码说明:
使用JAVA代码的方式对一些参数做设定:前面的例子都是在XML文件中设置一些参数,在这里,我们用代码去设定一些参数。个人认为还是在XML文件中设定会方便,但是用代码的方式会具有可扩展性。【这个具体的代码我还没有实现,等我解决了会修改这篇文章,请关注】
//实例化AnimationDrawable对象
frameAnimation = new AnimationDrawable();
//装载资源
for(int i = 1; i <= 15; i++){
intid=getResources().getIdentifier("a"+i,"drawable", mContext.getPackageName());
Drawable mBitAnimation = getResources().getDrawable(id);
//参数mBitAnimation是该帧的图片
//参数500是该帧显示的时间,按毫秒计算
frameAnimation.addFrame(mBitAnimation, 500);
}
/*上边用到了Resources的getIdentifier方法
方法返回一个资源的唯一标识符,如果没有这个资源就返回0
* 0不是有效的标识符,在说说这个方法几个参数的含义
* 第一个
就是我们的资源名称了。
* 第二个
就是我们要去哪里找我们的资源
我们的图片在drawable 下
所以为drawable
* 第三个
我们用了Context的getPackageName返回应用程序的包名
* */
//设置播放模式是否循环播放,false表示循环,true表示不循环
frameAnimation.setOneShot(false);
//开始播放动画
frameAnimation.start();
备注:这篇只是最基础的东西,大家先简单了解一下,明天我会继续写下一篇,敬请关注!
下面是代码,大家还是自己跑一遍比较好。
AnimTest.rar (147.33 KB, 下载次数: 4) |
|