`
liuguofeng
  • 浏览: 450552 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Android layer type与WebView白屏

 
阅读更多

在项目中遇到WebView在加载图片的时候会出现白屏的情况,后来在xml设置了WebView属性,问题的到解决:

 

 

[html] view plaincopy
  1. <WebView   android:id="@+id/webview"  
  2.             android:layout_width="fill_parent"  
  3.             android:layout_height="fill_parent"  
  4.             android:layerType="software"   
  5.             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下WebView加载flash闪白屏问题解决方案源码

    然而,由于Android系统逐渐淘汰对Adobe Flash的支持,因此在尝试通过WebView加载Flash内容时,可能会遇到一些问题,如白屏现象。本文将深入探讨这个问题,并提供一种解决方案的源码。 一、问题分析 在Android 4.1...

    android-system-webview-7703.apk

    Android8.0以下手机自带的android-system-webview版本过低使用

    android 第三方webview cordova的集成使用

    在Android开发中,有时我们需要利用第三方库来增强应用的功能,比如WebView。WebView是Android系统提供的一种用于在应用程序中展示网页内容的组件,但它的功能相对有限。这时,我们可以选择集成Cordova来提升WebView...

    Android代码-Android-X5WebView基本封装

    Android-X5WebView基本封装和使用 通过OkHttp拦截器、自定义CookieJar有效完成客户端与H5端的Cookie同步管理 监听WebView的加载进度 滚动条的设置(隐藏或者显示,内侧显示还是外侧显示) 优化X5WebView的预加载问题...

    Android中webview使用x5内核集成demo

    Android x5内核集成demo 解决webview在使用内核时跟h5混合调用时出现的白屏,加载缓慢,vue报错各种兼容问题。在x5内核加载失败时,会切换成系统本身的内核来加载h5内容。如果项目上架Google商店等海外市场运营的,...

    Android-解决在webview中input标签type="file"不能使用的问题

    以上就是解决在Android WebView中`&lt;input type="file"&gt;`不能使用问题的完整步骤。需要注意的是,如果你的应用需要兼容Android M及以上版本,还需要处理运行时权限。在Android 6.0(Marshmallow)及以上版本,访问...

    android的一个webview的完整例子

    这个"android的一个webview的完整例子"是一个实际的项目实践,旨在提供一个可以直接复用、页面设计精致且包含加载状态与网络判断功能的WebView实现。 首先,我们需要了解WebView的基本使用。在Android中,WebView是...

    android webview 版本69.0

    WebView在Android开发中扮演着核心角色,因为它允许混合式应用开发,将本地Android功能与网络内容相结合。 在“android_external_chromium-webview-lineage-15.1”这个压缩包子文件的文件名称中,我们可以解读出...

    android的webView的登录实例

    在Android开发中,WebView是一个非常重要的组件,它允许我们在应用程序中加载和显示网页内容。本实例将详述如何使用Android Studio 3.1.2版本,通过WebView来创建一个简单的登录界面,该界面使用本地HTML页面进行...

    android解析pdf使用webview展示

    虽然Android原生的`WebView`不直接支持PDF,但在某些版本的Android系统中(如4.4 KitKat及以上),它可以通过内置的Chrome浏览器插件来显示PDF。以下是一个简单的示例: ```java WebView webView = new WebView...

    Android Studio 开发的WebView 框架源码

    7. **性能优化**:启用硬件加速,使用`setLayerType(View.LAYER_TYPE_HARDWARE, null)`可以提高WebView的渲染性能。 在实际开发中,开发者还需要考虑如何处理各种错误,如网络异常、加载失败等情况。此外,由于...

    Android WebView 去除标题

    至于JavaScript交互,WebView提供了多种方法与网页内容进行通信。`addJavascriptInterface`可以让Java对象的方法在JavaScript环境中调用,这对于实现数据传递、控制网页行为等非常有用。例如,我们可以创建一个Java...

    Android 基于x5Webview 浏览文件 office文档

    在"Android 基于x5Webview 浏览文件 office文档"的场景中,我们将探讨如何利用X5WebView来实现这一功能,并且这个方案已经经过了在Android 11上的测试验证。 首先,要使用X5WebView,你需要在项目中集成TBS(腾讯...

    android webview 拨打电话

    当我们需要在WebView中实现拨打电话的功能时,需要理解Android权限管理、WebView加载本地HTML以及JavaScript与Android原生代码交互等关键知识点。 首先,Android系统对拨打电话功能有严格的权限控制。在Android 6.0...

    Android笔记webview与js交互

    在Android开发中,WebView是一个非常...通过以上这些方法,Android开发者可以实现WebView与JavaScript的深度交互,从而构建功能丰富的混合式应用。在实际项目中,根据需求可以选择不同的交互方式,灵活运用这些技术。

    Android-WebSocket-WebView_DEMO_websocket_androidwebview_

    在本DEMO中,"Android-WebSocket-WebView"着重展示了如何在Android应用中集成WebSocket功能,并利用WebView加载网页,实现客户端与服务器的实时交互。这个项目对于理解WebSocket与Android WebView的结合使用具有重要...

    Android混合开发之webview的demo

    本示例"Android混合开发之webview的demo"将带你深入理解WebView的基本用法,特别是如何实现Android按钮与JavaScript之间的互相响应。 一、WebView的基本使用 1. 添加依赖:在AndroidManifest.xml文件中,确保...

    Android下WebView中调用系统相机拍照范例

    在Android开发中,WebView是一个非常重要的组件,它可以加载和显示HTML内容,实现Web与原生应用的交互。在本文中,我们将深入探讨如何在WebView中调用系统的相机功能,允许用户拍照并返回照片的存储路径。这个功能...

    Android通过WEBVIEW调用HTTPS

    在Android开发中,WebView是一个非常重要的组件,它允许我们在应用程序中内嵌网页内容,实现与网页的交互。当涉及到安全的网络通信时,HTTPS协议因其数据加密和身份验证特性成为首选。本文将深入探讨如何在Android...

    Android Webview滑动监听

    在Android开发中,Webview是一个非常重要的组件,它允许开发者在原生应用中嵌入网页内容,实现网页与原生应用的交互。本篇将详细讲解如何在Android Webview中实现滑动监听以及图片的放大缩小功能。 首先,我们要...

Global site tag (gtag.js) - Google Analytics