Android WebView一系列

1、禁用滚动条后,仍然可以向下触摸滑动或仍然可以通过向下方向键出现滚动效果,如何解决该问题?

     目前通过WEBVIEW属性设置(禁用滚动条、设置滚动模式、重新拓传滚动Range范围),你是无法做到的,目前可以通过两种方式来实现:

   (1)监听WV的按键响应,对方向键的处理后return true,将该层事件消耗掉,不在传递给Activity级处理即可。

   (2)修改WV的内核……

2、机顶盒中对移动光标的处理

      默认情况下,WV对网页有默认的焦点与移动处理,但是往往移动的顺序不是那么理想,而且一般情况下我们需要将WV设置为“软件图层类型”,以禁用硬件加速。

     同时该模型也是将WV设置为可透明背景的一个途径,但是设置为该类型后,会把当前WV界面转为bitmap保存,这使得通过遥控器按键进行页面移动时,

     无任何焦点和光标出现,因此可通过以下两种方式来解决:

     (1)修改webcore内核,进行移动光标的自定义处理,包括计算页面元素位置、尺寸、大小等

     (2)自定义JS光标系统

     (3)通过JS进行简洁化的移动与聚焦处理

3、背景透明处理,通常用于WV自身以及WV之外ACTIVITY级的叠加显示效果

		wv.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
		wv.setBackgroundColor(Color.TRANSPARENT);
		// mWebView.setBackgroundResource(Color.TRANSPARENT);
		if (wv.getBackground() != null) {
			wv.getBackground().setAlpha(2);
		}
4、WV进入后台时性能优化

      重写WV:

@Override
	protected void onWindowVisibilityChanged(int visibility) {
		super.onWindowVisibilityChanged(visibility);
		if (visibility == View.GONE) {
			try {
				WebView.class.getMethod("onPause").invoke(this);// stop flash
			} catch (Exception e) {
			}
			Logger.d(TAG, "pause webview timers.");
			this.pauseTimers();
			this.is_gone = true;
		} else if (visibility == View.VISIBLE) {
			try {
				WebView.class.getMethod("onResume").invoke(this);// resume flash
			} catch (Exception e) {
			}
			Logger.d(TAG, "resume webview timers.");
			this.resumeTimers();
			this.is_gone = false;
		}
	}

	@Override
	protected void onDetachedFromWindow() {
		if (this.is_gone) {
			try {
				this.destroy();
			} catch (Exception e) {
			}
		}
	}

注意,如果调用Activity的finish方法,onDetachedFromWindow方法会被触发。

同时对话框的dismiss也会被触发,因此在webview上弹出原生对话框,需对dismiss进行状态判断。

5、ACTIVITY级的按键事件上传到WV需要做一个转义处理,通常有上下左右、确定等,包括一些其他的系统按键

6、WV缓存设置,缓存是基于MD5值校验的资源文件缓存、HTML5缓存等

                settings.setCacheMode(WebSettings.LOAD_DEFAULT);
		// set local storage
		settings.setDomStorageEnabled(true);
		// set app database
		settings.setDatabaseEnabled(true);
		// H5缓存
		settings.setAppCacheEnabled(true);

    WebSettings.LOAD_CACHE_ELSE_NETWORK---只要本地有,无论是否过期都使用缓存数据;只要打开过一次就使用缓存数据
    WebSettings.LOAD_CACHE_ONLY---只使用缓存 
    WebSettings。LOAD_NO_CACHE---不使用缓存
    WebSettings.LOAD_DEFAULT---控制器决定是否从网络获取数据,无论如果都从网络获取数据,没有网络就报错

7、最新的SDK中,适当控制页面调用的安全性设置,谨慎添加@JavascriptInterface 接口注册

8、根据需要可对WV中显示的prompt、alert、confirm消息进行定制

9、善用WV的页面初始化、shouldover时机

10、webview的拉伸
     尝试过对webview进行强制拉伸,通过下面的方式进行,目前看来不是很理想:
     1) 启用浏览器缩放功能与缩放控件支持
     2) 启用用户自定义缩放支持,该缩放仅可设置缩放的比率,放大、缩小的指定倍数
     3) 通过html meta viewpoint来控制
           viewpoint也仅仅支持等比率缩放,viewpoint的相关信息可参阅:
http://www.szfangwei.cn/news/1962.html

           http://yansu.org/2013/05/06/the-viewpoint-metatag.html

 

      我想如果是网页图片做强制拉伸是木有问题的,但是网页是动态的,除非把网页视图即时动态的生成为可以显示的位图。

      而后通过以下的尝试:
      将需要展现的网页HTML抓取到本地,然后对HTML进行正则批量替换,将所有px像素值经过换算后,替换为适配目前屏幕的像素值,然后显示到网页上,
也还是有些问题:
      1) 网页点击的JS事件会失效,硬伤
      2) 如果采用相对路径,则通过以上方式加载页面,需指定页面涉及到的资源信息基地址,目前每个看吧的资源信息路径都是不同的,不好统一。

      因此可以考虑通过下面的方式来实现:将需要拉伸的小页面完整的等比缩放后居中显示,但这样左右两侧会留有空白,补上背景图即可。

11、WebView加载慢

       载入网页显示速度慢的究极解决方案:http://gaibing2009.diandian.com/post/2012-08-07/40035127817

 

 

 

 


 

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/webwalker/article/details/38079527
文章标签: Android WebView
个人分类: Android
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