自定义GIFView的用法:
首先先来看看别人提供的自定义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"/>
然后在Activity生成GIFView对象
gifview1 = (GifView) findViewById(R.id.gifview1);
gifview1.setShowDimension(600, 200);//设置GIFView中的图片显示大小
gifview1.setGifImage(R.drawable.boy);//设置GifView显示的资源
另外还能控制GIFView的播放和暂停,相应的方法为:
gifview1.showAnimation();//播放
gifview1.showCover();//暂停
其它的属性可以自己来尝试。
接下来来书写自己的自定义GIFView:
1、在style.xml来声明属性,用来在布局文件中引用:
<declare-styleable name="gifview">
<attr name="src" format="reference"/><--! 声明属性为src 格式为引用类型 !-->
</declare-styleable>
2、定义GIFView继承View,构造方法:
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();//重新进行布局
}
3、接下来只需要Movie类结合onDraw方法来将动态的动画绘画出来
@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"/>
在此就能显示一个GIFView了
然后并不能很好的进行显示,为此需要对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);
}
}
然后更改onDraw方法中的
movie.draw(canvas, getWidth() - movie.width(), getHeight() - movie.height());
改为:
float scale = Math.min(scaleW,scaleH);
canvas.scale(scale,scale);
movie.draw(canvas, 0, 0);