在项目中遇到WebView在加载图片的时候会出现白屏的情况,后来在xml设置了WebView属性,问题的到解决:
- <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
相关推荐
Android8.0以下手机自带的android-system-webview版本过低使用
Android下WebView加载flash闪白屏问题解决方案源码
Android-X5WebView基本封装和使用 通过OkHttp拦截器、自定义CookieJar有效完成客户端与H5端的Cookie同步管理 监听WebView的加载进度 滚动条的设置(隐藏或者显示,内侧显示还是外侧显示) 优化X5WebView的预加载问题...
解决在webview中input标签type="file"不能使用的问题
Android 基于x5Webview 浏览文件 office文档 已测试Android11 功能实现
这是AOSP的webview,包名com.android.webview,不是google的webview
Android WebView 去除标题 利用javacript交互
使用android studio 3.1.2 ,利用webview,实现登录界面。采用本地html 页面
android不使用webview与js交互
1.本文采用的是android调用assest中的本地.html文件,webview展示(加载网络的html效果是一样的,把url替换掉就行) 2.包含本地.html文件加载,点击.html控件,Android端响应 3.包含本地.html文件加载,点击.html...
Android Webview 滑动监听 放大缩小查看网页图片
第一次尝试用Android Studio 开发的WebView 框架源码;仅供大家学习参考。
android webview拨打电话 关注博客http://himici.com
Android中使用WebView调用系统相机和相册,但是4.4的手机不能使用
Android笔记webview与js交互实例,详细介绍使用loadUrl(),evaluateJavascript(),addJavascriptInterface(),等方式实现交互。
android 4.0中关于webview加载flash并使flash全屏的问题
android 8.0 webview 拍照、预览、二维码扫描比较完整的例子,对于权限检查控制,有比较完善的提示写法。可以下载后,直接在android studid上运行,编译版本和target版本均是SDK android 8.0,最低版本设置成了...
在进行APP+H5混合开发的时候...这种情况在Android开发中比较常见,因为Android不会自动同步cookie到WebView。做iOS开发则不用担心这个问题,因为iOS内部已经实现了cookie同步.本文就是一个小的事例,从登录到同步cookie
Android实现WebView懒加载,提前进行页面JS资源加载。减少WebView加载时间及加载资源问题。Android 8.0以前需要引入X5内核,Android 8.0以后无特殊要求。
android端通用WebView