文档章节

Android 如何显示GIF

Freewheel
 Freewheel
发布于 2015/03/09 01:09
字数 704
阅读 87
收藏 2

  今天做一个界面想放上一个GIF动图,发现Android的控件并不支持显示GIF图片,搜索了一些大神的做法,实践了一下,发现以下的方法最为便捷——

(如果发现代码和网上其他类似的,别急着关掉网页,建议看一下第三步···)

1. 新建一个继承自View 的 自定义的GifView类


package com.example.administrator.sudugame;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Movie;
import android.util.AttributeSet;
import android.view.View;

public class GifView extends View{
    private long movieStart;
    private Movie movie;
    //此处必须重写该构造方法
    public GifView(Context context,AttributeSet attributeSet) {
        super(context,attributeSet);
//以文件流(InputStream)读取进gif图片资源,此处的congratulation是我的gif图片名
        movie=Movie.decodeStream(getResources().openRawResource(R.drawable.congradulation));
    }

    @Override
    protected void onDraw(Canvas canvas) {
        long curTime=android.os.SystemClock.uptimeMillis();//获得当前时间
//第一次播放
        if (movieStart == 0) {
            movieStart = curTime;
        }
        if (movie != null) {
            int duraction = movie.duration();//获取gif长度
            int relTime = (int) ((curTime-movieStart)%duraction);//运用取余数运算,设置reltime
            movie.setTime(relTime);//将gif跳转到reltime那一帧
            movie.draw(canvas, 0, 0);//画出那帧
//强制重绘
            invalidate();//这个重画过程取决于硬件的反应速度,速度快的看到的gif更流畅
        }
        super.onDraw(canvas);
    }
}

2.如果直接在Activity里使用这个GifView,gif图片只会在左上角显示,为了自由调整位置,可以写一个layout xml文件


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">

    <com.example.administrator.sudugame.GifView
        android:id="@+id/gif1"
        android:layout_width="400dp"
        android:layout_height="200dp"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="140dp"
        android:layout_marginLeft="30dp"
        android:enabled="false" />



</RelativeLayout>


一定得使用包名加文件名——<com.example.administrator.sudugame.GifView  ... ... >

3. 最重要而且网上很多文章都漏掉的一步,在AndroidManifest.xml中对应的Activity中一定得取消硬件加速

<activity android:name=".SuccessGif" android:hardwareAccelerated="false">
            <intent-filter>
                <action android:name="sudu_Compete_successfully_gif" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
</activity>

否则,无法正确显示gif图。(这个蛋疼的问题,花了我很多时间才找出来···)

android:hardwareAccelerated="false"


泪崩提示——

   有些手机能通过在AndroidManifest中的设置关闭硬件加速,但是有的不行!!!(比如小米2S),为了在小米2s上也运行这个Gif播放功能,我debug到深夜···早上才搞定···

   在小米2s上运行上述的代码后,会直接闪退,在logcat里提示Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1),这个错误提示说明,在movie.draw过程中 Gif对应的图片还没来得及画出来或者正在画就被GC清理了,于是系统报错——可能是因为硬件加速的原因,细节不清楚。

解决方案——

在构造方法里

 public GifView(Context context,AttributeSet attributeSet) 

加入一句

this.setLayerType(View.LAYER_TYPE_SOFTWARE,null);//关闭硬件加速

搞定!

(后记:真机调试和真机装APP使用,往往和虚拟器会有差异···我也开始体验到了蛋疼的安卓开发对于机型的适应问题····)







© 著作权归作者所有

Freewheel
粉丝 10
博文 83
码字总数 48265
作品 0
普陀
程序员
私信 提问
如何让你的 Android 显示gif格式的图片

这里,首先要说明的是,希望那些已经实现了gif格式图片显示的朋友不要喷我,我知道你们是怎么做的,无非两种:一种是用原本就已经存在的gif解码jar包,另外一种是使用google提供的开源的gif...

鉴客
2011/10/20
23.4K
6
android显示网络gif图片

这功能源自负责app中要加一个显示gif广告图功能。 android自带控件不支持gif图片,网上很多通过扩展ImageView或View来实现支持gif图片,但在android4.0后,需要关闭硬件加速功能才能使用,而...

penngo
2015/07/21
0
2
(android开源库android-gif-drawable)第二篇 加载网络gif图片

大家好, 今天给大家带来如何使用 android开源库android-gif-drawable来 加载网络gif图片 同样的DEMO下载地址在 最后 请大家去下载 。 如果gif图片地址无效 了。 请大家自行到网上去寻找一个...

一个游戏8
2014/11/15
0
5
Android原理之动态墙纸

Livewallpaper,即动态墙纸,是Android的一大3D特色功能,用户可以在桌面选择加载动态墙纸,让自己的手机桌面背景旋动起来。 相对于静态桌面壁纸,动态墙纸可以展示各种动态变化的背景,而与...

晨曦之光
2012/03/05
335
0
Android PowerImageView实现,可以播放动画的强大ImageView

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11100315 我个人是比较喜欢逛贴吧的,贴吧里总是会有很多搞笑的动态图片,经常看一看就会感觉欢乐很多,可以释放掉不少平...

军歌
2014/02/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

以太坊中文文档翻译-区块

本文原文链接 点击这里获取Etherscan API 中文文档(完整版) 完整内容排版更好,推荐读者前往阅读。 区块(Blocks) 区块相关的 API,接口的参数说明请参考Etherscan API 约定, 文档中不单独...

Tiny熊
21分钟前
1
0
Linux 内核的一个问题

是virtio 驱动,但是没有启动 virtio-mmio virtio-mmio.0: Failed to enable 64-bit or 32-bit DMA. Trying to continue, but this might not work.....[ 1.047924] md: ... autorun......

MtrS
45分钟前
2
0
MySQL主从配置

17.1 MySQL主从介绍 17.2 准备工作 17.3 配置主 17.4 配置从 17.5 测试主从同步 一、 MySQL主从介绍

tobej
55分钟前
2
0
读书replay《博弈与社会》.1.20190526

前情 《美丽心灵》,一部讲数学家约翰·福布斯·纳什的电影,我第一次听到博弈理论就是在这部电影里。看过电影之后就一直想知道,博弈论究竟讲了什么。很久之后,20190417这天,我刷JD的购物...

wanxiangming
今天
2
0
iOS TableView层级结构剖析

首先上图 下面来分析一下tableView的层级结构 tableView的组成: 1.整个tableView有且仅有一个头部和尾部就是tableViewHeadView和tableViewFooterView2.tableView 可以有多个section,一个s...

HOrange
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部