Android之-----Frame帧动画

大家见到最多的就是Frame动画了,我们Android中当在也少不了它,它的使用更加简单,只需要创建一个对象来表示Frame动画,添加并启动 播放就OK了。Frame动画跟gif动画同出一辙,大家对gif也应该很熟悉了吧,gif格式本身就可以做成动画效果,我们只要轻轻松松来播放它就可以 实现动画效果了,我们先对gif图像进行解码,然后将每帧动画连续绘制播放出来就可以实现动画效果了。

下面来我们一起创建一个Frame帧动画,实现动画的图片:

1.拷贝到资源文件夹下面:


2.drawable下面创建一个frame.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/girl_1" android:duration="200" />    <item android:drawable="@drawable/girl_2" android:duration="200" />    <item android:drawable="@drawable/girl_3" android:duration="200" />    <item android:drawable="@drawable/girl_4" android:duration="200" />    <item android:drawable="@drawable/girl_5" android:duration="200" />    <item android:drawable="@drawable/girl_6" android:duration="200" />    <item android:drawable="@drawable/girl_7" android:duration="200" />    <item android:drawable="@drawable/girl_8" android:duration="200" />    <item android:drawable="@drawable/girl_9" android:duration="200" />    <item android:drawable="@drawable/girl_10" android:duration="200" />    <item android:drawable="@drawable/girl_11" android:duration="200" /></animation-list>
以下对上面各个属性的说明:

android:oneshot 是指是否只播放一次
item 用于指定图片
android:drawable 指定特定的图片
android:duration 是指播放到该图片的时候要停留多长时间
animation-list 指定动画的图形

然后我们的activity_main.xml中定义代码如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context=".MainActivity" >    <TextView        android:id="@+id/tvImage"        android:layout_width="wrap_content"        android:layout_height="wrap_content" /></RelativeLayout>

然后我们的MainActivity.java中的代码如下

@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);TextView tvImage=(TextView)findViewById(R.id.tvImage);//绑定帧动画tvImage.setBackgroundResource(R.drawable.frame);                //获得帧动画对象                final AnimationDrawable animationDraw=(AnimationDrawable) tvImage.getBackground();                              /** * 以下几行代码比较重要,现在做详细的讲解 * getMainLooper():取到主线程中的消息处理对象 * myQueue():获得主线程所处理的消息队列 * addIdleHandler(hander):添加空闲的回调,即当主线程处理完消息队列中的事件之后才会调用hander对象中的回调方法。 * animationDraw.start():在MessageQueue.IdleHandler()内部类中条用该方法启动动画 *///取得主线程的消息处理对象getMainLooper().myQueue().addIdleHandler(new MessageQueue.IdleHandler() {@Overridepublic boolean queueIdle() {//启动动画animationDraw.start();return false;}});}

试想假若在取得帧动画对象后直接条用start()方法来启动动画,是否可以正常执行帧动画呢?

结果是不可以的,因为直接调用的话start()方法,帧动画对象并没有真正的完成绑定。

动画内部的绑定是通过时间完成的。因为在执行完

 final AnimationDrawable animationDraw=(AnimationDrawable) tvImage.getBackground();

方法之后,其内部会发送一个事件给主线程的消息队列中,主线程有一个消息处理器来进行内部事件的处理。只有等待内部事件处理完成之后,调用start()方法才能起作用,从而启动动画

为了获知主线程的内部事件处理完成,进行了如下代码的处理:

getMainLooper().myQueue().addIdleHandler(new MessageQueue.IdleHandler() {@Overridepublic boolean queueIdle() {//启动动画animationDraw.start();return false;}});

更多相关文章

  1. Android(安卓)Tween动画之RotateAnimation实现图片不停旋转
  2. Android(安卓)Context
  3. Android——组件之Service
  4. 手把手教你_android自己主动化实践方案选型
  5. 一个老程序员的Android学习路线指南
  6. Android(安卓)C++的sp指针简介
  7. binder机制详解
  8. Android实际开发常用框架总结
  9. Activity任务栈和亲属关系(Activities and Tasks)

随机推荐

  1. android关于jni反射的一些操作
  2. Android系统Surface机制的SurfaceFlinger
  3. Android第一节(体系介绍),维维复习
  4. Android(安卓)Activity延迟跳转
  5. Android(安卓)Crash signal 4 (SIGILL),
  6. Android(安卓)鑱氬悎闊充箰鎾斁鍣?/h1>
  7. Android与JS的交互简单实现
  8. Android 来去电自动录音(一)
  9. Android studio 天朝下 从下载到环境配置
  10. android:gravity / android:layout_gravi