Android webview-tips

2016-10-29  本文已影响1536人  heiheiwanne

1.首先Android4.0+ webview 是默认开启硬件加速的
WebView.setLayoutParams(new LinearLayout.LayoutParams(100 0, 1));
动态改变webview大小时,webview会闪烁,据说是android 3.0+硬件加速导致的问题,通过如下方式可解决:
WebView.setLayerType(View.LAYER_TYPE_SOFTWARE,null);

http://stackoverflow.com/questions/12806094/android-webview-flicker-bug-while-animating-view-on-device

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.

动态改变webview大小时,webview闪烁的解决办法

tips 在实际工作中遇到了这样的几个问题

detail_web.getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN); //http://blog.csdn.net/bjstyle/article/details/45073503 支持内容重新布局

这种问题的解决一般是看一下自己的属性设置是否有多余的
当然这里我们之前还使用了github上的一个开源库来解决这个问题:
delight-im / Android-AdvancedWebView

缓存问题

硬件加速分为四个级别
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缓存处理

Android WebView:性能优化不得不说的事

上一篇 下一篇

猜你喜欢

热点阅读