android显示网络gif图片

这功能源自负责app中要加一个显示gif广告图功能。

android自带控件不支持gif图片,网上很多通过扩展ImageView或View来实现支持gif图片,但在android4.0后,需要关闭硬件加速功能才能使用,而且也容易出现内存溢出问题。

网上找了两个开源包来实现显示Gif图

android-gif-drawable 支持gif显示的view控件

项目地址:https://github.com/koral--/android-gif-drawable

用jni实现的,编译生成so库后直接xml定义view,据说性能比较好,也能比较好避免内存内存溢出问题。

在Android Studio项目添加使用:

build.gradle文件dependencies添加内容:

dependencies {

compile ‘pl.droidsonroids.gif:android-gif-drawable:1.1.+‘ /* 添加gif控件库引用 */

}

xUtils

项目地址:https://github.com/wyouflf/xUtils

包含了很多实用的android工具,这里主要用它下载文件

MainActivity.java

package com.penngo.gif;

import android.app.Activity;
import android.content.Context;
import android.os.Environment;
import android.os.Bundle;
import android.util.Log;
import com.lidroid.xutils.HttpUtils;
import com.lidroid.xutils.exception.HttpException;
import com.lidroid.xutils.http.ResponseInfo;
import com.lidroid.xutils.http.callback.RequestCallBack;

import java.io.File;

import pl.droidsonroids.gif.GifDrawable;
import pl.droidsonroids.gif.GifImageView;

/**
 *
 * https://github.com/koral--/android-gif-drawable
 * https://github.com/wyouflf/xUtils
 */
public class MainActivity extends Activity {
    private final String tag = "MainActivity-->";
    private GifImageView gif1;
    private GifImageView gif2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        gif1 = (GifImageView)this.findViewById(R.id.info_gif1);
        gif2 = (GifImageView)this.findViewById(R.id.info_gif2);
        initGif();
    }

    private void initGif(){
        String url1 = "http://img5.imgtn.bdimg.com/it/u=3026352344,1511311477&fm=21&gp=0.jpg";
        String url2 = "http://img5.imgtn.bdimg.com/it/u=808161139,2623525132&fm=21&gp=0.jpg";
        File saveImgPath = this.getImageDir(this);
        File gifSavePath1 = new File(saveImgPath, "gif1");
        File gifSavePath2 = new File(saveImgPath, "gif2");

        displayImage(url1, gifSavePath1, gif1);
        displayImage(url2, gifSavePath2, gif2);
    }

    public void displayImage(String url, File saveFile, final GifImageView gifView){
        HttpUtils http = new HttpUtils();
        // 下载图片
        http.download(url, saveFile.getAbsolutePath(), new RequestCallBack<File>() {
            public void onSuccess(ResponseInfo<File> responseInfo) {
                try {
                    Log.e(tag, "onSuccess========" + responseInfo.result.getAbsolutePath());
                    GifDrawable gifFrom = new GifDrawable( responseInfo.result.getAbsolutePath() );
                    gifView.setImageDrawable(gifFrom);
                }
                catch(Exception e){
                    Log.e(tag, e.getMessage());
                }
            }
            public void onFailure(HttpException error, String msg) {
                Log.e(tag, "onFailure========" + msg);
            }
        });
    }

    public File getFilesDir(Context context, String tag){
        if(isSdCardExist() == true){
            return context.getExternalFilesDir(tag);
        }
        else{
            return context.getFilesDir();
        }
    }

    public File getImageDir(Context context){
        File file = getFilesDir(context, "images");
        return file;
    }

    public boolean isSdCardExist() {
        if (Environment.getExternalStorageState().equals(
                Environment.MEDIA_MOUNTED)) {
            return true;
        }
        return false;
    }
}

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <TextView android:text="@string/label_info"
        android:id="@+id/info"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <!-- gif控件 -->
    <pl.droidsonroids.gif.GifImageView
        android:id="@+id/info_gif1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:scaleType="fitXY"
        android:layout_below="@+id/info"
        />

    <pl.droidsonroids.gif.GifImageView
        android:id="@+id/info_gif2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:scaleType="fitXY"
        android:layout_below="@+id/info_gif1"
        />
</RelativeLayout>

运行效果:

时间: 2024-11-05 06:25:20

android显示网络gif图片的相关文章

android从网络获取图片

http://blog.csdn.net/wangjinyu501/article/details/8219317 http://www.cnblogs.com/JerryWang1991/archive/2012/03/09/2388312.html http://blog.csdn.net/liuhe688/article/details/6532519 http://blog.csdn.net/abc5382334/article/details/17097633 http://www.t

Android 通过网络获取图片的源码

将开发过程中经常用到的内容做个备份,如下的资料是关于Android 通过网络获取图片的的内容. package com.netimg; import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Bundle;import android.view.View;import android.view.View.OnClickLis

32Spannable的使用(Android显示html带图片 (表情开发))

Android中显示html文件要用Html.fromHtml(...)处理过的返回值,返回值可以成为setText()的参数.只显示带文本的html可以用下面的方法处理html文件. public static Spanned fromHtml (String source) 显示带图片的html要用下面的方法处理html文件. public static Spanned fromHtml (String source, Html.ImageGetter imageGetter, Html.T

Android 显示Gif 动态图片

项目(showgif)已推到GitHub,查看文末的链接即可下载. 显示如下一张Gif动态图片: 看一下在demo中的效果: 按钮用来暂停和继续.看一下代码逻辑实现: package com.zms.showgif; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import and

Android显示等宽图片的问题

安卓开发常遇到一个问题,就是在listView里面,在不知道图片宽高的前提下,另图片布满屏幕(图片宽度等于屏幕宽度,高度自适应).在listView中,只是设置scaleType,imageView.setBackground()是一定程度上导致图片拉伸失真,setImageDrawable()则不能满屏.参考网上的几种方案,自己总结了一个比较简单可用的: imageView布局: 1 <ImageView 2 android:id="@+id/imgIco" 3 android

android 显示目录下图片

知识点 1. 网格视图 2. 读取文件 MainAcitvity package com.test.gridview; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.GridView; import android.widget.

使用SimpleAdapter 适配器时显示网络上图片方法

SimpleAdapter listItemAdapter = new SimpleAdapter(this, listItem, R.layout.items_list, new String[] { "imagePath", "name", "njname", "length", "id" }, new int[] { R.id.imagePath, R.id.name, R.id.njname, R.

Android ListView从网络获取图片及文字显示

从网络获取图片以及文本来显示.事实上,一般是先获取Josn或sml数据,然后解释显示.我们先从网上获取xml,然后对其进行解析,最后显示在ListView上.具体步骤: 客户端发出请求,获取xml 客户端异步解析xml ListView将解析完的数据显示 一.Android客户端 (1)xml布局文件         mainxml,就是一个ListView. [java] view plaincopy <?xml version="1.0" encoding="utf

android客户端加载网络大图片如何避免内存溢出

在Android开发中加载sdcard上的大图片到内存时容易导致OOM异常,常见的解决办法是基于BitmapFactory.Options类提供的方法定义指定的解码方式,设置inJustDecodeBounds属性为true,避免分配内存,返回一个null的Bitmap对象(包含outWidth,outHeightandoutMimeType),然后读取图片的尺寸和类型.再根据屏幕的高和宽对图片进行缩放,最后将缩放的图片加载到内存,主要代码如下: 1 Options opts = new Opt