android gif

转载 2012年03月21日 22:42:38
简介:android中现在没有直接显示gif的view,只能通过mediaplay来显示,且还常常不能正常显示出来,为此写了这个gifview,其用法和imageview一样 
使用方法: 

1-把GifView.jar加入你的项目。 
2-在xml中配置GifView的基本属性,GifView继承自View类,和Button、ImageView一样是一个UI控件。如: 

view plaincopy to clipboardprint?<com.ant.liao.GifView android:id="@+id/gif2"  
    android:layout_height="wrap_content" android:layout_width="wrap_content"  
    android:paddingTop="4px" android:paddingLeft="14px" android:enabled="false" />  
<com.ant.liao.GifView android:id="@+id/gif2" 
android:layout_height="wrap_content" android:layout_width="wrap_content" 
android:paddingTop="4px" android:paddingLeft="14px" android:enabled="false" /> 

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

view plaincopy to clipboardprint?// 从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);  
// 从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); 



GifView的Jar包共有四个类: 

GifAction.java 

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

GifFrame.java 

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

GifDecoder.java 

解码线程类 

GifView.java 

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





如何在Android中播放GIF图片呢?如果直接按以前的方法,分解图片,可能相对比较麻烦。

今天给大伙介绍一种新的方式,构造自己的Android图片解码帮助类,直接在Android解码GIF图片,还可以实现播放功能。

下面先请看一GIF图:

我们以此美图为示例,解码GIF。  

先编写一个GIF解码的帮助类,该类提供了几个操作GIF图片的方法,比如图片的初始化呀,切换图片呀,获得整个GIF的组合数量等等,由于代码量太多,这里就不列出来,后面会提供源码供大家参考,可于源码内找到该帮助类。

 

之后,编写一个用于可显示Gif 的组件,继承自View 并实现了Runable,代码如下:

 

package com.terry.gif;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;

public class TypegifView extends View implements Runnable {
    gifOpenHelper gHelper;
    
private boolean isStop = true;
    
int delta;
    String title;

    Bitmap bmp;

    
// construct - refer for java
    public TypegifView(Context context) {
        
this(context, null);

    }

    
// construct - refer for xml
    public TypegifView(Context context, AttributeSet attrs) {
        super(context, attrs);
//
添加属性
        TypedArray ta = context.obtainStyledAttributes(attrs,
                R.styleable.gifView);
        
int n = ta.getIndexCount();

        
for (int i = 0; i < n; i++) {
            
int attr = ta.getIndex(i);

            
switch (attr) {
            
case R.styleable.gifView_src:
                
int id = ta.getResourceId(R.styleable.gifView_src, 0);
                setSrc(id);
                
break;

            
case R.styleable.gifView_delay:
                
int idelta = ta.getInteger(R.styleable.gifView_delay, 1);
                setDelta(idelta);
                
break;

            
case R.styleable.gifView_stop:
                boolean sp = ta.getBoolean(R.styleable.gifView_stop, false);
                
if (!sp) {
                    setStop();
                }
                
break;
            }

        }

        ta.recycle();
    }

    
/**
     * 设置停止
     * 
     * @param stop
     */
    
public void setStop() {
        isStop = false;
    }

    
/**
     * 设置启动
     */
    
public void setStart() {
        isStop = true;

        Thread updateTimer = new Thread(this);
        updateTimer.start();
    }

    
/**
     * 通过下票设置第几张图片显示
     * @param id
     */
    
public void setSrc(int id) {

        gHelper = new gifOpenHelper();
        gHelper.read(TypegifView.this.getResources().openRawResource(id));
        bmp = gHelper.getImage();// 得到第一张图片
    }

    
public void setDelta(int is) {
        delta = is;
    }

    
// to meaure its Width & Height
    @Override
    
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        setMeasuredDimension(measureWidth(widthMeasureSpec),
                measureHeight(heightMeasureSpec));
    }

    
private int measureWidth(int measureSpec) {
        
return gHelper.getWidth();
    }

    
private int measureHeight(int measureSpec) {
        
return gHelper.getHeigh();
    }

    
protected void onDraw(Canvas canvas) {
        
// TODO Auto-generated method stub
        canvas.drawBitmap(bmp, 00new Paint());
        bmp = gHelper.nextBitmap();

    }

    
