Android之ImageView既能普通图片又能显示gif的方法

原创 2012年03月28日 16:27:22

最近项目有个需求,就是GridView和Gallery中异步加载图片,图片加载时先显示加载进度的gif图片,加载完图片后再显示图片。Android默认是不支持gif格式图片的显示的,参考了网上的方法,重写了一下ImageView,经测试可行,不过有的gif还是显示不了或者花屏。。。我想显示的gif已经显示了,先凑合用吧,有时间再改。


/**  
 * @Title: GifImageView.java 
 * @Package com.test 
 * @Description: TODOtodo: 
 * @author wuzq,zhongqianhit@163.com 
 * @date 2012-3-23 下午5:21:24 
 * @version V1.0  
**/ 
package com.test;

import java.io.InputStream;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Movie;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.ImageView;

/**   
 * <p>项目名称:ImageViewGifDemo </p>  
 * <p>类名称:GifImageView </p>
 * <p>类描述:   </p>
 * <p>创建人:wuzq,zhongqianhit@163.com </p> 
 * <p>创建时间:2012-3-23 下午5:21:24 </p>	
 * <p>修改人:wuzq,zhongqianhit@163.com </p>  
 * <p>修改时间:2012-3-23 下午5:21:24 </p>
 * <p>修改备注:	</p>	
 * @version    
 **/

public class GifImageView extends ImageView {
	/**是否是gif图片*/
	private boolean isGif = false;
	
	/**播放类*/
	private Movie mMovie;  
	
	/**gif播放起始时间*/
	private long mMovieStart;  
	
	/** 
	 * <p>Title: </p> 
	 * <p>Description: </p> 
	 * @param context 
	**/ 
	public GifImageView(Context context) {
		super(context);
		mMovie=null;  
        mMovieStart=0;  
		// TODO Auto-generated constructor stub
	}
	
	/** 
	 * <p>Title: </p> 
	 * <p>Description: </p> 
	 * @param context
	 * @param attrs 
	**/ 
	public GifImageView(Context context, AttributeSet attrs) {
		super(context, attrs);
		mMovie=null;  
        mMovieStart=0;  
		// TODO Auto-generated constructor stub
	}
	
	/** 
	 * <p>Title: </p> 
	 * <p>Description: </p> 
	 * @param context
	 * @param attrs
	 * @param defStyle 
	**/ 
	public GifImageView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		mMovie=null;  
        mMovieStart=0;  
         
        //从描述文件中读出gif的值,创建出Movie实例  
        /*TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.GIFView, defStyle, 0);  
         
        int srcID=a.getResourceId(R.styleable.GIFView_gif, 0);  
        if(srcID>0){  
            InputStream is = context.getResources().openRawResource(srcID);  
            mMovie = Movie.decodeStream(is);  
        }  
         
        a.recycle();  
		*/
	}

	@Override
	protected void onDraw(Canvas canvas) {
		// TODO Auto-generated method stub
		Log.e("GifImageView", "start:"+isGif);
		if(isGif){
			//当前时间 
			long curTime = android.os.SystemClock.uptimeMillis();  
	        
			//如果第一帧,记录起始时间  
	        if(mMovieStart == 0){  
	            mMovieStart = curTime;  
	        }  
	        
	        if(mMovie != null){  
	        	//取出动画的时长  
	        	int duration = mMovie.duration();  
	
	            if(duration==0){
	            	duration = 1000;
	            }
	            
	            Log.e("GifImageView", "duration:"+duration);
	            
	            //算出需要显示第几帧  
	            int relTime = (int)((curTime - mMovieStart)% duration);  
	            
	            //设置要显示的帧,绘制
	            mMovie.setTime(relTime);  
	            mMovie.draw(canvas, 0, 0);  
	              
	            //强制重绘    
	            invalidate();  
	        }  
		}else{
			super.onDraw(canvas);
		}
	}

	public void setImageResource(Bitmap bitmap, boolean isGifPic,int gifResId) {
		// TODO Auto-generated method stub
		isGif = isGifPic;
		
		if(isGif){
			//以文件流的方式读取文件  
            mMovie = Movie.decodeStream(getResources().openRawResource(resId));  
            invalidate(); //强制刷新,其实就是执行以下onDraw方法
            return;
		}else{
			super.setImageBitmap(bitmap);
		}
	}
}

图片:

android之视频的播放(VedioView,SuefaceView)和图片的获得

1、视频播放方式一:直接用VideoView 布局文件:
  • mr_lihaimeng
  • mr_lihaimeng
  • 2015年09月15日 19:57
  • 586

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
  • 30608

Android 中使用ImageView实现播放Gif图片功能

概述最近在项目中遇到需要展示Gif图片的功能,我们知道原生ImageView是不支持播放Gif的,但是Android为我们提供了一个类可以实现该功能:android.graphics.Movie。...
  • yuminfeng728
  • yuminfeng728
  • 2016年08月12日 18:10
  • 799

ImageView加载gif图片

默认情况下,OC中的控件imageView不能加载gif图片,自己搜集到了3中方式,提供一个方便,推荐使用第一个方案,比较方便 1、github上面的一些第三方可以很好的解决,并且很好用,非常方便 ...
  • shdowLi
  • shdowLi
  • 2015年12月08日 15:34
  • 1106

Android学习之ImageView放置gif动态图

最近做图片的时候碰到一个问题,就是imageview控件中放动态图,显示出来的效果跟静态图是一样的。于是我网上大概找了一下资料,对于这方面大概有三个解决方法 一、将gif用工具分割,一帧一帧的播放这...
  • jiapeng2b
  • jiapeng2b
  • 2015年08月23日 22:05
  • 8586

自定义ImageView显示gif图片

/** * PowerImageView是一个经过扩展的ImageView,它不仅继承了ImageView原生的所有功能,还加入了播放GIF动画的功能。 * * @author guolin ...
  • u011057161
  • u011057161
  • 2014年05月08日 22:38
  • 1318

Android疑难杂症之(ImageView播放gif遇到的坑)

最近做项目需要用到gif图片,项目中直接用的Glide的gif加载,还没有时间去研究Glide的源码的,不得不说Glide很强大啊,以前在郭神的博客中看到了一个播放Gif的ImageView,于是打算...
  • vv_bug
  • vv_bug
  • 2016年09月29日 18:01
  • 3105

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

Android加载Gif和ImageView的通用解决方案:android-gif-drawable Android自己的ImageView或者View不能直接加载运行Gif图片,如果要在一个And...
  • u010983763
  • u010983763
  • 2017年03月20日 20:36
  • 812

自定义ImageView,展示gif图或者利用帧动画展示动图

自定义ImageView,展示gif图或者利用帧动画展示动图
  • u014620028
  • u014620028
  • 2016年12月28日 12:06
  • 690

Android显示Gif图片

关于android显示gif图片的方法有许多种。我试了许多方法之后,觉得都不是很理想。庆幸的是,查看了这篇博客加载网络gif图片之后,我总算找到了理想的方法,在此博客的基础上,本博客将讲解得更详细,更...
  • u014473226
  • u014473226
  • 2015年08月13日 17:33
  • 742
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android之ImageView既能普通图片又能显示gif的方法
举报原因:
原因补充:

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