Android 用 Webview 顯示網路圖片跳坑指南
主要內容
WebView WebView
系統的 ImageView
控制元件本就是用來顯示圖片的,那為什麼還使用 WebView
控制元件去顯示呢?
原因有三:
- 我目前專案的圖片大小不一,有的很大(2256 1080),有的很小(36 36),在做圖片適配的時候不太好實現(是我目前水平不夠吧),為了能完成專案的需求,只能先實現效果先。
-
ImageView
本身的scaleType
屬性不能實現效果。
image.png
- 我目前專案使用的圖片載入庫是
Glide
,在Glide
的現有API
中使用的效果和專案效果有差別,沒有時間深入研究。
我也是在搜尋了網路圖片適配看到其他部落格的介紹,才想到用 WebView
去載入圖片。這裡只是實現的一種方式,在具體專案中能用 ImageView
載入的圖片最好還是用 ImageView
免得又出什麼新`Bug。廢話不多說了,show me the f**k code。
使用 WebView
載入網路圖片
WebView webView = new WebView(activity); //支援javascript webView.getSettings().setJavaScript/">JavaScriptEnabled(false); // 設定可以支援縮放 webView.getSettings().setSupportZoom(false); // 設定出現縮放工具 webView.getSettings().setBuiltInZoomControls(false); //自適應螢幕 webView.getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN); webView.getSettings().setLoadWithOverviewMode(true); webView.getSettings().setUseWideViewPort(true); // 設定滾動條不顯示 webView.setHorizontalScrollBarEnabled(false); webView.setVerticalScrollBarEnabled(false); // 設定網路圖片 webView.loadUrl(images.get(i)); // 這裡是將 new 出來的 webview 收集,在不使用的時候統一清空 webViews.add(webView); // 設定間距 LinearLayout.LayoutParams lineParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); lineParams.setMargins(0, DensityUtil.dp2px(10),0,0); webView.setLayoutParams(lineParams); layoutImage.addView(webView);
WebView
載入圖片的點選事件
final int finalI = i; webView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: DownX = event.getX();//float DownX DownY = event.getY();//float DownY moveX = 0; moveY = 0; currentMS = System.currentTimeMillis();//long currentMS獲取系統時間 break; case MotionEvent.ACTION_MOVE: moveX += Math.abs(event.getX() - DownX);//X軸距離 moveY += Math.abs(event.getY() - DownY);//y軸距離 DownX = event.getX(); DownY = event.getY(); break; case MotionEvent.ACTION_UP: long moveTime = System.currentTimeMillis() - currentMS;//移動時間 // 這裡的 55 和 250 是測試的時候取的值(這樣做不太好,有1/10 的可能時候會誤操作,有更好解決辦法想能留言回覆我,多謝了~) if( moveTime > 55 && moveTime < 250 && ( moveX == 0.0 || moveY == 0.0 )){ // 處理點選事件 return true; } break; default: break; } return false; } });
清空,防止記憶體洩漏
使用 Webview 是有記憶體洩露風險的,所以在不使用的時候要及時置空。
/** * 在 onDestory 中移除 webview 防止記憶體洩漏 */ public void removeWebView() { for (int i = 0; i < webViews.size(); i++) { WebView webView = webViews.get(i); if (webView != null){ webView.removeAllViews(); webView.destroy(); webView.setVisibility(View.GONE); } } }
本文完~,歡迎留言一起進步。