android所带的控件里面没有能够显示gif图片的

网上的解决方法大致有三种

第一:先将gif图片分拆为N帧(由美工/软件完成),然后逐次播放;

第二:利用java代码将图片分拆为N帧;

第三:android里面有一个Movie类,可以使用它来播放gif动画(此类位于android.graphics包下)

前面两种的思路是一样的,第二种网上有jar包可以下载用(在资源中已经上传)。

第一种对于帧数较多的图片太过于繁琐,不提倡使用。

先来解释一下第二种的方法:

GifAction.java 观察者类,监视GIF是否加载成功

GifFrame.java 里面三个成员:当前图片、延时、下张Frame的链接。

GifDecoder.java 解码线程类

GifView.java 主类,包括常用方法,如GifView构造方法、设置图片源、延迟、绘制等。

public interface GifAction {

/**

* gif解码观察者

* @param parseStatus 解码是否成功,成功会为true

* @param frameIndex 当前解码的第几帧,当全部解码成功后,这里为-1

*/

public void parseOk(boolean parseStatus,int frameIndex);

}

//线程操作gif图片解码

public class GifDecoder extends Thread

//gif框架

public class GifFrame

{

/**

* 构造函数

*

* @param im

* 图片

* @param del

* 延时

*/

public GifFrame(Bitmap im, int del)

{

image = im;

delay = del;

}

/** 图片 */

public Bitmap image;

/** 延时 */

public int delay;

/** 下一帧 */

public GifFrame nextFrame = null;

}

/**

* GifView

* 本类可以显示一个gif动画,其使用方法和android的其它view(如imageview)一样。

* 如果要显示的gif太大,会出现OOM的问题。

*

* @author liao

*

*/

public class GifView extends View implements GifAction

应用如下:

1-把GifView.jar加入你的项目。

2-在xml中配置GifView的基本属性,GifView继承自View类,和Button、ImageView一样是一个UI控件。如:

android:layout_height="wrap_content" android:layout_width="wrap_content"

android:paddingTop="4px" android:paddingLeft="14px" android:enabled="false" />

3-在代码中配置常用属性:

// 从xml中得到GifView的句柄

gf1 = (GifView) findViewById(R.id.gif1);

// 设置Gif图片源

gf1.setGifImage(R.drawable.gif1);

// 添加监听器

gf1.setOnClickListener(this);

// 设置显示的大小,拉伸或者压缩

gf1.setShowDimension(300, 300);

// 设置加载方式:先加载后显示、边加载边显示、只显示第一帧再显示

gf1.setGifImageType(GifImageType.COVER);

然后分析下第三种方法:

,为了显示gif图片,我们需要用到Movie类和自定义控件(包括自定义属性)

首先,我们来自定义控件属性:

在res/values里面建立xml文件,习惯性命名为attrs.xml(可以命名为其他名字)

在attrs.xml里面增加属性如下:

这里我只增加了一个属性,就是设置src文件。

属性设置好了,那怎么将这个src属性与java代码对应起来呢,这个就需要到构造函数里面处理了

public GifView(Context context, AttributeSet attrs){

super(context, attrs);

TypedArray ta = context.obtainStyledAttributes(attrs,

R.styleable.GifView); //这里用到了attrs.xml里面定义的GifView

int taCount = ta.length(); //获得属性的个数

for (int i=0;i

if (R.styleable.GifView_src == ta.getIndex(i)) {

int id = ta.getResourceId(R.styleable.GifView_src, 0); //这里的参数是前面的GifView + _ + src链接起来

if (0 != id) {

setSrc(id); //对应的函数,即在xml里面设置了src,相应的处理就会在setSrc函数里面进行

}

}

}

ta.recycle();

}

下面是setSrc函数:

public void setSrc(int id){

gifMovie = Movie.decodeStream(getResources().openRawResource(id)); //gifMovie为Movie类型

}

接下来是view的onDraw函数,这也是绘画动画的关键

public void onDraw(Canvas canvas){

long now = android.os.SystemClock.uptimeMillis(); //获得当前时间

if (lStartTime == 0) { // first time

lStartTime = now;

}

if (gifMovie != null) {

int dur = gifMovie.duration(); //获得gif文件的动画周期

if (dur == 0) {

dur = 1000;

}

int relTime = (int)((now - lStartTime) % dur);

gifMovie.setTime(relTime); //设置播放时间点

gifMovie.draw(canvas, getWidth() - gifMovie.width(), //播放(即绘画)

getHeight() - gifMovie.height());

invalidate();

}

}

下面在main.xml文件里面加入自定义的GifView控件

xmlns:gif="http://schemas.android.com/apk/res/com.gif.demo"

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

>

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="@string/hello"

