Android 解码播放GIF图像

简介:

 Android 播放GIF之前就有过一篇文章是讲述如何使用GIF文件并播放。可以通过 这里 了解关于播放GIF的一种方法。

  如果前面有了解过的朋友肯定知道这上面的做法比较麻烦,又要去分解图片,又要写各种麻烦的XML文件,有点郁闷,而且还带来的直接后果是一个比较多动作的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,  0 0 new  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();
            }
        });

 

 

显示效果:

 

源码参见:gifPlayer





 本文转自 terry_龙 51CTO博客,原文链接:http://blog.51cto.com/terryblog/478018,如需转载请自行联系原作者


相关文章
|
6天前
|
开发工具 Android开发 开发者
Android UI设计: 解释Android的Nine-Patch图像是什么,它用于什么目的?
Android UI设计: 解释Android的Nine-Patch图像是什么,它用于什么目的?
36 4
|
6天前
|
XML 前端开发 Java
Android App开发图像加工中卡片视图CardView和给图像添加装饰的讲解以及实战(附源码 简单易懂)
Android App开发图像加工中卡片视图CardView和给图像添加装饰的讲解以及实战(附源码 简单易懂)
53 0
|
6天前
|
XML Java Android开发
Android Studio App开发中使用录音机、MediaRecorder录制音频和MediaPlayer播放音频讲解及实战(附源码)
Android Studio App开发中使用录音机、MediaRecorder录制音频和MediaPlayer播放音频讲解及实战(附源码)
99 0
|
5天前
|
Java Android开发
Android 触摸音的播放
Android 触摸音的播放
15 5
|
6天前
|
Android开发 内存技术
Android 通过tinyalsa调试解决录制和播放音频问题
Android 通过tinyalsa调试解决录制和播放音频问题
39 1
|
6天前
|
Android开发
Android实现圆形图像的两种方法(Glide和Picasso)
Android实现圆形图像的两种方法(Glide和Picasso)
13 1
|
6天前
|
XML Java 调度
Android开发音效增强中铃声播放Ringtone及声音池调度SoundPool的讲解及实战(超详细 附源码)
Android开发音效增强中铃声播放Ringtone及声音池调度SoundPool的讲解及实战(超详细 附源码)
74 0
|
6天前
|
XML Java Android开发
Android App开发实战项目之仿手机QQ动感影集动画播放(附源码和演示视频 可直接使用)
Android App开发实战项目之仿手机QQ动感影集动画播放(附源码和演示视频 可直接使用)
31 0
|
6天前
|
XML Java Android开发
Android App开发之图像加工中给图像添加水波动态特效(附源码和演示视频 简单易懂)
Android App开发之图像加工中给图像添加水波动态特效(附源码和演示视频 简单易懂)
46 0
|
6天前
|
XML 算法 Java
Android Studio App开发之利用图像解码器ImageDecoder播放GIF动图、Webp、HEIF图片(附源码 简单实用)
Android Studio App开发之利用图像解码器ImageDecoder播放GIF动图、Webp、HEIF图片(附源码 简单实用)
125 0