Android 编程下 AnimationDrawable (动画)的实现
2016-03-09 14:23
537 查看
Drawable Animation 可以让我们按顺序加载一系列的资源来创建一个动画。动画的创建和传统意义上电影胶卷的播放一样,是通过加载不同的图片,然后按顺序进行播放来实现的。在代 码的实现上 AnimationDrawable 类是基于 Drawable animations 来实现的。
虽然我们可以通过 AnimationDrawable 类的 API 在代码中定义一个动画的所有帧,但通过一个包含所有帧的
XMl 文件来完成一个动画会更加的简单。这个 XML 文件应该被创建在 Android 项目的 /res/drawable/ 目录下,这样动画内的每一帧就会按照顺序和固定的时间间隔来播放。
这个 XML 文件包含一个 <animation-list> 节点作为根节点,同时包含一系列定义了每一帧显示资源和显示时间的 <item> 节点作为子节点。代码如下:
通过上面的代码我们可以看到,这个动画包含 4 帧。另外我们可以通过设置 </animation-list> 节点下的 android:oneshot 属性来控制动画的循环次数,如果将 android:oneshot 的属性设置为
true,那么这个动画只会循环一次并停留在最后一帧。如果设置为 false,那么这个动画将会不停的循环下去。将这个文件命名文 scan.xml 并保存到项目的 /res/drawable/
目录下,然后它就可以当作背景图片被添加到另一个视图上,并被调用显示。参见如下代码:
代码运行效果如下:
此外,需要特别注意的是,动画的 start() 方法不能在 Activity 的 onCreate(Bundle savedInstanceState) 方法中执行,这是因为动画还没有完全的填充到窗口上。如果你想立即执行动画而不需要和用户进行交互,那么你可以在
Activity 的 onWindowFocusChanged() 方法中来调用 start() 方法。这样当你的应用在获得窗口焦点的时候 start()
就会马上被调用。代码如下:
虽然我们可以通过 AnimationDrawable 类的 API 在代码中定义一个动画的所有帧,但通过一个包含所有帧的
XMl 文件来完成一个动画会更加的简单。这个 XML 文件应该被创建在 Android 项目的 /res/drawable/ 目录下,这样动画内的每一帧就会按照顺序和固定的时间间隔来播放。
这个 XML 文件包含一个 <animation-list> 节点作为根节点,同时包含一系列定义了每一帧显示资源和显示时间的 <item> 节点作为子节点。代码如下:
<?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="true"> <item android:drawable="@drawable/scan1" android:duration="100" /> <item android:drawable="@drawable/scan2" android:duration="100" /> <item android:drawable="@drawable/scan3" android:duration="100" /> <item android:drawable="@drawable/scan4" android:duration="100" /> </animation-list>
通过上面的代码我们可以看到,这个动画包含 4 帧。另外我们可以通过设置 </animation-list> 节点下的 android:oneshot 属性来控制动画的循环次数,如果将 android:oneshot 的属性设置为
true,那么这个动画只会循环一次并停留在最后一帧。如果设置为 false,那么这个动画将会不停的循环下去。将这个文件命名文 scan.xml 并保存到项目的 /res/drawable/
目录下,然后它就可以当作背景图片被添加到另一个视图上,并被调用显示。参见如下代码:
package cn.sunzn.scan; import android.app.Activity; import android.graphics.drawable.AnimationDrawable; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.widget.ImageView; public class MainActivity extends Activity { private ImageView scanView; private AnimationDrawable scanAnimation; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); scanView = (ImageView) findViewById(R.id.iv_scan); scanView.setBackgroundResource(R.drawable.scan); scanAnimation = (AnimationDrawable) scanView.getBackground(); } public void start(View view) { scanAnimation.start(); } public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } }
代码运行效果如下:
此外,需要特别注意的是,动画的 start() 方法不能在 Activity 的 onCreate(Bundle savedInstanceState) 方法中执行,这是因为动画还没有完全的填充到窗口上。如果你想立即执行动画而不需要和用户进行交互,那么你可以在
Activity 的 onWindowFocusChanged() 方法中来调用 start() 方法。这样当你的应用在获得窗口焦点的时候 start()
就会马上被调用。代码如下:
package cn.sunzn.scan; import android.app.Activity; import android.graphics.drawable.AnimationDrawable; import android.os.Bundle; import android.view.Menu; import android.widget.ImageView; public class MainActivity extends Activity { private ImageView scanView; private AnimationDrawable scanAnimation; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); scanView = (ImageView) findViewById(R.id.iv_scan); scanView.setBackgroundResource(R.drawable.scan); scanAnimation = (AnimationDrawable) scanView.getBackground(); } public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(true); scanAnimation.start(); } public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } }
相关文章推荐
- Android 4.4 沉浸式透明状态栏与导航栏
- android开发常见编程错误总结
- android柱状progressbar
- android 仿美团、大众点评滑动viewpager菜单栏
- Android实现分享文本和图片小功能
- Android从xml加载到View对象过程解析
- android解析xml一直报错org.xmlpull.v1.XmlPullParserException
- 【Android】如何使用安卓的logcat『整理』
- Android加载Gif和ImageView的通用解决方案:android-gif-drawable:GifTextView(2)
- 第5章 静态分析Android程序
- Androidstudio生成的Apk文件路径
- Android 充电信息的获取
- Android 实时获取手机充电状态
- 一些android大牛的博客
- CSDN上下载的一些关于Android程序调用Webservice执行不成功的问题
- android中如何设置Toast 的样式
- Android 内存优化实例
- 给android应用程序系统的签名
- Android跑马灯实现的三种方式
- Android常用组件