对于帧动画的显示有多种不同的实现方式,帧动画的图片有两种不同的情形,一种是多个单张图片,放在animation-list对应的xml里面,采用轮播的方式进行;另一种是一张大图片排列不同的小图片,之前实现的方式是采用继承SurfaceView,另开线程,逐步分割图片显示,同样也是轮播的方式实现动画,现在我们综合以上两种实现方式,自定义自己实现一张大图的帧动画播放(ps:有时候为了便于维护,需要一张大图实现的帧动画,而不是多张小图片)
图片资源如下:

播放简单可爱的图片来展示效果;
关键代码,自定义的ImageView:

package com.example.animationtest;import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.View;
import android.widget.ImageView;
/*** 自定义ImageView* @author xutao**/
public class AnimationControl extends ImageView{private Bitmap resourceBip; //播放的图片资源private int duration; //时间间隔private boolean positive; //正向还是反向播放private int repeatCount; //重复播放的次数;0、循环private int playAfter; //播放之后的动作private MyAnimationDrawable animationDrawable; //播放的资源集合public AnimationControl(Context context, AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stubTypedArray array = context.obtainStyledAttributes(attrs, R.styleable.animationView);int resId = array.getResourceId(R.styleable.animationView_img, 0);resourceBip = BitmapFactory.decodeResource(context.getResources(), resId);duration = array.getInt(R.styleable.animationView_duration, 500);positive = array.getBoolean(R.styleable.animationView_positive, true);repeatCount = array.getInt(R.styleable.animationView_repeat_count, 0);playAfter = array.getInt(R.styleable.animationView_play_after, 0);int column = array.getInt(R.styleable.animationView_column_number, 1);int row = array.getInt(R.styleable.animationView_row_number, 1);array.recycle();animationDrawable = new MyAnimationDrawable();initAnimation(column, row);}public void initAnimation(int column, int row) {int w = resourceBip.getWidth()/column;int h = resourceBip.getHeight()/row;if(positive) {for (int i = 0; i < row; i++) {int y = h*i;for (int j = 0; j < column; j++) {int x = w*j;Drawable drawable = new BitmapDrawable(getResources(), Bitmap.createBitmap(resourceBip, x, y, w, h));animationDrawable.addFrame(drawable, duration);}}} else {for (int i = row-1; i >= 0; i--) {int y = h*i;for (int j = column-1; j >= 0; j--) {int x = w*j;Drawable drawable = new BitmapDrawable(getResources(), Bitmap.createBitmap(resourceBip, x, y, w, h));animationDrawable.addFrame(drawable, duration);}}}setImageDrawable(animationDrawable);animationDrawable.setOneShot(false);animationDrawable.setRepeatCount(repeatCount);animationDrawable.setAnimationEndListener(new MyAnimationDrawable.AnimationEndListener() {@Overridepublic void onEnd() {// TODO Auto-generated method stubswitch (playAfter) {case 0:break;case 1:setVisibility(View.INVISIBLE);break;case 2:setVisibility(View.GONE);break;default:break;}}});animationDrawable.start();}public Drawable getCurrentDrawable() {return animationDrawable.getCurrent();}public Drawable getIndexDrawable(int index) {return animationDrawable.getFrame(index);}
}

由于自定义了styleable,所以附上attr.xml代码,该代码放在value文件夹下:

<?xml version="1.0" encoding="utf-8"?>
<resources><declare-styleable name="animationView"><!-- 要播放的图片资源 --><attr name="img" format="reference" /><!-- 播放时间间隔 --><attr name="duration" format="integer" /><!-- 图片行数 --><attr name="row_number" format="integer" /><!-- 图片列数 --><attr name="column_number" format="integer" /><!-- ture为正向播放图片,false为反向播放图片 --><attr name="positive" format="boolean" /><!-- 小于等于0为循环播放 --><attr name="repeat_count" format="integer" /><!-- 非循环播放之后的响应;无效果 、不可见、隐藏--><attr name="play_after"><flag name="visible" value="0" /><flag name="invisible" value="1" /><flag name="gone" value="2" /></attr></declare-styleable></resources>

由于系统自带的AnimationDrawable不具有播放次数和播放结束的监听事件的功能,因此需要自定义AnimationDrawable,代码如下:

package com.example.animationtest;
import android.graphics.drawable.AnimationDrawable;
/*** 自定义AnimationDrawable* 实现播放次数控制和播放结束回调事件* * @author xutao**/
public class MyAnimationDrawable extends AnimationDrawable {private int repeatCount = 0;private boolean isRepeat = true;private AnimationEndListener listener;public MyAnimationDrawable() {super();}@Overridepublic void run() {// TODO Auto-generated method stubsuper.run();if(!isRepeat) {repeatCount --;if(repeatCount == 1) {super.unscheduleSelf(this);if(listener != null) listener.onEnd();}}}public void setRepeatCount(int num) {if(num == 0) isRepeat = true;else {isRepeat = false;repeatCount = num*getNumberOfFrames();}}public void setAnimationEndListener(AnimationEndListener ls) {listener = ls;}/*** 动画播放结束回调接口* @author user**/public interface AnimationEndListener {public void onEnd();}
}

基本代码就是这些,对了,还有布局文件代码:

