现在的位置: 首页 > 综合 > 正文

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

2013年02月06日 ⁄ 综合 ⁄ 共 2639字 ⁄ 字号 评论关闭

最近项目有个需求,就是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);
		}
	}
}

图片:

【上篇】
【下篇】

抱歉!评论已关闭.