Android WebView一系列

来源:互联网 发布:起个网络名字大全女孩 编辑:程序博客网 时间:2024/06/04 17:51


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级的叠加显示效果

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. wv.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 
  2. wv.setBackgroundColor(Color.TRANSPARENT); 
  3. // mWebView.setBackgroundResource(Color.TRANSPARENT); 
  4. if (wv.getBackground() != null) { 
  5.     wv.getBackground().setAlpha(2); 
4、WV进入后台时性能优化

      重写WV:

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. @Override 
  2.     protected void onWindowVisibilityChanged(int visibility) { 
  3.         super.onWindowVisibilityChanged(visibility); 
  4.         if (visibility == View.GONE) { 
  5.             try
  6.                 WebView.class.getMethod("onPause").invoke(this);// stop flash 
  7.             } catch (Exception e) { 
  8.             } 
  9.             Logger.d(TAG, "pause webview timers."); 
  10.             this.pauseTimers(); 
  11.             this.is_gone =true
  12.         } else if (visibility == View.VISIBLE) { 
  13.             try
  14.                 WebView.class.getMethod("onResume").invoke(this);// resume flash 
  15.             } catch (Exception e) { 
  16.             } 
  17.             Logger.d(TAG, "resume webview timers."); 
  18.             this.resumeTimers(); 
  19.             this.is_gone =false
  20.         } 
  21.     } 
  22.  
  23.     @Override 
  24.     protected void onDetachedFromWindow() { 
  25.         if (this.is_gone) { 
  26.             try
  27.                 this.destroy(); 
  28.             } catch (Exception e) { 
  29.             } 
  30.         } 
  31.     } 

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

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

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1.               settings.setCacheMode(WebSettings.LOAD_DEFAULT); 
  2. // set local storage 
  3. settings.setDomStorageEnabled(true); 
  4. // set app database 
  5. settings.setDatabaseEnabled(true); 
  6. // H5缓存 
  7. 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

Android WebView 播放视频总结~

今天发现 WebView里播放优酷的视频点击播放按钮后没反应,于是看官方文档和搜索解决,下面是我在别人基础上做的补充:


android webView 无法播放视频,无法暂停,继续播放视频问题,无法根据浏览器居中显示内容问题
转自:http://blog.csdn.net/it_ladeng/article/details/8136534

此次遇到一个问题就是webView无法播放视频,查了下谷歌发现可以设置

setting.setPluginsEnabled(true); (从API 11 支持,可以不加)
这个从而播放视频,但是最新官方SDK说这个方法要放弃了,推荐使用

setting.setPluginState(PluginState.ON);(从API 11 支持,可以不加)
目前看来这两种方法都可以,但是webview的页面都finish了居然还能听到视频播放的声音,于是有查了下发现webview的

onResume方法可以继续播放,

onPause可以暂停播放,
但是这两个方法都是在Added in API level 11添加的,所以需要用反射来完成。
停止播放:在页面的onPause方法中使用:

webView.getClass().getMethod("onPause").invoke(webView,(Object[])null);(低版本测试正常)
继续播放:在页面的onResume方法中使用:

 

webView.getClass().getMethod("onResume").invoke(webView,(Object[])null);低版本测试正常

这样就可以控制视频的暂停和继续播放了。


另外说一点:

webView.resumeTimers()(不靠谱)

webView.pauseTimers();不靠谱

这两个方法有延迟,而且第二次再加载webview以后会出现上次播放的视频还会继续在播放,但是只能听到声音,所以个人感觉不靠谱,系统的浏览器估计是用了这个方法,按返回件关闭浏览器后都还能听到声音。


无法根据浏览器居中显示内容这个问题只要设置下面两个熟悉即可:

 

setting.setLoadWithOverviewMode(true);

setting.setUseWideViewPort(true);


继续研究:

同样的代码,经过在Android4.0+的设备上测试后发现,还是不能播放视频,于是继续添加了如下解决方法:

1.在webView的Activity配置里面加上:

android:hardwareAccelerated="true" 

(官方文档解释说:

Hardware acceleration is enabled by default if your Target API level is >=14 

http://developer.android.com/guide/topics/graphics/hardware-accel.html 

所以只需要修改下Manifest文件,不需要设置这个属性也可以)


2.必须添加这句代码,没整明白为什么,但是加了这个就能播放

webView.setWebChromeClient(new WebChromeClient()); (一定要加

这两步就可以播放了,有人说在application的配置里面也要加上:android:hardwareAccelerated="true",开始的时候我也加了,但是后来发现去掉这个也一样可以播放flash

但是现在的麻烦是视频不能全屏播放,只要点击了全屏按钮后,再次点击播放和暂停按钮以后,视频不会有任何反应,无法继续播放了。

网上查了下相关解决方法:
http://www.techfreestyle.com/fixed-android-4-0-full-screen-flash-problem-in-webview  这种方法测试过了 不能解决问题。

https://github.com/android/platform_packages_apps_browser/blob/master/src/com/android/browser/BaseUi.java 这个貌似源码,由于代码较多,所以还没研究。

 

 

 

0 0
原创粉丝点击