/>

android:layout_width="wrap_content"

android:layout_height="wrap_content"

gif:src="@drawable/lion"

/>

其中xmlns:gif="http://schemas.android.com/apk/res/com.gif.demo"

即gif为自己定义的namespace,com.gif.demo对应于自己的包名,即activity对应的包名

最后在activity里面setContentView(R.layout.main)就ok了

android gif图片闪烁,Android中动态显示gif图片相关推荐

  1. python label显示图片_python 实现在tkinter中动态显示label图片的方法

    在编程中我们往往会希望能够实现这样的操作:点击Button,选择了图片,然后在窗口中的Label处显示选到的图片.那么这时候就需要如下代码: from tkinter import * from tk ...

  2. Android 在已有工程中实现微信图片压缩

    这个我们需要自己去编译,但是已经有人帮我们编译好了,压缩算法也已经实现,因此,我们去下载然后编译即可:https://github.com/bither/bither-android-lib 首先将上 ...

  3. Android:TextView与EditText中插入表情图片

    表情工具类,用于在TextView与EditText中插入表情图片: public class FaceUtil {public int[] faceIds;public String[] faceC ...

  4. android设置光标闪烁,Android EditText闪烁光标

    我的Activity中只有一个EditText,我希望它在输入完成后隐藏闪烁的光标 – 焦点切换或用户按下Done – 换句话说,当输入键盘消失时. 这是EditText的代码. android:la ...

  5. java怎么将加载图片消除_Java中加载图片的方法

    Java中添加图片,我知道有两种方法 用new ImageIcon("地址")函数,将图片放到JLabel中,然后把JLabel放到需要的地方就可以了 ImageIcon bg=n ...

  6. java web工程中如何添加图片_java web中如何添加图片

    java web中如何添加图片 对于java可视化界面插入背景图片只需要background-image:url(图片路径)就行,而对于web项目中,并非如此 效果如下: 我们就需要在jsp页面中写J ...

  7. 【Unity教程】如何动态更换精灵图片在图集中更换精灵图片

    参考文章:1.unity3d 更换sprite renderer中sprite的图片 2.制作精灵(UI Sprite) 3.Unity2D动态设置SpriteRender的Sprite(Multip ...

  8. element表格里面放图片_elementUI 表格中预览图片

    表格中有一列显示的图片,现需要点击图片,预览该图片,使用的elementui中的previewSrcList做的图片预览, 但是测试发现,无论点击表格中的那张图片,预览的大图都是从第一张图片,开始预览 ...

  9. java实现本地图片转urljava中映射本地图片地址为url访问

    1.编写一个工具类PhotoUtils实现WebMvcConfigurer,然后重写addResourceHandlers方法即可 @Component public class PhotoUtils ...

最新文章

  1. Domino R8.5相关链接
  2. tf_geometric的安装
  3. Earliest PEP Algorithm Principles
  4. 深入理解CSS盒模型 - 程序猿的程 - 博客园
  5. 设计模式是用来弥补面向对象编程缺陷的方法总结
  6. 向下一代互联网迈进 声网发布全链路加速FPA为互联网增加QoS保障
  7. Matlab线性/非线性规划优化算法(2)
  8. 程序员!别逼自己刷题了!每天花10分钟做这件事,编程能力暴增!
  9. Directx11教程(47) alpha blend(4)-雾的实现
  10. Anaconda出现Navigator Error的解决办法
  11. 好听无损的flac格式歌曲怎么转换成mp3格式的
  12. 百度云网页视频加速播放
  13. su室内插件_草图大师做室内需要用到那些插件
  14. 大学生对于繁体字的态度与认知情况调查
  15. 1075:字符串统计
  16. 点燃创业引擎的天使投资
  17. 江苏工勤计算机高级工职称,事业单位专业技术职称与工勤岗高级工的区别
  18. transferwise怎么提现_TransferWise来款能不能入账?快来Get这些注意事项
  19. 图像匹配—NCC算法,即归一化互相关匹配
  20. .NET报错:所生成项目的处理器框架“MSIL”与引用“xxx”的处理器架构“AMD64”不匹配

热门文章

  1. 【Yolo3】入门目标检测实验--Python+Opencv2+dnn
  2. 计算机网络基础选择题
  3. Vue实现简单列表无限循环滚动(鼠标悬停)
  4. linux 内核源码下载网址
  5. MySQL创建数据库表的语句和基础语句
  6. 数字化转型实例:国家电网
  7. Excel用正则表达式提取出输入正确的身份证号
  8. BitXHub跨链交易的流程
  9. DbContext(String)+SqlQuery一起使用
  10. 合工大计算机调剂到经济学,合肥工业大学金砖复试调剂经验