WebView 和Animation冲突

当有WebView时,可能会出现 动画没有执行过程. 解决方法:

child.setLayerType(View.LAYER_TYPE_HARDWARE, null);
child.setAnimation(animation);

了解老码农个人隐私,请看这里:http://www.koulianbing.com/?page_id=12

先说说这三个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

时间: 2024-11-20 23:58:28

WebView 和Animation冲突的相关文章

android html 与webview属性从冲突

在最近的项目开发中,使用webview加载html页面,这样可以节省大量页面开发的时间,同时也可加快项目进度. 我们需求是需要显示商品评论,页面设计如下: 调用android代码,对于webview的设置如下: webView.getSettings().setJavaScriptEnabled(true); webView.getSettings().setBuiltInZoomControls(true); webView.getSettings().setLayoutAlgorithm(L

ActivityGroup HorizontalScrollVew WebView 滑动事件冲突!

在开始正文之前,首先得感谢http://waynehu16.iteye.com/blog/1926741提供的一篇转载文章,里面说的内容和插图让我对TouchEvent的事件传递迅速有了一个大致的印象.但是文章里面有说的不全面不详细的地方,特发此博客记录个人对于这类问题的理解,用来补充和完善,有不妥的地方,也欢迎大家批评讨论. 正如命名一样,onInterceptTouchEvent用来拦截事件,onTouchEvent用来处理事件,网上大部分的文章中也都对这两类方法的使用情况进行了简单的说明.

[某鸥实训记][objective-c][第三天][个人笔记]

..还是粘的课上做的笔记 //WebView+Image Animation+Timer //UIBarButton UIBarButtonItem *bar = [[UIBarButtonItem alloc] initWithBarButtonSystemItem: UIBarButtonSystemItemSearch target:self action:@selector(search:)]; self.navigationItem.rightBarButtonItem = bar;

基于Material-Design的Gank-IO客户端

title: 基于Material Design的Gank IO客户端 date: 2017-03-13 12:58:03 tags: - Android - Material Design - RxJava - Retrofit - ButterKnife - MVP categories: - Android 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:GankIO 文中如有纰漏,欢迎大家留言指出. 据说去年 RxJava + Retrofit 很火,但是自己一

LayaIDE 报typescript编译版本不一致的错

LayaIDE 报typescript编译版本不一致的错 文件 -> 首选项->用户设置那里修改下 settings.json // 将设置放入此文件中以覆盖默认设置 { "typescript.check.tscVersion": true, "typescript.tsdk":"D:/Download/Laya/LayaAirIDE/resources/app/extensions/node_modules/typescript/lib&q

Android 解决WebView和ScrollView滚轮滑动冲突

第一步,重写WebView的onGenericMotionEvent方法 /** * 滑轮处理 */ @Override public boolean onGenericMotionEvent(MotionEvent event) { if (callback != null) return callback.onGenericMotionEvent(event); return super.onGenericMotionEvent(event); } //定义一个接口,把滚动事件传递出去 pu

swipeRefreshLayout与webview滑动冲突

遇到这么个bug,webview使用swipeRefreshLayout时,下拉时事件不会被webview捕获,而是执行swipeRefreshLayout的刷新,网上一大堆一大堆的解决办法,都是什么重写swipeRefreshLayout或者重写WebView,本来为了快点解决bug copy了一下,结果发现妈的智障...琢磨了一下,很简单的一个事... mWebView.setOnScrollChangeListener(new View.OnScrollChangeListener() {

[原创]本地解决ViewPager和Webview引起的滑动冲突问题

前言:毕业之后在高薪的后厂村互联网公司和生活工作平衡的体制内之间纠结了好久,最后选择了后者,毕竟后厂村只要有技术什么时候都能去,体制内基本上除了应届生这次机会基本上就再也进不去了,社招就算进去也没有编制.基于"面对两难选择时,选择没有体验过的那个"的原则,选择了体制,然后有幸被分配到了移动端开发的部门,以前积累的一点小知识算是没有浪费.负责的这个app每天有几千人用,虽然大家都在吐槽它速度慢,体验差,bug多,适配不友好--但是如果你是他的客户,你是不得不用的,因为--他管钱. 需求:

如何解决IOS 动画中 Autolayout 与View Transforms的冲突

IOS 的动画放大与缩小,并非按照找它的中心点放大和缩小,而是左上角 .我分析了下原来是Autolayout 与View Transforms的冲突造成的. - (void) addSubviewWithZoomInAnimation:(UIView*)view duration:(float)secs option:(UIViewAnimationOptions)option { // first reduce the view to 1/100th of its original dimen