public void run() {
        
// TODO Auto-generated method stub
        while (isStop) {
            
try {
                
this.postInvalidate();
                Thread.sleep(gHelper.nextDelay() / delta);
            } catch (Exception ex) {

            }
        }
    }

}

 

基础功能实现后。可通过view.start()开启GIF的播放,或者view.stop()停止GIF的播放,代码如下:

 

setContentView(R.layout.main);
        Button btn = (Button) findViewById(R.id.Button01);
        Button btn2 = (Button) findViewById(R.id.Button02);
        final TypegifView view = (TypegifView) findViewById(R.id.gifView1);

        btn.setOnClickListener(new OnClickListener() {

            @Override
            
public void onClick(View v) {
                view.setStop();
            }
        });

        btn2.setOnClickListener(new OnClickListener() {

            @Override
            
public void onClick(View v) {
                view.setStart();
            }
        });

 

显示效果:

 






Android下载并显示GIF图

最近项目需要实现在线加载GIF图的功能,于是我在网上翻了一番,发现有个开源项目(android-gif-drawable)可以很好的支持GIF动态图的显示。而且它的底层解码使用C实现,极大的提高了解码...
  • u012964281
  • u012964281
  • 2015年04月30日 14:07
  • 2356

Android加载GIF图片的两种方式

Android加载GIF图片的两种方式方式一:使用第三开源框架直接在布局文件中加载gif1.在工程的build.gradle中添加如下buildscript { repositorie...
  • xinpengfei521
  • xinpengfei521
  • 2017年05月30日 10:54
  • 6556

在Android中显示GIF动画

gif图动画在android中还是比较常用的,比如像新浪微博中,有很多gif图片,而且展示非常好,所以我也想弄一个。经过我多方的搜索资料和整理,终于弄出来了,其实github上有很多开源的gif的展示...
  • loongggdroid
  • loongggdroid
  • 2014年03月13日 13:47
  • 90132

binbinyang---Android实现显示GIF图片

最近.一个朋友跟我说想,我给她弄个闹钟APP软件...功能其实很简单...只需要弄个简单的闹钟.自己设计设计时间.然后时间到了的时候,闹铃放的声音是男朋友录制好的声音...于是就开始整了.... 第一...
  • yangbin0513
  • yangbin0513
  • 2016年11月02日 11:43
  • 2329

制作Android Demo GIF:程序演示效果GIF图录制

在平时写博客或者分享自己写的程序效果的时候经常需要做成GIF图,以下就是介绍几种常用的GIF录制方法: 一、录制工具  1、(生成动画的工具:Ulead GIF Animator),可以讲单独的图片生...
  • zxccxzzxz
  • zxccxzzxz
  • 2016年08月23日 00:08
  • 1072

【Android Studio】制作清晰Gif截图以作为项目的运行效果

原文地址: http://www.jianshu.com/p/f8e22be832a1
  • wenbitianxiafeng
  • wenbitianxiafeng
  • 2015年09月21日 17:41
  • 1795

Android加载Gif和ImageView的通用解决方案:android-gif-drawable(1)

 Android加载Gif和ImageView的通用解决方案:android-gif-drawable(1) Android自己的ImageView或者View不能直接加载运行Gif图片,如果...
  • zhangphil
  • zhangphil
  • 2016年03月07日 15:55
  • 30460

Android屏幕内容制作成GIF图方式

1.方式 1.1方式一:先把App操作过程录制成视频,然后根据视频转换成Gif 参考:http://www.jb51.net/article/78236.htm 1.2方式二:采用截屏的方式得到...
  • u014686875
  • u014686875
  • 2016年04月11日 20:03
  • 3890

Android开发笔记(十七)GIF动画的实现GifAnimation

GIF在Windows上是常见的图片格式,主要用来播放短小的动画。但在手机上由于系统资源紧张,所以Android并没有直接支持GIF格式,如果在ImageView中放入一张gif文件,你会发现显示出来...
  • aqi00
  • aqi00
  • 2015年12月11日 17:10
  • 2843

Android根据Url显示gif类型图片

Android根据Url显示gif图片
  • u014620028
  • u014620028
  • 2016年03月25日 17:04
  • 1509
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android gif
举报原因:
原因补充:

(最多只允许输入30个字)