現在在做一個項目,要加載gif動圖,查找了好多關于這方面的知識,終于解決了,為了下次能用的上,也為了能夠幫助其他人,寫下這篇博客。
<RelativeLayout
android:id="@+id/img_container"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="8dp"android:background="#FFF"android:visibility="visible"><ImageView
android:id="@+id/iv"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_centerInParent="true"android:contentDescription="@null"android:scaleType="centerCrop" /><ImageView
android:id="@+id/iv_gif"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:contentDescription="@null"android:src="@drawable/ic_play_gif"android:visibility="gone" /></RelativeLayout>
public class MainActivity extends Activity {private ImageView iv;
private ImageView ivGif;
@Overrideprotected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);iv = (ImageView) findViewById(R.id.iv);ivGif= (ImageView) findViewById(R.id.ivGif);ImageLoadProxy.initImageLoader(
this);
if (url.endsWith(
".gif")) {ivGif.setVisibility(View.VISIBLE);}
else {ivGif.setVisibility(View.GONE);}ImageLoadProxy.displayImage4Detail(url, iv,
new SimpleImageLoadingListener(){
@Overridepublic void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
super.onLoadingComplete(imageUri, view, loadedImage);}},
new ImageLoadingProgressListener() {
@Overridepublic void onProgressUpdate(String imageUri, View view,
int current,
int total) {}}););iv.setOnClickListener(
new OnClickListener() {
@Overridepublic void onClick(View v) {Intent intent =
new Intent(MainActivity.
this,PICtureDetailActivity.class);intent.putExtra(
"picurl", url);startActivity(intent);}});}
}
- 圖片詳情頁PictureDetailActivity布局文件
<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"><WebView android:layout_width="match_parent"android:layout_height="match_parent"android:id="@+id/webview"android:visibility="visible"/><uk.co.senab.photoview.PhotoView
android:id="@+id/img"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@android:color/black"/></RelativeLayout>
public class PictureDetailActivity extends BaseActivity{private WebView webView;private PhotoView img;private File imgCacheFile;@Overridepublic int bindLayout() {return R.layout.activity_detail_picture;}@SuppressLint("JavascriptInterface")@Overridepublic void initView(View view) {Intent intent = getIntent();final String picUrl = intent.getStringExtra("picurl");webView = (WebView) findViewById(R.id.webview);img = (PhotoView) findViewById(R.id.img);if(picUrl.endsWith(".gif")){webView.getSettings().setJavaScriptEnabled(true);webView.addJavascriptInterface(this, "external");webView.setWebViewClient(new WebViewClient() {@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {webView.loadUrl(url);return true;}});webView.setWebChromeClient(new WebChromeClient());webView.setBackgroundColor(Color.BLACK);img.setVisibility(View.GONE);ImageLoadProxy.displayImage4Detail(picUrl, img, newSimpleImageLoadingListener() {@Overridepublic void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {imgCacheFile = DiskCacheUtils.findInCache(picUrl, ImageLoadProxy.getImageLoader().getDiskCache());if (imgCacheFile != null) {String imgPath = "file://" + imgCacheFile.getAbsolutePath();showImgInWebView(imgPath);}}@Overridepublic void onLoadingStarted(String imageUri, View view) {}@Overridepublic void onLoadingFailed(String imageUri, View view, FailReason failReason) {}});}else{ImageLoadProxy.loadImageFromLocalCache(picUrl, newSimpleImageLoadingListener() {@Overridepublic void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {if (loadedImage.getHeight() > UIUtils.getScreenWidth(PictureDetailActivity.this)) {imgCacheFile = DiskCacheUtils.findInCache(picUrl, ImageLoadProxy.getImageLoader().getDiskCache());if (imgCacheFile != null) {String imgPath = "file://" + imgCacheFile.getAbsolutePath();img.setVisibility(View.GONE);showImgInWebView(imgPath);}} else {img.setImageBitmap(loadedImage);}}@Overridepublic void onLoadingStarted(String imageUri, View view) {}@Overridepublic void onLoadingFailed(String imageUri, View view, FailReason failReason) {}});}}protected void showImgInWebView(String imgPath) {if (webView != null) {webView.loadDataWithBaseURL("", "
<!doctype html> <html lang=\"en\"> <head> <meta charset=\"UTF-8\"> <title></title><style type=\"text/css\"> html,body{width:100%;height:100%;margin:0;padding:0;background-color:black;} *{ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);}#box{ width:100%;height:100%; display:table; text-align:center; background-color:black;} body{-webkit-user-select: none;user-select: none;-khtml-user-select: none;}#box span{ display:table-cell; vertical-align:middle;} #box img{ width:100%;} </style> </head> <body> <div id=\"box\"><span><img src=\"img_url\" alt=\"\"></span></div> <script type=\"text/javascript\" >document.body.onclick=function(e){window.external.onClick();e.preventDefault(); };function load_img(){var url=document.getElementsByTagName(\"img\")[0];url=url.getAttribute(\"src\");var img=new Image();img.src=url;if(img.complete){\twindow.external.img_has_loaded();\treturn;};img.onload=function(){window.external.img_has_loaded();};img.onerror=function(){\twindow.external.img_loaded_error();};};load_img();</script></body> </html>".replace("img_url", imgPath), "text/html", "utf-8", "");}}
}
- 接下來把ImageLoadProxy代碼也寫下來把,注意,圖片加載用到到的是volley第三方jar包,可以根據不同的需要,選擇不同的方法加載圖片
/*** 圖片加載工具類* @author MegaBest_Panzhiming**/
public class ImageLoadProxy {private static final int MAX_DISK_CACHE =
1024 *
1024 *
50;
private static final int MAX_MEMORY_CACHE =
1024 *
1024 *
10;
private static boolean isShowLog =
false;
private static ImageLoader imageLoader;
public static ImageLoader
getImageLoader() {
if(imageLoader ==
null){
synchronized (ImageLoadProxy.class) {
if(imageLoader ==
null){imageLoader = ImageLoader.getInstance();}}}
return imageLoader;}
public static void initImageLoader(Context context) {ImageLoaderConfiguration.Builder build =
new ImageLoaderConfiguration.Builder(context);build.tasksProcessingOrder(QueueProcessingType.LIFO);build.diskCacheSize(MAX_DISK_CACHE);build.memoryCacheSize(MAX_MEMORY_CACHE);build.memoryCache(
new LruMemoryCache(MAX_MEMORY_CACHE));
if (BuildConfig.DEBUG && isShowLog) {build.writeDebugLogs();}getImageLoader().init(build.build());}
/*** 自定義Option** @param url* @param target* @param options*/public static void displayImage(String url, ImageView target, DisplayImageOptions options) {imageLoader.displayImage(url, target, options);}
/*** 頭像專用** @param url* @param target*/public static void displayHeadIcon(String url, ImageView target) {imageLoader.displayImage(url, target, getOptions4Header());}
/*** 圖片詳情頁專用** @param url* @param target* @param loadingListener*/public static void displayImage4Detail(String url, ImageView target, SimpleImageLoadingListener loadingListener) {imageLoader.displayImage(url, target, getOption4ExactlyType(), loadingListener);}
/*** 圖片列表頁專用* @param url* @param target* @param loadingResource* @param loadingListener* @param progressListener*/public static void displayImageList(String url, ImageView target,
int loadingResource, SimpleImageLoadingListener loadingListener, ImageLoadingProgressListener progressListener) {imageLoader.displayImage(url, target, getOptions4PictureList(loadingResource), loadingListener, progressListener);}
/*** 自定義加載中圖片** @param url* @param target* @param loadingResource*/public static void displayImageWithLoadingPicture(String url, ImageView target,
int loadingResource) {imageLoader.displayImage(url, target, getOptions4PictureList(loadingResource));}
/*** 當使用WebView加載大圖的時候,使用本方法現下載到本地然后再加載** @param url* @param loadingListener*/public static void loadImageFromLocalCache(String url, SimpleImageLoadingListener loadingListener) {imageLoader.loadImage(url, getOption4ExactlyType(), loadingListener);}
/*** 設置圖片放縮類型為模式EXACTLY,用于圖片詳情頁的縮放** @return*/public static DisplayImageOptions
getOption4ExactlyType() {
return new DisplayImageOptions.Builder().cacheInMemory(
true).cacheOnDisk(
true).bitmapConfig(Bitmap.Config.RGB_565).resetViewBeforeLoading(
true).considerExifParams(
true).imageScaleType(ImageScaleType.EXACTLY).build();}
/*** 加載頭像專用Options,默認加載中、失敗和空url為 ic_loading_small** @return*/public static DisplayImageOptions
getOptions4Header() {
return new DisplayImageOptions.Builder().cacheInMemory(
true).cacheOnDisk(
true).bitmapConfig(Bitmap.Config.RGB_565).showImageForEmptyUri(R.drawable.ic_launcher).showImageOnFail(R.drawable.ic_launcher).showImageOnLoading(R.drawable.ic_launcher).build();}
/*** 加載圖片列表專用,加載前會重置View* {@link com.nostra13.universalimageloader.core.DisplayImageOptions.Builder#resetViewBeforeLoading} = true** @param loadingResource* @return*/public static DisplayImageOptions
getOptions4PictureList(
int loadingResource) {
return new DisplayImageOptions.Builder().cacheInMemory(
true).cacheOnDisk(
true).bitmapConfig(Bitmap.Config.RGB_565).resetViewBeforeLoading(
true).showImageOnLoading(loadingResource).showImageForEmptyUri(loadingResource).showImageOnFail(loadingResource).build();}}
Volley PhotoView這兩個第三方jar包,可以在網上下載,我就不給出鏈接了。
總結
以上是生活随笔為你收集整理的加载gif动图的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。