1.首先Android4.0+ webview 是默認開啟硬件加速的
WebView.setLayoutParams(new LinearLayout.LayoutParams(100 0, 1));
動態(tài)改變webview大小時终佛,webview會閃爍送朱,據(jù)說是android 3.0+硬件加速導(dǎo)致的問題,通過如下方式可解決:
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.
動態(tài)改變webview大小時,webview閃爍的解決辦法
tips 在實際工作中遇到了這樣的幾個問題
- 問題1: 會有加載H5 鏈接時加載不出來的問題芬位,即出線白頁,而且是某些機型上出現(xiàn)的問題 :我這里主要是設(shè)置了多余的一個屬性
detail_web.getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN); //http://blog.csdn.net/bjstyle/article/details/45073503 支持內(nèi)容重新布局
這種問題的解決一般是看一下自己的屬性設(shè)置是否有多余的
當然這里我們之前還使用了github上的一個開源庫來解決這個問題:
delight-im / Android-AdvancedWebView
問題2: webview的H5標簽 問題
因為Android 在4.4時將內(nèi)核從webkit變?yōu)榱薱hromium 所以會有一些兼容性問題巩搏,比如viewport設(shè)為true等册舞。問題3 : 在新聞類的頁面中為了實現(xiàn)閱讀體驗,或者H5 的懶加載機制蹬挤,必須將webview設(shè)置為 match_parent 缚窿,這樣就會帶來了webview跟listview或者recyleview 或者scrollview等的滑動事件的交互,大部分實現(xiàn)是用它的父布局來切換事件傳遞的焰扳。當然今日頭條做的比較到位直接重寫了webview倦零,這種方式暫時還沒有實現(xiàn)的思路(//todo:記錄下).
問題4: 有些緩存問題,比如webview默認開啟緩存吨悍,但是我們在實際開發(fā)中有一個問題是圖片第二次進入不加載的問題扫茅,最終是在每次進入界面時清掉了緩存,當然這種問題不一定是正確的解決方式育瓜,也很詭異的出現(xiàn)這種問題葫隙。這種解決最好的是為文章詳情頁做離線緩存。
問題5: 這個問題是需要后期更新的躏仇。即文章的緩存機制恋脚,需要寫一定的js代碼存入本地,最近在學(xué)習(xí)前端的知識焰手,等后期更新糟描。(//todo:加入文章詳情頁緩存機制)
問題6:Android WebView開啟硬件加速導(dǎo)致屏幕花屏
硬件加速分為四個級別
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);
解決方案
那么為了在保證性能的前提下解決前面提到的問題,那么可以采用第四種級別书妻,關(guān)閉webview的硬件加速
4.0以上的系統(tǒng)我們開啟硬件加速后船响,WebView渲染頁面更加快速,拖動也更加順滑。但有個副作用就是见间,當WebView視圖被整體遮住一塊聊闯,然后突然恢復(fù)時(比如使用SlideMenu將WebView從側(cè)邊滑出來時),這個過渡期會出現(xiàn)白塊同時界面閃爍缤剧。解決這個問題的方法是在過渡期前將WebView的硬件加速臨時關(guān)閉馅袁,過渡期后再開啟,代碼如下:if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);}
問題7: webview緩存處理