`
scliu0718
  • 浏览: 52303 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

Android使用WebView加载图片防止OutOfMemoryError

 
阅读更多

在Android中, 大图片加载或者处理很容易出来OutOfMemory,也就是内存溢出


所以在这里就使用WebView来加载大图片,但是WebView不好控制图片显示大小,也就是说

如果图片太大,webview将出一滚动条,图片过小则不可拉伸,极其影响美观。为此,作了些

修改,在一定区域内做一些图片尺寸的压缩。

主要实现方式:由WebView的父控件居中布局来控制垂直方向的居中,WebView的元素居中

来控制图片的水平居中 ,最终达到图片在屏幕的中间显示。


核心Java代码如下:

private void showImage2WebView(String path, boolean isScale) {

		float nowDisenty = disenty;
		String url = "file://" + path;
		String style = "";
		if (isScale) {
			if (webScaleImgHeightPx > webImgHeightPx) {
				webScaleImgWidthPx = webImgWidthPx;
				webScaleImgHeightPx = webImgHeightPx;
			} else {
				webScaleImgWidthPx = webImgWidthPx + webImgWidthPx / 2;
				webScaleImgHeightPx = webImgHeightPx + webImgHeightPx / 2;
			}
			style = "style=\"width: " + webScaleImgWidthPx + "px; height: " + webScaleImgHeightPx + "px;\"";
		} else {
			shortContext.setVisibility(View.GONE);
			webView = new WebView(this);

			Rect outRect = new Rect();
			webViewLayout.getWindowVisibleDisplayFrame(outRect);
			int contentHeight = (int) (wh[1] - this.getResources().getDimension(R.dimen.title_normal_height) - outRect.top - 30);

			BitmapFactory.Options options = new BitmapFactory.Options();
			options.inJustDecodeBounds = true;
			BitmapFactory.decodeFile(path, options); // 因为设置了inJustDecodeBounds=true 所以此时返回的 bitmap 为 null
			options.inJustDecodeBounds = false;

			int bitmapWidth = options.outWidth;
			int bitmapHeight = options.outHeight;

			webImgWidthPx = bitmapWidth;
			webImgHeightPx = bitmapHeight;

			int[] imgDis = new int[2];
			int minHeight = getResources().getDimensionPixelSize(R.dimen.loadview_img_minheight);
			double scale = 0.00f;
			boolean isScaleByHeight = (double) contentHeight / bitmapHeight < (double) wh[0] / bitmapWidth;

			if (bitmapHeight > (float) contentHeight / nowDisenty && isScaleByHeight) {
				scale = (double) contentHeight / bitmapHeight;
				// if(scale >= 1) scale = 0.9f;
				imgDis[0] = (int) (scale * bitmapWidth / (nowDisenty + 0.1));
				imgDis[1] = (int) (scale * bitmapHeight / (nowDisenty + 0.1));
				webImgWidthPx = imgDis[0];
				webImgHeightPx = imgDis[1];
				style = "style=\"width: " + webImgWidthPx + "px; height: " + webImgHeightPx + "px;\"";
			} else if (bitmapWidth > wh[0]) {
				scale = (double) wh[0] / bitmapWidth;
				imgDis[0] = (int) (scale * bitmapWidth / (nowDisenty + 0.04));
				imgDis[1] = (int) (scale * bitmapHeight / (nowDisenty + 0.04));
				webImgWidthPx = imgDis[0];
				webImgHeightPx = imgDis[1];
				style = "style=\"width: " + webImgWidthPx + "px; height: " + webImgHeightPx + "px;\"";
			} else if (bitmapHeight < minHeight) {
				scale = (double) minHeight / bitmapHeight;
				int width = (int) (scale * bitmapWidth);
				webImgWidthPx = (int) (width / nowDisenty);
				webImgHeightPx = (int) (minHeight / nowDisenty);
				style = "style=\"width: " + webImgWidthPx + "px; height: " + webImgHeightPx + "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);
		webView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);

		WebSettings settings = webView.getSettings();
		settings.setLayoutAlgorithm(LayoutAlgorithm.NORMAL);
		settings.setBuiltInZoomControls(false); // 设置显示缩放按钮
		settings.setSupportZoom(false); // 支持缩放
		// settings.setLoadsImagesAutomatically(true);
		// webView.setInitialScale(100);

		// settings.setUseWideViewPort(true);
		// settings.setLoadWithOverviewMode(true);

		webView.setPadding(webView.getPaddingLeft(), webView.getPaddingTop(), webView.getPaddingRight() + 5, webView.getPaddingBottom());
		if (!isScale) {
			webView.setBackgroundColor(0x00000000);
			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);
			webView.loadDataWithBaseURL(url, data.toString(), "text/html", "UTF-8", "");
		} else {
			webView.clearDisappearingChildren();
			webView.clearFormData();
			webView.clearView();
			webView.loadDataWithBaseURL(url, data.toString(), "text/html", "UTF-8", "");

			LayoutParams params = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT, Gravity.CENTER);
			params.width = LayoutParams.WRAP_CONTENT;
			params.height = LayoutParams.WRAP_CONTENT;
			//params.height = (int) (webScaleImgHeightPx * disenty);
			webViewLayout.removeView(webView);
			webViewLayout.addView(webView, params);
			webView.invalidate();
			webViewLayout.invalidate();
		}
	}


分享到:
评论

相关推荐

    Android实现WebView懒加载

    通过懒加载,我们可以先加载页面的基本结构,然后在用户滚动到相应位置时再加载图片或其他非必需资源,从而提高初始加载速度。 在Android 8.0(API级别26)之前,原生的WebView性能可能无法满足需求,特别是在处理...

    Android WebView加载网页以及本地图片缓存问题

    本文将深入探讨如何使用WebView加载网页以及本地图片,并解决缓存问题。 一、WebView的基本使用 1. 初始化WebView:首先,我们需要在布局XML文件中添加WebView组件,并在对应的Activity或Fragment中找到该组件。...

    android Webview加载本地图片,自适应布局大小

    使用`WebChromeClient`和`WebViewClient`的回调方法,可以监听页面加载事件,当页面加载完成后,通过JavaScript获取图片的实际宽度和高度,然后调整WebView的大小。 最后,关于性能优化,使用`WebView`加载本地资源...

    Android实现WebView图片缓存,替换加载前默认图片的样式

    通过以上步骤,我们就成功地实现了在Android的WebView中进行图片缓存、替换加载前的默认图片样式以及图片点击事件的处理。这不仅提升了用户体验,还能有效地减少网络资源的消耗。同时,这些技术也可以作为基础,...

    Android webview加载网页.zip

    这个“Android webview加载网页.zip”文件可能包含了一个示例项目或者教程,帮助开发者理解如何在Android应用中有效地使用WebView。 WebView的使用涉及到以下几个关键知识点: 1. **WebView组件引入**:在...

    Android-AndroidWebView加载PDF文件实现

    Android WebView 加载 PDF 文件实现。其原理就是在 app 本地搭建一个 website ,然后利用 WebView 加载这个站点,站点去实现加载显示 PDF 的目的,站点其原理也是采用 js 框架去实现的。

    详解android 用webview加载网页(https和http)

    * 对于 Android 5.0 以下版本,可以使用 WebView 的 setWebViewClient 方法来重写 shouldInterceptRequest 方法,以便将 HTTPS 请求的图片加载到 WebView 中。 ```java wv.setWebViewClient(new WebViewClient(){ ...

    android Webview读取网页里的所有图片,并实现点击放大

    在Android开发中,WebView是一个非常重要的组件,它允许我们在应用程序中加载和显示网页内容。当涉及到用户界面交互,特别是展示包含图片的网页时,我们可能需要实现一些额外的功能,比如点击图片放大查看。本篇文章...

    android中webview加载本地页面,并处理js事件

    综上所述,这个`WebViewDemo`项目展示了如何在Android应用中使用`WebView`加载本地HTML页面,并通过JavaScript Interface实现Java和JavaScript之间的通信,以及在HTML中动态生成和操作组件。这些技术对于构建混合式...

    android webView加载html 并引用本地资源(图片、字体库)

    以上就是Android中使用WebView加载HTML并引用本地资源的基本步骤。通过结合HTML、CSS和JavaScript,你可以构建出丰富的交互式应用界面,同时利用本地资源提升性能和用户体验。记得在实际项目中,还要考虑安全性和...

    android之webView加载javascropt

    这篇博客“android之webView加载javascript”将深入探讨如何在Android应用中有效地使用WebView来加载和执行JavaScript代码。 首先,我们需要在AndroidManifest.xml中为应用添加互联网权限,因为加载网页内容需要...

    Android Webview 加载 H5Video

    搜索很多资料后发现很多问题,都是关键代码片段,因为每个项目每个人产生的问题不同,Video在webview中加载不出来原因很多,可能是客户端少了参数,也可能是前端出了问题,经过研究后对Android WebView 加载H5Video...

    webview 加载js ,css

    下面我们将深入探讨如何在Android的WebView中加载和使用JS、CSS以及它们带来的优势。 1. Android WebView加载HTML Android的WebView可以通过调用`loadData()`或`loadDataWithBaseURL()`方法加载HTML字符串,或者...

    android WebView预加载

    现在web app越来越多,webview控件的使用也越来越重要。 有时我们会在启动页或引导页之后,加载一个webview为控件的主页。 但如果跳转之后再加载,会看到webview有一个加载的过程,如果网页较大可能加载起来会很慢。...

    android使用webview加载网页

    这个"android使用webview加载网页"的主题涉及到多个知识点,以下将详细介绍这些内容。 首先,我们需要理解WebView的基本用法。在Android Studio中,我们可以通过在布局XML文件中添加`&lt;WebView&gt;`标签来创建一个...

    Android通过JS在线用webview加载PDF文件(无限放大版本)

    本教程将详细讲解如何在Android的Webview中加载在线PDF文件,并且实现无限放大功能。 首先,我们需要了解WebView的基本用法。WebView是Android SDK提供的一种组件,用于在应用程序内显示网页内容。我们可以使用`...

    android用webview加载assert中的html并且可拨打页面中的电话

    这篇教程将详细介绍如何在Android应用中使用Webview加载assert目录下的HTML文件,并且使用户能够通过Webview拨打电话。 首先,我们需要了解`WebView`。`WebView`是Android SDK提供的一种控件,用于在应用程序内嵌入...

    Android 替换WebView加载失败时的页面

    做webview加载网页时,遇到一个问题,自带的webview错误页面不美观,于是自定义一个view提示用户,网上很多方法,也不稳定实现替换,结合网上的一些例子,加以优化和拓展,特此写一个完整版本的Demo供大家拿来直接...

    Android 通过 WebView 与js 简单交互实现图文混排与查看大图功能

    在Android开发中,WebView是一个非常重要的组件,它允许我们在应用中加载和显示网页内容。本文将深入探讨如何利用WebView和JavaScript进行简单交互,以实现图文混排和查看大图的功能。 1. **WebView基本使用** - ...

    android 使用webview控件,注意在android9.0以后必须使用https才能访问网页

    总之,从Android 9.0开始,使用WebView加载网页时必须遵循更严格的网络安全性规则。开发者需要确保他们的应用遵守这些规则,以提供安全的用户体验。这不仅有助于提升应用的质量,也有助于维护用户的信任和隐私。在...

Global site tag (gtag.js) - Google Analytics