    <com.example.animationtest.AnimationControlandroid:id="@+id/main_control"android:layout_width="100dp"android:layout_height="100dp" animation:column_number="7"animation:duration="100"animation:img="@drawable/day"animation:play_after="invisible"animation:positive="true"animation:repeat_count="8"animation:row_number="1" />

好了,就是这些代码了,封装之后感觉好简单啊,相对于SurfaceView而言,不用另开线程,实现更加方便了!!!

DEMO下载地址 ^-^

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/sidxu/p/4940366.html

自定义ImageView实现播放帧动画相关推荐

  1. [Unity]代码控制在3D物体上播放帧动画

    不使用Unity自带的Animation,在3D物体上播放帧动画 图片必须是可以整齐排列的 可以分割的完整的图片. 像这样 不能像这样: 也不能像这样,过于紧凑,不能完整切割 空项目,空场景, 场景中 ...

  2. android 播放gif动画效果,android 通过帧动画方式播放Gif动画

    注意:经过本人测试,这个方法很耗内存, 图片一多就崩了.慎用 <1>用工具(photoshop或者FireWorks)将GIF动画图片分解成多个GIF静态图片,然后保存在res\drawa ...

  3. cocos2d+lua实现帧动画播放

    使用Cocos2d播放帧动画的方法有两种: 先来介绍一下流程: 1.得到动画的每一帧的数组FrameArray 2.将帧动画数组包装成Animation对象 3.将Animation对象转化为可以播放 ...

  4. Android帧动画和补间动画

    目录 1.帧动画 (帧动画的资源文件,放在drawable文件夹下) 1.创建一个项目 2.导入资源, 将图片资源放入 mipmap 文件夹下 3.编写资源文件 在drawable文件夹创建 4.在x ...

  5. android104 帧动画,补间动画,属性动画

    ##帧动画FrameAnimation * 多张图片快速切换,形成动画效果 * 帧动画使用xml定义 package com.itheima.frameanimation;import android ...

  6. 【腾讯优测干货分享】使用多张图片做帧动画的性能优化

    本文来自于Dev Club 开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57fc8cea302e4725036142f6 使用多张图片做帧动画的性能优 ...

  7. Android App开发动画特效中帧动画和电影淡入淡出动画的讲解及实战(附源码和演示视频 简单易懂)

    需要图片集和源码请点赞关注收藏后评论区留言~~~ 一.帧动画 Android的动画分为三类,帧动画,补间动画和属性动画.其中帧动画是实现原理最简单的一种,跟现实生活中的电影胶卷类似,都是在短时间内连续 ...

  8. Android性能优化 _ 大图做帧动画卡?优化帧动画之 SurfaceView滑动窗口式帧复用

    (ps:粗斜体表示引导方案逐步进化的关键点) SurfaceView逐帧解析 & 帧复用 简单回顾下上一篇的内容:原生帧动画在播放前解析所有帧,对内存压力大.SurfaceView可以精细地控 ...

  9. 使用多张图片做帧动画的性能优化

    背景 QQ群的送礼物功能需要加载几十张图然后做帧动画,但是多张图片加载造成了非常大的性能开销,导致图片开始加载到真正播放动画的时间间隔比较长.所以需要研究一些优化方案提升加载图片和帧动画的性能. 原理 ...

最新文章

  1. 东南大学和山东大学计算机学院,东南大学和山东大学都是985、211哪所综合实力更强些呢?...
  2. 3dsmax 让物体变透明
  3. Spring Cloud微服务实战:手把手带你整合eurekazuulfeignhystrix
  4. Android适配全面总结(二)
  5. Spring MVC同一方法返回JSON/XML格式
  6. AngularJS中自定义过滤器
  7. 前端学习(1927)vue之电商管理系统电商系统之美化一层循环的UI结构for循环渲染第三层结构
  8. 关于国内厂商的国际版杀毒软件
  9. EF 线程内唯一对象
  10. 数据库(4)表的基本操作
  11. 什么情况下java会出现堆溢出_【Java面试题第三期】JVM中哪些地方会出现内存溢出?出现的原因是什么?...
  12. Android支付宝刷步数,支付宝运动怎么刷步数? 支付宝如何快速刷步数?
  13. 加勒比海盗海盗不雅镜头_土豆,海盗和……编程?
  14. 微信小程序服务端调用--小程序码 wxacode.getUnlimited 接口调用,实现微信扫码直接跳转小程序页面
  15. 机器学习之感知机python实现
  16. python人工智能面试题爱奇艺面试题_经典算法题:爱奇艺研发工程师算法笔试题...
  17. forEach空指针异常问题
  18. matlab常用代码(读取文件、批量导入数据、与或非)
  19. Apache BookKeeper
  20. 关于免费的seo网站推广方法有哪些?

热门文章

  1. Win8.1RTM Pro电话激活
  2. MySQL-SQL注入,导入,导出
  3. 关闭tomcat6下的stdout日志
  4. 匿名科创--ANO_OPENMV视觉开发板介绍
  5. STM32DAC输出遇到的问题
  6. MongoDB 数据文件损坏修复救命repair与致命危险
  7. 东郊到家预约系统开发流程
  8. 模式识别算法之2--感知器(感知机)算法
  9. 数据预处理 - 类型转换(离散型)
  10. 时间序列平稳性检验(ADF)和白噪声检验(Ljung-Box)