背景

最近,端内在做 webView 统一的时候,个性签名中的 WebView 替换为 CustomWebView 之后,发现字体突然变小。

一开始不知道是什么原因,通过二分法查找最近的提交,排查之后,发现是 SignatureWebView 的继承关系从 WebView 修改为 CustomWebView。revert 之后就正常了。

于是,我问自己,为什么会这样呢?

原因分析

我们知道,WebViewSetting 里面是可以修改 WebView 的一些默认设置的。

阅读官方文档,发现 setLoadWithOverviewMode,setUseWideViewPort 这两个方法看起来跟 WebView 缩放相关。

于是尝试把 setLoadWithOverviewMode 改为 false,很神奇,竟然正常了。

setLoadWithOverviewMode

这个方法的作用,简单来说,就是是否根据屏幕宽度自适应

Sets whether the WebView loads pages in overview mode, that is, zooms out the content to fit on screen by width. This setting is taken into account when the content width is greater than the width of the WebView control, for example, when getUseWideViewPort() is enabled. The default is false.

developer.android.com/reference/a…

这个问题解决之后,我心中又有这样的疑问,为什么别的地方没有问题,只有个性签名这里的 WebView 有问题

带着这个疑问,我再次去浏览代码,发现个性签名里面 Webview 加载的网页,是自己拼接的 html。debug 之后,发现网页代码大概是这样的

<span style="word-wrap:break-word;font-family:system-ui;font-size:16px;color:#888888;">Https://www.baidu.com</span>

可以看到里面字体的单位是 px,跟 Android 的 dp px 有点像,是不是没作屏幕适配?

搜索发现 Web 网页的代码适配单位是 rem,有点类似于 dp。

Web 网页在适配分辨率的时候,通常会设置 viewport 属性

于是我尝试在代码里面加了这样的代码,发现 SignatureWebView 显示个性签名又正常了。

parsedHtml += "<meta name=\"viewport\" content=\"width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover\">";

Web 网页字体的适配规则,这里就不班门弄斧了,有兴趣的可以自行搜索。

端内其他地方排查

我们知道,加载自定义 html,通常需要调用 loadDataWithBaseURL 方法,查看端内调用的地方,发现其他都是正常的。只有这个奇葩 SignatureWebView ,自己拼接的 html 没有加 viewport 属性,进行适配

总结

  1. 如果 html 是自己拼接的,并且像素是 px,不要设置 WebViewSetting 的 setLoadWithOverviewModesetUseWideViewPort(默认属性是 false),否则字体可能显示不正常,偏大或者偏小
  2. 如果 html 是自己拼接的,并且像素是 px,当我们设置 WebViewSetting 的 setLoadWithOverviewMode ,setUseWideViewPort 为 true(根据屏幕自适应),那么我们需要设置 html 的 viewport 规则,否则可能显示不正常
  3. html 如果是自己拼接的,需要注意适配规则,像个人签名这种,用 webView 承载自己拼接的 html ,防止踩坑

WebView 字体常见的其他坑

手机设置字体大小导致h5页面在webview中变形

出现这个问题的原因是

  1. 默认浏览器中的内容是不受系统字体大小设置控制的,至少我遇到的几台手机都是这样的情况。
  2. 某些机型 WebView 字体的大小是受手机系统字体大小控制的

问题解决方案来自这篇文章:blog.csdn.net/FungLeo/art…

这个通常有两种解决方案。

Web js 网页解决方案

  1. 一般,我们动态计算好html的font-size之后,我们就啥都不干了,就走了。
  2. 但是,我们现在知道了,我们设置的大小不一定是真实的大小,所以,我们需要在设置完字体大小之后,再去重新获取一下html的font-size,看看实际的这个值,和我们设置的是不是一样。
  3. 如果不一样,就要根据比例再设置一次。
function htmlFontSize(){var h = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);var w = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);var width = w > h ? h : w;width = width > 720 ? 720 : widthvar fz = ~~(width*100000/36)/10000document.getElementsByTagName("html")[0].style.cssText = 'font-size: ' + fz +"px";var realfz = ~~(+window.getComputedStyle(document.getElementsByTagName("html")[0]).fontSize.replace('px','')*10000)/10000if (fz !== realfz) {document.getElementsByTagName("html")[0].style.cssText = 'font-size: ' + fz * (fz / realfz) +"px";}
}

客户端 WebView 禁止缩放

Android WebView 是可以通过 WebSettings 禁止网页字体缩放的,可以通过 setTextZoom 方法解决

webview.getSettings().setTextZoom(100)

可以禁止缩放,按照百分百显示。

小结

这篇文章主要是记录 bug 的一个解决过程,技术含量不高,但是有一定的参考价值。尤其是 bug 的解决思路。

  1. 线上突然出现问题,一直找不出问题,尝试一下二分法,逐步缩小范围。
  2. 有时候,我们找到解决方案,却不一定知道原因是什么,这时候,可以多问一下自己,背后的原因是什么?在排查的过程中,我们会逐渐培养自己的一套问题解决思路,听起来很虚,但是确实存在的。
  3. 知道原因之后,我们可以继续再进一步排查一下,项目中其他模块是不是也存在这样的问题。
  4. 以后要怎么规避之类问题?写个 wiki 或者博客记录一下

推荐阅读

这几篇文章从 0 到 1,讲解 DAG 有向无环图是怎么实现的,以及在 Android 启动优化的应用。

推荐理由:启动优化动不动就聊拓扑结构,这篇文章从数据结构到算法到设计都给大家说清楚了,开源项目也有非常强的借鉴意义。

