android4.0 以上一部分手机的 webview 中 canvas BUG

本贴最后更新于 1780 天前,其中的信息可能已经水流花落

网页开发要面对各种各样的浏览器,让人很头疼,而移动开发中,你不但要面对浏览器,还要面对各种版本的手机,ios 好一点,而安卓就五花八门了,你可能在开发中也被它们折磨过,或者正在被它们折磨,我在这里说几个我在开发中遇到的比较难缠问题,和解决方案,给其他朋友提个醒,因为一旦碰到了这些 bug,虽然解决方法不难,但是你可能要花上几个小时,几天,甚至更长时间才能解决它们,遇到这些 bug 的话要注意,以后发现其他 bug 也会继续补充,也希望你也可以把你遇到的 bug 或者解决方案回复给我,我会一起补充到文章里,帮助其他人一起解决问题。

bug 一:
现象:
android4.0 以上一部分手机的 webview 中,当 canvas 小于屏幕大小时,绘图时会出现重影,就是说一个图只绘制了一遍,却出现了两个
解决方案:
canvas 外层的 div 需要设定属性 style="overflow:visible;-webkit-transform: translateZ(0);

bug 二:
现象:
Galaxy S4 的 webview 中的 canvas 绘图有严重 bug,无论是 fillRect 还是 drawImage,会把 0,0 开始的 1 个像素,绘制到整个 canvas,导致画面无法显示。注:此现象只出现在首次页面加载,当第二次进入页面后没有此问题。
解决方案:
galaxy s4 的 webview 显示 canvas 的时候,有两个条件必须满足:
1,canvas 外层的 div 需要设定属性 style="overflow:visible;-webkit-transform: translateZ(0);"
2,页面上不得含有 img 标签

bug 三:
现象:
android4.x 中一部分手机,在改变 canvas 大小的时候有时会卡死。大家可能都知道,重新设定 canvas 的大小可以实现 canvas 的完全刷新,但是也会导致一部分 4.x 手机卡死。
解决方案:
用 clearRect 刷新 canvas。

bug 四:
现象:
WebView 页面引入 iScroll 框架后,会导致一部分 android4.x 的 click 事件发生两次。这个其实是框架的 bug,但是很多人在用,就在上周我还在群里碰到一个朋友问到了这个问题。
解决方案:
遇到的朋友不用问 google 或百度了,因为官方没有提供解决办法,所以目前只能弃用 iScroll

备注:感谢网友[Meathill]提供信息,“可以设置 click: false,不然 iScroll 会用代理的方式触发一次 click”,遇到问题的朋友可以试一下。

bug 五:
现象:
使用 HTML5 的 canvas 进行绘图,android4.0 以上,有一大部分手机会经常出现 clearRect 无效的 bug。
解决方案:
方案 1:

canvas.width=canvas.width
来代替
canvas.clearRect().getContext("2d").clearRect()
但是,这样做的后果,就是另有一小部分(比如国内的三星 NOTE2 和 S4 等)会出现浏览器卡死的情况。
方案 2:

就是用不透明背景,对于每侦重绘的游戏或应用来说,不透明背景就不会存在清屏的问题,当然这其实是选择了绕行,对于需要将 canvas 背景设置成透明的情况还是没有解决。

方案 3:

canvas.clearRect(0, 0, w, h);
canvas.style.visibility = ‘hidden’; // Force a change in DOM
canvas.offsetHeight; // Cause a repaint to take play
canvas.style.visibility = ‘inherit’; // Make visible again
这个会导致延时。

方案 4:

canvas.clearRect(0, 0, w, h);
canvas.style.display = ‘none’;// Detach from DOM
canvas.offsetHeight; // Force the detach
canvas.style.display = ‘inherit’; // Reattach to DOM

这个会产生锯齿,但是我认为是目前最好的方案了。
方案 3 和方案 4 由网友 Codezz 提供,解决方案的出处为。

https://medium.com/@dhashvir/android-4-1-x-stock-browser-canvas-solution-ffcb939af758

bug 六:
现象:
android 手机,微信 6.1,qq 浏览器 x5 内核,这三个条件存在的前提下,在弹出输入框的时候,整个 canvas 画面会被压扁。希望微信以后升级能解决这个问题吧。
解决方案:
目前还没有找到完美的解决方案,如果有人知道,请一定告诉我。

感觉现在最好的办法就是将 canvas 页面和有输入框的页面分离开。

还有一种方法只能解决一部分手机的问题,就是在 canvas 的上一层的 div 中,设置 style.width 和 style.height 分别等于 canvas 的 style.width 和 style.height,但是经过测试,这样只能解决一部分手机。

