Android使用WebView載入圖片防止OutOfMemoryError

來源:互聯網
上載者:User

在Android中, 大圖片載入或者處理很容易出來OutOfMemory,也就是記憶體溢出

    所以在這裡就使用WebView來載入大圖片,但是WebView不好控製圖片顯示大小,也就是說

如果圖片太大,webview將出一捲軸,圖片過小則不可展開,極其影響美觀。為此,作了些

修改,在一定地區內做一些圖片尺寸的壓縮。

    主要實現方式:由WebView的父控制項置中布局來控制垂直方向的置中,WebView的元素置中

來控製圖片的水平置中 ,最終達到圖片在螢幕的中間顯示。

核心Java代碼如下:

private void showImageByWebView(String path){webViewLayout = (LinearLayout) findViewById(R.id.img_webview);webView = new WebView(this);String url = "file://"+ path;int[] wh = new int[2];int disenty;//螢幕密度WindowManager wManager = this.getWindowManager();DisplayMetrics  disM = new DisplayMetrics();wManager.getDefaultDisplay().getMetrics(disM);  disM = this.getResources().getDisplayMetrics();disenty = disM.disenty;wh[0] = dis.widthPixels;Rect outRect = new Rect();webViewLayout.getWindowVisibleDisplayFrame(outRect); //擷取狀態列高度int contentHeight = (int) (wh[1] - this.getResources().getDimension(R.dimen.title_height) - outRect.top - 30); //擷取webview應該顯示的高度,螢幕高度減去標題列高度和狀態列高度BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = true; BitmapFactory.decodeFile(path, options); // 因為設定了inJustDecodeBounds=true 所以此時返回的 bitmap 為 null,僅取出bitmap的資訊,而不把它讀到記憶體options.inJustDecodeBounds = false;          int bitmapWidth = options.outWidth; int bitmapHeight = options.outHeight; String style = "";int[] imgDis = new int[2];int minHeight = getResources().getDimensionPixelSize(R.dimen.loadview_img_minheight);//注;由於webview將會設定settings.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);表示單列所以寬度適應內容大小,所以寬度大於螢幕而高度小於螢幕時不需要再壓縮if(bitmapHeight > (float)contentHeight/disenty){double scale = 0.00f;scale = (double)contentHeight / bitmapHeight;imgDis[0] = (int) (scale * bitmapWidth / (disenty + 0.1));//這裡加上了0.1的原因與以上減30一樣,webview寬高肯定大於圖片內容所顯示的寬度,裡面還會有padding屬性imgDis[1] = (int) (scale * bitmapHeight / (disenty + 0.1));style = "style=\"width: " + imgDis[0] + "px; height: " + imgDis[1] + "px;\"";}else if(bitmapHeight < minHeight){double scale = (double)minHeight/bitmapHeight ;int width = (int) (scale * bitmapWidth);style = "style=\"width: " + width / disenty + "px; height: " + minHeight / disenty + "px;\"";}StringBuffer data = new StringBuffer();data.append("<html><center><img src=\"").append(url).append("\" ").append(style).append("></center></html>");webView.loadDataWithBaseURL(url, data.toString(), "text/html","UTF-8","");webView.setScrollContainer(false);webView.setScrollbarFadingEnabled(false);WebSettings settings = webView.getSettings();settings.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);settings.setBuiltInZoomControls(false); // 設定顯示縮放按鈕settings.setSupportZoom(true); //支援縮放//webView.setInitialScale(100);// settings.setUseWideViewPort(true); //雙擊放大,但是在這裡如果放大將會有問題// settings.setLoadWithOverviewMode(true);//多視窗預覽方式顯示webView.setBackgroundColor(0x00000000);//View zoomControls = webView.getZoomControls();//LayoutParams paramszoom = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);//zoomControls.setLayoutParams(paramszoom);LayoutParams params = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT, Gravity.CENTER);params.width = LayoutParams.WRAP_CONTENT;params.height = LayoutParams.WRAP_CONTENT;webView.setMinimumHeight(500);webViewLayout.addView(webView, params);}

核心布局代碼如下:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:orientation="vertical" ><!-- .....-->                <LinearLayout         android:id="@+id/img_webview"        android:layout_width="fill_parent"        android:layout_height="fill_parent"android:layout_centerInParent="true"android:minHeight="200dip"        android:minWidth="200dip"        android:gravity="center"        android:paddingTop="@dimen/title_normal_height"        /></RelativeLayout>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.