关闭

android gif

标签: androidlayoutbuttondelayxmlnull
2039人阅读 评论(0) 收藏 举报
分类:
简介: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();
            }
        });

 

显示效果:

 






0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:317976次
    • 积分:3851
    • 等级:
    • 排名:第8561名
    • 原创:15篇
    • 转载:337篇
    • 译文:0篇
    • 评论:28条
    最新评论