1.自定义的显示动态的类
package cq.cake.gifimageview; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Movie; import android.os.SystemClock; import android.util.AttributeSet; import android.util.Log; import android.util.TypedValue; import android.view.View; import android.widget.ImageView; import java.io.InputStream; import java.lang.reflect.Field; /** * My Application -- cq.cake.gifimageview * Created by Small Cake on 2016/2/20 9:55. */ public class GifImageVeiw extends ImageView implements View.OnClickListener { /**播放gif图片的关键类*/ private Movie mMovie; /**开始播放的按钮图片*/ private Bitmap mStartButton; /**记录动画开始的时间*/ private long mMovieStartTime; /**Gif图片的宽度*/ private int mImageWidth; /**Gif图片的高度*/ private int mImageHeight; /**图片是否正在播放*/ private boolean isPlaying; /**是否允许自动播放*/ private boolean isAutoPlay; public GifImageVeiw(Context context) { super(context); Log.e(">>>", "初始化1"); } public GifImageVeiw(Context context, AttributeSet attrs) { this(context, attrs, 0); Log.e(">>>", "初始化2"); } /**PowerImageView构造函数,在这里完成所有必要的初始化操作。 */ public GifImageVeiw(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); Log.e(">>>", "初始化3"); //得到自定义样式 TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.GifImageView); //得到资源ID int resourceId = getResourceId(a, context, attrs); Log.e(">>>", "资源ID:"+resourceId); if (resourceId!=0){ //获取资源流 InputStream is = getResources().openRawResource(resourceId); //使用Movie类对流进行解码 mMovie = Movie.decodeStream(is); if (mMovie!=null){ Log.e(">>>","是Gif图片"); //如果返回值不等于null,就说明这个是张Gif图片,下面获取是否自动播放的属性 isAutoPlay = a.getBoolean(R.styleable.GifImageView_auto_play, false); Bitmap bitmap = BitmapFactory.decodeStream(is);//流转换为图片 //得到图片的宽和高 mImageWidth = bitmap.getWidth(); mImageHeight = bitmap.getHeight(); //释放图片资源 bitmap.recycle(); if (!isAutoPlay){ Log.e(">>>","不自动播放"); //如果设置为不自动播放,则显示播放按钮,并添加事件 mStartButton = BitmapFactory.decodeResource(getResources(),R.drawable.ic_menu_play_clip); setOnClickListener(this); } } } } /** * 通过Java反射,获取到src指定图片资源所对应的id。 * @param a //类型数据集 * @param context 上下文 * @param attrs 自定义设置 * @return 返回布局文件中指定图片资源所对应的id,没有指定任何图片资源就返回0。 */ private int getResourceId(TypedArray a,Context context,AttributeSet attrs){ try { Field field = TypedArray.class.getDeclaredField("mValue"); field.setAccessible(true);//设置可以访问私有属性 TypedValue typedValue = (TypedValue) field.get(a); return typedValue.resourceId; } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } return 0; } @Override public void onClick(View v) { if (v.getId()==getId()){ //当用户点击图片时,开始播放Gif动画 isPlaying = true; //刷新控件,会强制调用onDraw()方法 invalidate(); } } @Override protected void onDraw(Canvas canvas) { if (mMovie==null){ //如果mMovie为null,说明不是Gif图片 super.onDraw(canvas); }else{ //如果mMovie不为null,说明是Gif图片 if (isAutoPlay){//如果设置的是自动播放,直接调用playMovie方法播放 playMovie(canvas); invalidate(); }else {//不允许自动播放时,判断图片是否正在播放 if (isPlaying) { //1.图片正在播放 if (playMovie(canvas)) { //如果正在播放,就继续调用playMovie方法,直到播放结束 isPlaying = false; } invalidate(); }else{ //2.如果图片还没有开始播放,就绘制Gif图片的第一帧,并添加播放按钮 mMovie.setTime(0); mMovie.draw(canvas,0,0); int offsetW = (mImageWidth-mStartButton.getWidth())/2; int offsetH = (mImageHeight-mStartButton.getHeight())/2; //取中间位置进行绘制 Log.e(">>>","绘制开始按钮"); canvas.drawBitmap(mStartButton,offsetW,offsetH,null); } } } } /** * 测量图片的宽高 * @param widthMeasureSpec * @param heightMeasureSpec */ @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); if (mMovie!=null){ //如果是Gif图片,。 setMeasuredDimension(mImageWidth,mImageHeight); } } /** * 播放Gif图片 * 播放完毕返回true,未完成false * @param canvas */ private boolean playMovie(Canvas canvas) { // 1.SystemClock.uptimeMillis()从开机到现在的毫秒数(手机睡眠的时间不包括在内);2。System.currentTimeMillis() // 从1970年1月1日 UTC到现在的毫秒数 //但是,第2个时间,是可以通过System.setCurrentTimeMillis修改的,那么,在某些情况下,一但被修改,时间间隔就不准了。 long now = SystemClock.uptimeMillis(); if (mMovieStartTime==0){ mMovieStartTime=now; } //持续时间 int duration = mMovie.duration(); Log.e(">>>","持续时间为:"+duration); if (duration==0){ duration=1000; } //真实时间 int relTime = (int) ((now - mMovieStartTime)%duration); mMovie.setTime(relTime); mMovie.draw(canvas,0,0); if ((now - mMovieStartTime)>=duration){ mMovieStartTime = 0; return true; } return false; } }然后直接在xml中使用就可以了,设置src为动态图片的地址就可以了!
效果图片:
最后源码地址:Android的GifView