最近因为做项目要用到Gif图片,但是网上的介绍有点乱,可能有点不适合我吧,所以就结合网上的自己做了一个Demo。希望可以帮到大家
1.使用第三方控件GifImageView加载网络图片
工具:
- Android studio
第三方工具类:
- GifImageView
- OkHttp, 自己去maven库搜okhttp和okio就行了
- EventBus,自己去maven库搜索compile ‘org.greenrobot:eventbus:3.0.0’就行
使用OKHttp异步加载数据,然后使用EventBus将数据发出去。网址是随便从网上找的,有点重口,慎用!!
第三方工具(okhttp和okio我直接用的jar包):
compile 'pl.droidsonroids.gif:android-gif-drawable:1.1.+'
compile 'org.greenrobot:eventbus:3.0.0'
HttpOk.java:
import org.greenrobot.eventbus.EventBus;
import java.io.IOException;
import okhttp3.HttpUrl;
import okhttp3.OkHttpClient;
import okhttp3.Response;
/**
* Created by Administrator on 2016/11/3.
*/
public class HttpOk {
public void doGetData(){
OkHttpClient okHttpClent = new OkHttpClient();
okhttp3.Request request = new okhttp3.Request.Builder().url("http://dimg.spriteapp.cn/ugc/2016/11/02/5819746890d01.gif").addHeader("User-Agent","BiLiBiLi WP Client/4.20.0 (orz@loli.my)").build();
okhttp3.Call call = okHttpClent.newCall(request);
call.enqueue(
new okhttp3.Callback() {
@Override
public void onFailure(okhttp3.Call call, IOException e) {
}
@Override
public void onResponse(okhttp3.Call call, Response response) throws IOException {
int code = response.code();
if (code ==200) {
byte[] data = response.body().bytes();
HttpUrl reqUrl = call.request().url();
EventBus.getDefault().post(data);
}
}
}
);
}
}
然后就是展示了,因为EvevtBus传回来的数据不是在UI线程,所以不能在onEvent里面直接接收数据更新界面,所以我使用了一个handle进行线程间的通信
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import java.io.IOException;
import pl.droidsonroids.gif.GifDrawable;
import pl.droidsonroids.gif.GifImageView;
public class MainActivity extends AppCompatActivity {
private final String tag = "MainActivity-->";
private GifImageView gif1;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
Object obj = msg.obj;
if (obj instanceof byte[]) {
byte[] data = (byte[]) obj;
GifDrawable gifFrom = null;
try {
gifFrom = new GifDrawable(data);
gif1.setImageDrawable(gifFrom);
} catch (IOException e) {
e.printStackTrace();
}
}
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
gif1 = (GifImageView) this.findViewById(R.id.info_gif1);
HttpOk httpOk = new HttpOk();
httpOk.doGetData();
EventBus.getDefault().register(this);
}
@Override
protected void onDestroy() {
EventBus.getDefault().unregister(this);
super.onDestroy();
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEvent(byte[] data) {
Message message = handler.obtainMessage(1);
message.obj = data;
handler.sendMessage(message);
}
}
MainActivity的布局文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
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.example.dddddemo.MainActivity">
<pl.droidsonroids.gif.GifImageView
android:id="@+id/info_gif1"
android:layout_width="200dp"
android:layout_height="200dp"
android:scaleType="fitXY"
/>
</RelativeLayout>
2.ListView或RecycleView加载网络动态图片
工具:
- Android studio
使用到的第三方:
compile 'pl.droidsonroids.gif:android-gif-drawable:1.1.+'
上面的回调数据是在子线程,那么我想要在ListView的adapter里面进行图片的绑定该怎么办呢?因为知道的很少,不知道能不能在adapter里面使用handle进行线程间数据的通信,这个等会试一下再说,估计也不会试,有人试了跟我说一声,哈哈。现在我用的是另外一个方法,使用异步任务进行数据的加载,那样就不会就可以解决数据加载到控件上(里面添加了LRU的缓存)。
网络请求的异步任务的类:(GifImageLoader.java)
import android.os.AsyncTask;
import android.os.Build;
import android.support.annotation.RequiresApi;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import pl.droidsonroids.gif.GifDrawable;
import pl.droidsonroids.gif.GifImageView;
/**
* Created by Administrator on 2016/11/3.
*/
public class GifImageLoader extends AsyncTask<String, Void, GifDrawable> {
private GifImageView gifImageView;
private String url;
public GifImageLoader(GifImageView gifImageView) {
this.gifImageView = gifImageView;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
GifImageLoader loader = (GifImageLoader) gifImageView.getTag();
if (loader != null) {
loader.cancel(false);
}
gifImageView.setTag(this);
}
@Override
protected GifDrawable doInBackground(String... params) {
url = params[0];
try {
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
connection.setRequestMethod("GET");
connection.setDoInput(true);
int code = connection.getResponseCode();
if (code == 200) {
InputStream inputStream = connection.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] bytes = new byte[10240];
int len = 0;
while ((len = inputStream.read(bytes)) != -1) {
baos.write(bytes, 0, len);
}
byte[] data = baos.toByteArray();
GifDrawable gifDrawable = new GifDrawable(data);
return gifDrawable;
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(GifDrawable gifDrawable) {
super.onPostExecute(gifDrawable);
if (gifDrawable != null) {
try {
gifImageView.setImageDrawable(gifDrawable);
} catch (Exception e) {
e.printStackTrace();
}
} else {
}
gifImageView.setTag(null);
}
@RequiresApi(api = Build.VERSION_CODES.HONEYCOMB_MR1)
@Override
protected void onCancelled(GifDrawable gifFrom) {
if (gifFrom != null) {
GifUtil.cache.put(url, gifFrom);
}
}
}
然后是实现图片缓存功能的类()
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.util.LruCache;
import pl.droidsonroids.gif.GifDrawable;
import pl.droidsonroids.gif.GifImageView;
/**
* Created by Administrator on 2016/11/3.
*/
@RequiresApi(api = Build.VERSION_CODES.HONEYCOMB_MR1)
public class GifUtil {
static LruCache<String, GifDrawable> cache = new LruCache<String, GifDrawable>(5);
public static void loadImage(GifImageView gifImageView, String url) {
GifDrawable gifDrawable = cache.get(url);
if (gifDrawable != null) {
'//TODO:'
gifImageView.setImageDrawable(gifDrawable);
} else {
new GifImageLoader(gifImageView).execute(url);
}
}
}
接下来是GifView控件直接加载图片的语句代码,这句代码直接加载你的adapter里面要加载Gif图片的地方就行了
previewImage = ((GifImageView) itemView.findViewById(R.id.recommend_gif_previewImage));
'//gifUrl是图片的网址,previewImage是加载的控件对象'
GifUtil.loadImage(previewImage,gifUrl);
Gif布局(里面的属性自己随意):
<pl.droidsonroids.gif.GifImageView
android:id="@+id/recommend_gif_previewImage"
android:layout_width="400dp"
android:layout_height="300dp"
android:layout_gravity="center_horizontal"
android:scaleType="fitXY" />