Android 启动优化(一) - 有向无环图

Android 启动优化(二) - 拓扑排序的原理以及解题思路

Android 启动优化(三)- AnchorTask 开源了

Android 启动优化(四)- AnchorTask 是怎么实现的

Android 启动优化(五)- AnchorTask 1.0.0 版本正式发布了

Android 启动优化(六)- 深入理解布局优化

找到我

我是站在巨人的肩膀上成长起来的,同样,我也希望成为你们的巨人。觉得不错的话可以关注一下我的微信公众号程序员徐公,在此感谢各位大佬们。主要分享

1.Android 开发相关知识:包括 java,kotlin, Android 技术。
2.面试相关分享:包括常见的面试题目,大厂面试真题、面试经验套路分享。
3.算法相关学习笔记:比如怎么学习算法,leetcode 常见算法总结,跟大家一起学习算法。
4.时事点评:主要是关于互联网的,比如小米高管屌丝事件,拼多多女员工猝死事件等

希望我们可以成为朋友,成长路上的忠实伙伴!

Android WebView 踩坑日记,字体怎么突然变小了???相关推荐

  1. Android WebView 踩坑日记,字体怎么突然变小了?

    parsedHtml += "<meta name="viewport" content="width=device-width,initial-scal ...

  2. Android webView 的一个坑,字体怎么突然变小了

    搜索发现 Web 网页的代码适配单位是 rem,有点类似于 dp. Web 网页在适配分辨率的时候,通常会设置 viewport 属性 于是我尝试在代码里面加了这样的代码,发现 SignatureWe ...

  3. 【Flutter混合开发踩坑日记之‘applicationVariants‘ for extension ‘android‘】

    Flutter混合开发踩坑日记之'applicationVariants' for extension 'android' 正文 坑一:Could not get unknown property ' ...

  4. ReactNative 在丁香医生项目中引入的踩坑日记

    ReactNative 在丁香医生项目中引入的踩坑日记 this没绑定到函数导致空指针 参考 React-Native 踩坑第二弹-undefined is not a function(evalua ...

  5. Android applink 踩坑指南

    Android applink 踩坑指南 原理 接入步骤 将链接与activity关联起来 加入meta data 生成身份验证JSON 真机测试 结论 官方文档 原理 与url scheme不同的地 ...

  6. 全志哪吒D1-H Tina Linux Ubuntu 22.04入门踩坑日记

    哪吒D1-H Tina Linux入门踩坑日记 系统环境 源码编译 mklibs-readelf的C++标准问题 m4的SIGSTKSZ问题 libfakeroot的_STAT_VER问题 read_ ...

  7. Win11 + Ubuntu18.04 双系统踩坑日记

    Win11 + Ubuntu18.04 双系统踩坑日记 前言 准备工作 硬件配置 镜像下载 Win11镜像下载 Ubuntu镜像下载 启动盘准备 Win11启动盘 Ubuntu启动盘 Win11安装 ...

  8. Swarm-BZZ踩坑日记之 如何让METMASK小狐狸显示gbzz

    刚入门bzz的新手还不知道小狐狸是什么的请移步上一章节:Swarm-BZZ踩坑日记之 如何在METMASK小狐狸导入节点地址 在浏览器安装好小狐狸,并添加自己的钱包地址后 会发现只显示ETH,并不显示 ...

  9. springboot踩坑日记—nacos: Error watching Nacos Service change

    springboot踩坑日记-nacos: Error watching Nacos Service change Spring Boot :: (v2.1.5.RELEASE) 错误代码: 07-3 ...

最新文章

  1. Android 获取App的版本号与版本名称的2中方法
  2. xp网吧用母盘制作说明
  3. linux不识别ntfs分区,WinUbuntu下linux无法挂载NTFS格式分区问题的解决
  4. win32 断言函数和转换到COFF期间失败错误
  5. Go go-metrics
  6. Struts2+JFreeChart
  7. 第二:Pycharm设置配置(非常详细)
  8. Java程序员开发参考资源
  9. java使用泛型_Java 泛型
  10. Ubuntu的LTS 18.04 安装FRR
  11. 怎么把度分秒化成小数_角度的度分秒与小数点格式互相转换
  12. 学做‘视频剪辑’攻略
  13. word如何去掉标题前面的黑点
  14. 自制的Arduino多级菜单类
  15. 梦幻西游转区后没显示原服务器,梦幻西游:你不知道的转区小细节,刷区时间不只是周二上午的10点...
  16. Magento 常用插件(一)
  17. 心跳重连机制(登录)
  18. 氢化溶血卵磷脂行业研究分析
  19. [渝粤教育] 西南科技大学 国际经济法 在线考试复习资料
  20. 全国大学生FPGA创新设计竞赛:FPGA—相位干涉仪测向算法

热门文章

  1. pandas模块的统计指标--实现众数和众数的频数
  2. 视频信号指标与测试方法
  3. ASP.NET profile之 找不到存储过程dbo.aspnet_CheckSchemaVersion
  4. 视频码率(Bitrate),帧率(FPS)和分辨率的联系与区别
  5. Like What You Like: Knowledge Distill via Neuron Selectivity Transfer论文初读
  6. 在网页项目中集成扫码枪设备,实现二维码扫码识别实战
  7. STM32F103校内赛-摇杆遥控器
  8. 鸡兔同笼python程序怎么写_关于鸡的歇后语
  9. 论文的参考文献的英文间隔太大的解决方法
  10. C++进阶——内存管理(一)