最近做项目需要用到gif图片,项目中直接用的Glide的gif加载,还没有时间去研究Glide的源码的,不得不说Glide很强大啊,以前在郭神的博客中看到了一个播放Gif的ImageView,于是打算跟着敲一遍咯。
原文链接先附上:http://blog.csdn.net/sinyu890807/article/details/11100315
思路:
利用Movie类去播放gif格式文件,然后不断的画在当前ImageView的canvas上,以帧计算。
这样说可能有点抽象,直接上代码了。
不懂的自己去郭神博客(^__^) 嘻嘻……
下面说说其中的几个坑的地方:
1、有很多童鞋想必一开始也跟我一样,就是在XML中给ImageView设置了src=”@drawable\xxxx”,然后我们在代码中需要拿到对应资源的id,对代码中的利用反射获取resouceId不明白,下面带着大家一起撸一撸代码。
text.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.yqy.dialogdemo.MainActivity">
<com.yqy.dialogdemo.AnimaImageView
android:layerType="software"
android:layout_centerInParent="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:auto_play="false"
android:src="@drawable/cat"/>
</RelativeLayout>
其中我们的android:src=”@drawable/cat”是一张gif图片,然后我们在下面的代码中需要拿到对应的id。
private void obtainStyledAttr(Context context, AttributeSet attrs, int defStyleAttr) {
TypedArray a=context.getTheme().obtainStyledAttributes(attrs,R.styleable.AnimaImageView,defStyleAttr,0);
int resId=getIdentifier(a);
if(resId!=0){
// 当资源id不等于0时,就去获取该资源的流
InputStream is=getResources().openRawResource(resId);
// 使用Movie类对流进行解码
mMovie=Movie.decodeStream(is);
//mMovie不等null说明这是一个GIF图片
if(mMovie!=null){
//是否自动播放
isAutoPlay=a.getBoolean(R.styleable.AnimaImageView_auto_play,false);
/**
* 获取gif图片大小
*/
Bitmap bitmap= BitmapFactory.decodeStream(is);
bitmapSize=new BitmapSize(bitmap.getWidth(),bitmap.getHeight());
bitmap.recycle();
if(!isAutoPlay){
// 当不允许自动播放的时候,得到开始播放按钮的图片,并注册点击事件
mStartBotton=BitmapFactory.decodeResource(getResources(),R.mipmap.icon_play);
setOnClickListener(