Android layer type與WebView白屏
- <WebViewandroid:id="@+id/webview"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:layerType="software"
- android:scrollbars="none"/>
<WebView android:id="@+id/webview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layerType="software"
android:scrollbars="none" />
在網上也有layer的一些資料:
以下摘自http://blog.csdn.net/a345017062/article/details/7478667
先說說這三個layer。
LAYER_TYPE_SOFTWARE
無論硬體加速是否開啟,都會有一張Bitmap(software layer),並在上面對WebView進行軟渲染。
好處:
在進行動畫,使用software可以只畫一次View樹,很省。
什麼時候不要用:
View樹經常更新時不要用。尤其是在硬體加速開啟時,每次更新消耗的時間更多。因為渲染完這張Bitmap後還需要再把這張Bitmap渲染到hardware layer上面去。
LAYER_TYPE_HARDWARE
硬體加速關閉時,作用同software。
硬體加速開啟時會在FBO(Framebuffer Object)上面做渲染,在進行動畫時,View樹也只需要畫一次。
兩者區別:
1、一個是渲染到Bitmap,一個是渲染到FB上。
2、hardware可能會有一些操作不支援。
兩者相同:
都是開了一個buffer,把View畫到這個buffer上面去。
LAYER_TYPE_NONE
這個就比較簡單了,不為這個View樹建立單獨的layer
PS:GLSurfaceView和WebView預設Layertype都是none。
GLSurfaceView:
給GLSurfaceView設定為software或者hardware後,發現什麼也畫不出來了。得出結論:GLSurfaceView的Layer type只能是none
WebView:
以前使用WebView時碰到過一個問題,如果在WebView上面使用Animation,WebView的繪畫區域不動。當時的解決方案是在進行動畫之前對WebView進行截圖(drawingcache)。按上面的道理試了一下,設定一個hardware或者software的layer就OK了。
現在又碰到了另外一個問題,開啟硬體加速後,在一些機器上面(我的是3.2)WebView有時會出現某一塊區域白屏的問題。預設的layer type是none,改為hardware也不行,設定為software就解決了。當然關閉硬體加速也好了,可是那樣的話程式整體就比較慢了。所以最終方案是整體硬體加速,出問題的WebView設定software
補充於2012.4.21:
加上這一句,可以讓3D的繪製更快一些:getHolder().setType(SurfaceHolder.SURFACE_TYPE_HARDWARE);
補充於2012.4.22
先說問題:
在硬體加速開啟的情況下GLSurfaceView一旦被從View樹上摘下來,會使整個視窗背景變黑,即使設定layer type為software也不管用。
經過兩天的排查,發現了原因,我的程式是在C層由drawFrame(屬於GLThread執行緒)來驅動進行繪畫,當GLSurfaceView被摘下來時,GLSurfaceView的destroy方法被呼叫,我在destroy方法(屬於UI執行緒)中直接呼叫 了GLThread執行緒的結束方法。而GLSurfaceView.creat,sizeChanged,destroyed在UI執行緒,Render.create,sizeChanged,drawFrame在GLThread執行緒。因此,出現了UI執行緒直接呼叫GLThread執行緒的方法的問題。最終通過GLSurfaceView.queueEvent向GLThread執行緒傳送Runnable,問題得到解決。
看來,還是軟渲染的容錯能力比較強,一開硬體加速,底層就比較脆弱了。
結論:一定要搞清楚哪個是UI執行緒,哪個是GLThread執行緒。
補上幾個尋找問題過程中發現的知識點:
hardware acclerator是對整個視窗進行加速,在硬體加速開啟時View.isHardwareAcclerator返回true。但每個View可能被渲染到的Canvas是不同的,比如View可能被通過setLayer設定了Layer,這時,Canvas.isHardwareAccelerator返回false
Android提供了三種硬體加速是否開啟的控制級別,分別是Application,Activity,Window,View。這個可以參考Dev Guide
相關文章
- Android: HttpClient與Webview共享cookiesAndroidHTTPclientWebViewCookie
- android httpclient與webview cookie同步AndroidHTTPclientWebViewCookie
- Flutter 與 Android 原生 WebView 對比FlutterAndroidWebView
- Android webview 與 js(Vue) 互動AndroidWebViewJSVue
- Android與WebView資料互動AndroidWebView
- Android 原生 WebView 與 JavaScript 互動AndroidWebViewJavaScript
- Flutter Android端啟動白屏FlutterAndroid
- Android WebView —— Java 與 JavaScript 互動總結AndroidWebViewJavaScript
- Android混合開發之WebView與Javascript互動AndroidWebViewJavaScript
- variable: Type 與 Type variable
- android webview總結AndroidWebView
- Android WebView Resources$NotFoundExceptionAndroidWebViewException
- Android WebView的坑AndroidWebView
- Android WebView 詳解AndroidWebView
- android webview 跳轉AndroidWebView
- Android WebView Memory Leak WebView記憶體洩漏AndroidWebView記憶體
- 通過 Hardware Layer 提升 Android 動畫效能Android動畫
- Android webview JS 互動AndroidWebViewJS
- 再學Android之WebViewAndroidWebView
- android webview秒開框架AndroidWebView框架
- Android webview使用詳解AndroidWebView
- Android WebView 除錯方法AndroidWebView除錯
- Android WebView 優化之路AndroidWebView優化
- Android中WebView使用解析AndroidWebView
- android WebView總結(轉)AndroidWebView
- Android Webview 使用小結AndroidWebView
- Android 各個版本WebViewAndroidWebView
- Android WebView ScrollBar設定AndroidWebView
- Android 截圖與 WebView 長圖分享經驗總結AndroidWebView
- 頁面白屏與瀑布流分析方法
- Type與Class
- WebView詳解與簡單實現Android與H5互調WebViewAndroidH5
- Android Webview和ScrollView衝突和WebView使用總結AndroidWebView
- Android WebView載入TTF字型AndroidWebView
- Android webview圖片過大AndroidWebView
- Android 與WebView中的js程式碼的互動記錄AndroidWebViewJS
- layer.oad,layer.open
- Android樣式的開發:layer-list篇Android