Android疑难杂症之(ImageView播放gif遇到的坑)

本文详细介绍了在Android中使用ImageView播放gif时遇到的问题及解决方案,包括通过反射获取资源ID,解决硬件加速导致的显示问题,并提供完整代码示例。
摘要由CSDN通过智能技术生成

最近做项目需要用到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(
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值