另外,下面是 Android4.0 中使用 iframe 时的限制或者是 bug,
iframe 中的 bug 我只遇到了一部分,然后稍微查了一下,发现原来还有很多,我就全列出来了

1,<a>标签中即使设定display:block,也会变成display:inline。 2,属性为position:fixed的元素无法点击。(另外Android的Chrome的话,如果iframe中有元素的position属性被指定为fixed或者absolute时将无法使用下拉条。) 3,document.body.scrollTop无法获取。 4,-webkit-tap-hightlight-color指定无效。 5,Anchor link无效 6,页面最下面的<a>超链接可点击,但是点击无效,页面不会跳转。 7,z-index重叠的元素,pointer-events指定无效。

--------------------

以下部分开始,由网友提供,感谢其他网友一起分享

--------------------

一,

[完美小盒子]:使用绝对定位的输入框,有时会无法输入东西,涉及 IOS 和 Android 所有版本的默认浏览器。 暂时没有完美的解决办法, 只有个很笨的办法,就是在 onload 里加上 input.value = " "; 这样改变输入框的值后,就可以正常输入了。
————————————————
版权声明:本文为 CSDN 博主「lufy」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lufy_legend/java/article/details/17498837

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
zhaozhizheng
没有人会关心你付出过多少努力,撑得累不累,摔得痛不痛,他们只会看你最后站在什么位置,然后羡慕或者鄙夷 北京

推荐标签 标签

  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖 • 3 关注
  • 正则表达式

    正则表达式(Regular Expression)使用单个字符串来描述、匹配一系列遵循某个句法规则的字符串。

    31 引用 • 94 回帖
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 734 关注
  • RYMCU

    RYMCU 致力于打造一个即严谨又活泼、专业又不失有趣,为数百万人服务的开源嵌入式知识学习交流平台。

    4 引用 • 6 回帖 • 54 关注
  • Thymeleaf

    Thymeleaf 是一款用于渲染 XML/XHTML/HTML5 内容的模板引擎。类似 Velocity、 FreeMarker 等,它也可以轻易的与 Spring 等 Web 框架进行集成作为 Web 应用的模板引擎。与其它模板引擎相比,Thymeleaf 最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个 Web 应用。

    11 引用 • 19 回帖 • 382 关注
  • GAE

    Google App Engine(GAE)是 Google 管理的数据中心中用于 WEB 应用程序的开发和托管的平台。2008 年 4 月 发布第一个测试版本。目前支持 Python、Java 和 Go 开发部署。全球已有数十万的开发者在其上开发了众多的应用。

    14 引用 • 42 回帖 • 803 关注
  • 旅游

    希望你我能在旅途中找到人生的下一站。

    93 引用 • 901 回帖 • 2 关注
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 662 关注
  • 外包

    有空闲时间是接外包好呢还是学习好呢?

    26 引用 • 233 回帖 • 1 关注
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 93 关注
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖 • 1 关注
  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 719 关注
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    211 引用 • 358 回帖
  • Outlook
    1 引用 • 5 回帖 • 3 关注
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    693 引用 • 537 回帖
  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    12 引用 • 54 回帖 • 168 关注
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    20 引用 • 37 回帖 • 570 关注
  • 阿里巴巴

    阿里巴巴网络技术有限公司(简称:阿里巴巴集团)是以曾担任英语教师的马云为首的 18 人,于 1999 年在中国杭州创立,他们相信互联网能够创造公平的竞争环境,让小企业通过创新与科技扩展业务,并在参与国内或全球市场竞争时处于更有利的位置。

    43 引用 • 221 回帖 • 75 关注
  • NetBeans

    NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

    78 引用 • 102 回帖 • 700 关注
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 498 关注
  • 负能量

    上帝为你关上了一扇门,然后就去睡觉了....努力不一定能成功,但不努力一定很轻松 (° ー °〃)

    88 引用 • 1235 回帖 • 411 关注
  • 职场

    找到自己的位置,萌新烦恼少。

    127 引用 • 1708 回帖
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    20 引用 • 23 回帖 • 735 关注
  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖
  • 快应用

    快应用 是基于手机硬件平台的新型应用形态;标准是由主流手机厂商组成的快应用联盟联合制定;快应用标准的诞生将在研发接口、能力接入、开发者服务等层面建设标准平台;以平台化的生态模式对个人开发者和企业开发者全品类开放。

    15 引用 • 127 回帖
  • OnlyOffice
    4 引用 • 23 关注
  • 禅道

    禅道是一款国产的开源项目管理软件,她的核心管理思想基于敏捷方法 scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来,完整地覆盖了项目管理的核心流程。

    6 引用 • 15 回帖 • 45 关注