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);
		}
	}
}

图片:



相关文章推荐

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

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

 Android加载Gif和ImageView的通用解决方案:android-gif-drawable(1) Android自己的ImageView或者View不能直接加载运行Gif图片,如果...

android中使用imageview显示Gif图片

http://blog.csdn.net/riyuegonghe/article/details/9283479 http://weavora.com/blog/2012/02/07/android...

Android学习之ImageView放置gif动态图

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

支持GIF动画的ImageView

http://blog.csdn.net/yarkey09/article/details/13022387 网上有很多关于怎么实现android播放GIF的帖子。但是本人发现,其中...

android中使用imageview显示Gif图片

大家都知道,Android开发模拟器为了节省内存,一般不支持直接显示gif图片,即使你强制设置了,也只会显示图片的第一帧。看到网上也有许多的方法,来实现此功能,可都比较的繁琐,需要修改android源...

保证服务既能长期运行,又能调用服务里的方法的方案

保证服务既能长期运行,又能调用服务里的方法的方案: 步骤一:startService方式启动服务,会执行服务的onCreate方法和onStartCommand方法; 步骤二:bindServic...

自定义ImageView显示gif图片

  • 2014年05月08日 22:46
  • 3.66MB
  • 下载

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

概述最近在项目中遇到需要展示Gif图片的功能,我们知道原生ImageView是不支持播放Gif的,但是Android为我们提供了一个类可以实现该功能:android.graphics.Movie。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android之ImageView既能普通图片又能显示gif的方法
举报原因:
原因补充:

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