最近遇到Android中加載GIF圖片带迟,而Android目前還不支持GIF圖片的加載登疗。查詢后發(fā)現(xiàn)很多第三方網(wǎng)絡(luò)請(qǐng)求框架支持GIF圖片的加載碾盐。
第一種:gifView?
這個(gè)需要通過(guò)google【翻墻下載】,下載完了demo和jar包之后需要將jar包放入工程中的lib文件夾中备韧,然后添加到library中辞居。在xml問(wèn)價(jià)中填寫(xiě)布局為:
<com.ant.liao.GifView
? ? android:id="@+id/gif"
? ? android:layout_height="wrap_content"
? ? android:layout_width="wrap_content"
? ? android:paddingRight="12px" android:enabled="false"/>
使用gitView需要提前將展示GIF圖片存放到res/drawable中焙矛,最大的問(wèn)題竟然多次加載之后會(huì)導(dǎo)致OOM葫盼,所以放棄使用!
第二種:android-gif-drawable非常好的一個(gè)開(kāi)源框架
https://github.com/koral--/android-gif-drawable目前已有5.5K??村斟。
如果我們是直接從資源文件中加載GIF圖只需要贫导,將此框架導(dǎo)入項(xiàng)目中,在布局里調(diào)用就好啦蟆盹!
compile 'pl.droidsonroids.gif:android-gif-drawable:1.2.10'
布局中代碼:
<pl.droidsonroids.gif.GifImageView
? ? android:background="@drawable/loading"
? ? android:layout_gravity="center"
? ? android:layout_width="wrap_content"
? ? android:layout_height="wrap_content"/>
通過(guò)src引入或者直接background都是可以的孩灯。
public static Dialog ShowDialog(Context context){
? ? /**
? ? * 加載View
? ? */
? ? LayoutInflater inflater = LayoutInflater.from(context);
? ? View view = inflater.inflate(R.layout.activity_dialog, null);
? ? LinearLayout dialogView = (LinearLayout) view.findViewById(R.id.dialog_view);
? ? Dialog dialog = new Dialog(context,R.style.myDialogTheme);
? ? dialog.setContentView(dialogView);//dialog中加載的view示圖
? ? dialog.setCanceledOnTouchOutside(false);
? ? Window window = dialog.getWindow();
? ? WindowManager.LayoutParams layoutParams = window.getAttributes();
? ? layoutParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
? ? layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
? ? window.setGravity(Gravity.CENTER);
? ? window.setAttributes(layoutParams);
? ? dialog.show();
? ? return dialog;
}
/**
* 關(guān)閉dialog
* @param mDialogUtils
*/
public static void closeDialog(Dialog mDialogUtils) {
? ? if (mDialogUtils != null && mDialogUtils.isShowing()) {
? ? ? ? mDialogUtils.dismiss();
? ? }
這里創(chuàng)建了一個(gè)DialogUtil工具類,里面創(chuàng)建一個(gè)自定義的Dialog逾滥,在MainActivity中
case R.id.other_main:
? ? mDialog = DialogUtils.ShowDialog(MainActivity.this);
? ? mHandler.sendEmptyMessageDelayed(1, 5000);
? ? break;
通過(guò)Handler來(lái)進(jìn)行實(shí)現(xiàn)Dialog5秒后關(guān)閉峰档。
case 1:
? ? DialogUtils.closeDialog(mDialog);
? ? break;
第三種:使用網(wǎng)絡(luò)圖片加載框架,這里我們以Glide為例:
同樣的自定義一個(gè)Dialog
public static Dialog GildeImage(Context context){
? ? ? ? LayoutInflater inflater = LayoutInflater.from(context);
? ? ? ? View view = inflater.inflate(R.layout.gidle_dialog, null);
? ? ? ? LinearLayout dialogView_ll = (LinearLayout) view.findViewById(R.id.gilde_ll);
? ? ? ? Dialog dialog = new Dialog(context,R.style.myDialogTheme);
? ? ? ? dialog.setContentView(dialogView_ll);//dialog中加載的view示圖
? ? ? ? dialog.setCanceledOnTouchOutside(false);
? ? ? ? /**
? ? ? ? * gilde直接加載本地GIF圖片
? ? ? ? */
? ? ? ? ImageView glide_img = (ImageView) dialog.findViewById(R.id.gilde_img);
? ? ? ? /**
? ? ? ? * gif圖渲染完成之前寨昙,可以默認(rèn)一個(gè)比較小的圖片讥巡,但是網(wǎng)絡(luò)正常時(shí)這個(gè)等待也就200-300毫秒。所以可以忽略的毅待,
? ? ? ? 如果網(wǎng)絡(luò)很差尚卫,加載gif圖比較慢時(shí) 為了友好性 最好加載個(gè)本地的圖片作為友好提示
? ? ? ? */
? ? ? ? Glide.with(context).load(R.drawable.loading1)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? .placeholder(R.mipmap.ic_launcher_round).into(glide_img);
//? ? ? ? ? ? ? ? diskCacheStrategy(DiskCacheStrategy.ALL).into(glide_img);
? ? ? ? Window window = dialog.getWindow();
? ? ? ? WindowManager.LayoutParams layoutParams = window.getAttributes();
? ? ? ? layoutParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
? ? ? ? layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
? ? ? ? window.setGravity(Gravity.CENTER);
? ? ? ? window.setAttributes(layoutParams);
? ? ? ? dialog.show();
? ? ? ? return dialog;
? ? }
這里就用到了Glide的強(qiáng)大之處:
可以直接load(url) url圖片的地址進(jìn)行網(wǎng)絡(luò)請(qǐng)求,這里需要在配置文件中聲明網(wǎng)絡(luò)請(qǐng)求的權(quán)限
<uses-permission android:name="android.permission.INTERNET"/>
這里我們演示的是直接在本地加載GIF圖片
/**
? ? ? ? * gilde直接加載本地GIF圖片
? ? ? ? */
//? ? ? ? Glide.with(context).load(R.drawable.loading1).into(glide_img);
? ? ? ? /**
? ? ? ? * gif圖渲染完成之前尸红,可以默認(rèn)一個(gè)比較小的圖片吱涉,但是網(wǎng)絡(luò)正常時(shí)這個(gè)等待也就200-300毫秒刹泄。
? ? ? ? * 所以可以忽略的,如果網(wǎng)絡(luò)很差怎爵,加載gif圖比較慢時(shí) 為了友好性 最好加載個(gè)本地的圖片作為友好提示
? ? ? ? */
? ? ? ? Glide.with(context).load(R.drawable.loading1)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? .placeholder(R.mipmap.ic_launcher_round).into(glide_img);
? ? ? ? /**
? ? ? ? * 這里可以知行緩存 然后將緩存中的圖片數(shù)據(jù) 添加到glide_img空間中
? ? ? ? */
//? ? ? ? Glide.with(context).load(存放圖片的url).diskCacheStrategy(DiskCacheStrategy.ALL).into(glide_img);
項(xiàng)目地址:https://github.com/yangziling/YF_GIT.git