1.首先Android4.0+ webview 是默认开启硬件加速的
WebView.setLayoutParams(new LinearLayout.LayoutParams(100 0, 1));
动态改变webview大小时,webview会闪烁,据说是android 3.0+硬件加速导致的问题,通过如下方式可解决:
WebView.setLayerType(View.LAYER_TYPE_SOFTWARE,null);
Generally speaking, it seems the problem has to do with a bug when using WebViews
with hardware acceleration enabled on 3.0+ devices. I also tried using the sliding menu library with a WebView
but experienced the same flicker problem. After looking around I found a workaround here:
WebView “flashing” with white background if hardware acceleration is enabled (Android 3.0+)
The workaround uses the following code to set the layer type of the WebView
to software rendering:
webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
This code solved the flicker for me with the drawback of lower performance.
tips 在实际工作中遇到了这样的几个问题
- 问题1: 会有加载H5 链接时加载不出来的问题,即出线白页,而且是某些机型上出现的问题 :我这里主要是设置了多余的一个属性
detail_web.getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN); //http://blog.csdn.net/bjstyle/article/details/45073503 支持内容重新布局
这种问题的解决一般是看一下自己的属性设置是否有多余的
当然这里我们之前还使用了github上的一个开源库来解决这个问题:
delight-im / Android-AdvancedWebView
-
问题2: webview的H5标签 问题
因为Android 在4.4时将内核从webkit变为了chromium 所以会有一些兼容性问题,比如viewport设为true等。 -
问题3 : 在新闻类的页面中为了实现阅读体验,或者H5 的懒加载机制,必须将webview设置为 match_parent ,这样就会带来了webview跟listview或者recyleview 或者scrollview等的滑动事件的交互,大部分实现是用它的父布局来切换事件传递的。当然今日头条做的比较到位直接重写了webview,这种方式暂时还没有实现的思路(//todo:记录下).
-
问题4: 有些缓存问题,比如webview默认开启缓存,但是我们在实际开发中有一个问题是图片第二次进入不加载的问题,最终是在每次进入界面时清掉了缓存,当然这种问题不一定是正确的解决方式,也很诡异的出现这种问题。这种解决最好的是为文章详情页做离线缓存。
-
问题5: 这个问题是需要后期更新的。即文章的缓存机制,需要写一定的js代码存入本地,最近在学习前端的知识,等后期更新。(//todo:加入文章详情页缓存机制)
-
问题6:Android WebView开启硬件加速导致屏幕花屏
硬件加速分为四个级别
Application级别
<application android:hardwareAccelerated="true"...>
<application android:hardwareAccelerated="true"...>
Activity级别
<activity android:hardwareAccelerated="true"...>
<activity android:hardwareAccelerated="true"...>
window级别
getWindow().setFlags( WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
getWindow().setFlags(
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
View级别
view.setLayerType(View.LAYER_TYPE_HARDWARE, null);
view.setLayerType(View.LAYER_TYPE_HARDWARE, null);
解决方案
那么为了在保证性能的前提下解决前面提到的问题,那么可以采用第四种级别,关闭webview的硬件加速
4.0以上的系统我们开启硬件加速后,WebView渲染页面更加快速,拖动也更加顺滑。但有个副作用就是,当WebView视图被整体遮住一块,然后突然恢复时(比如使用SlideMenu将WebView从侧边滑出来时),这个过渡期会出现白块同时界面闪烁。解决这个问题的方法是在过渡期前将WebView的硬件加速临时关闭,过渡期后再开启,代码如下:if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);}
问题7: webview缓存处理
网友评论