自定义GIFView的用法:
1、导入GIFView的jar包:地址:http://download.csdn.net/detail/weiwozhiyi/9396922
2、在布局文件写上:
<com.ant.liao.GifView android:id="@+id/gifview1" android:layout_width="300dp" android:layout_height="200dp" android:layout_marginTop="10dp" android:background="#888"/>
gifview1 = (GifView) findViewById(R.id.gifview1); gifview1.setShowDimension(600, 200);//设置GIFView中的图片显示大小 gifview1.setGifImage(R.drawable.boy);//设置GifView显示的资源
gifview1.showAnimation();//播放 gifview1.showCover();//暂停
接下来来书写自己的自定义GIFView:
1、在style.xml来声明属性,用来在布局文件中引用:
<declare-styleable name="gifview"> <attr name="src" format="reference"/><--! 声明属性为src 格式为引用类型 !--> </declare-styleable>
public GifView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); resources = context.getResources(); TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.gifview); int id = ta.getResourceId(R.styleable.gifview_src, -1);//得到在xml中资源,如果不存在则为-1 setGifViewResouce(id);//为GIFView设置资源 ta.recycle();//释放 }
private void setGifViewResouce(int id) { if (id == -1) { return; } InputStream input = resources.openRawResource(id); movie = Movie.decodeStream(input); requestLayout();//重新进行布局 }
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); long now = android.os.SystemClock.uptimeMillis();//定义一个递增的数值 if (mMovieStart == 0) { mMovieStart = now; } if (movie != null) { int duration = movie.duration();//得到gif图片的时长 if (duration == 0) { duration = 1000; } int relTime = (int) ((now - mMovieStart) % duration); movie.setTime(relTime);//设置Movie的时间,通过传入瞬时时间来画出该时间下的图像 movie.draw(canvas, getWidth() - movie.width(), getHeight() - movie.height());//将gif图片设置到控件的右下角 invalidate();//对控件进行重绘,在UI线程用invalidate()如果在子线程用postInvalidate()方法 } }
4、布局文件(要引入在1、中定义的属性需要在根布局写上AndroidStudio:xmlns:gif="http://schemas.android.com/apk/res-auto" Eclipse:xmlns:gif="http://schemas.android.com/apk/res/应用的包名")
<com.example.administrator.gifviewapp.GifView android:id="@+id/gifview" android:layout_width="300dp" android:layout_height="200dp" android:background="#888" gif:src="@drawable/boy"/>
然后并不能很好的进行显示,为此需要对Gif图片进行缩放,为了得到缩放比只需要重写onMessure方法
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); if(movie != null){ int w = movie.width(); if (w <= 0) { w = 1; } int h = movie.height(); if (h <= 0) { h = 1; } int pleft = getPaddingLeft(); int pright = getPaddingRight(); int ptop = getPaddingTop(); int pbottom = getPaddingBottom(); int widthSize; int heightSize; w += pleft + pright; h += ptop + pbottom; w = Math.max(w, getSuggestedMinimumWidth());//子类应确保测量的height和width至少是view的最小高度和宽度 h = Math.max(h, getSuggestedMinimumHeight()); widthSize = resolveSizeAndState(w, widthMeasureSpec, 0);//用来创建最终的宽和高 heightSize = resolveSizeAndState(h, heightMeasureSpec, 0); scaleW = (float)widthSize/w; scaleH = (float)heightSize/h; setMeasuredDimension(widthSize, heightSize); }else{ setMeasuredDimension(widthMeasureSpec,heightMeasureSpec); } }
movie.draw(canvas, getWidth() - movie.width(), getHeight() - movie.height());
改为:
float scale = Math.min(scaleW,scaleH);
canvas.scale(scale,scale);
movie.draw(canvas, 0, 0);