Android webView字体突然变小的原因及解决
作者:程序员徐公 发布时间:2022-01-02 23:39:08
目录
背景
原因分析
setLoadWithOverviewMode
端内其他地方排查
总结
WebView 字体常见的其他坑
手机设置字体大小导致h5页面在webview中变形
Web js 网页解决方案
客户端 WebView 禁止缩放
小结
背景
最近,端内在做 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 属性,进行适配
总结
如果 html 是自己拼接的,并且像素是 px,不要设置 WebViewSetting 的 setLoadWithOverviewMode ,setUseWideViewPort(默认属性是 false),否则字体可能显示不正常,偏大或者偏小
如果 html 是自己拼接的,并且像素是 px,当我们设置 WebViewSetting 的 setLoadWithOverviewMode ,setUseWideViewPort 为 true(根据屏幕自适应),那么我们需要设置 html 的 viewport 规则,否则可能显示不正常
html 如果是自己拼接的,需要注意适配规则,像个人签名这种,用 webView 承载自己拼接的 html ,防止踩坑
WebView 字体常见的其他坑
手机设置字体大小导致h5页面在webview中变形
出现这个问题的原因是
默认浏览器中的内容是不受系统字体大小设置控制的,至少我遇到的几台手机都是这样的情况。
某些机型 WebView 字体的大小是受手机系统字体大小控制的
这个通常有两种解决方案。
Web js 网页解决方案
一般,我们动态计算好html的font-size之后,我们就啥都不干了,就走了。
但是,我们现在知道了,我们设置的大小不一定是真实的大小,所以,我们需要在设置完字体大小之后,再去重新获取一下html的font-size,看看实际的这个值,和我们设置的是不是一样。
如果不一样,就要根据比例再设置一次。
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 : width
var fz = ~~(width*100000/36)/10000
document.getElementsByTagName("html")[0].style.cssText = 'font-size: ' + fz +"px";
var realfz = ~~(+window.getComputedStyle(document.getElementsByTagName("html")[0]).fontSize.replace('px','')*10000)/10000
if (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 的解决思路。
线上突然出现问题,一直找不出问题,尝试一下二分法,逐步缩小范围。
有时候,我们找到解决方案,却不一定知道原因是什么,这时候,可以多问一下自己,背后的原因是什么?在排查的过程中,我们会逐渐培养自己的一套问题解决思路,听起来很虚,但是确实存在的。
知道原因之后,我们可以继续再进一步排查一下,项目中其他模块是不是也存在这样的问题。
以后要怎么规避之类问题?写个 wiki 或者博客记录一下
来源:https://juejin.cn/post/6942404092819931166


猜你喜欢
- 本文实例为大家分享了java web个人通讯录系统的具体代码,供大家参考,具体内容如下现在开始上截图:下面粘贴代码:首先是目录结构:<
- 本文实例讲述了Java使用Preference类保存上一次记录的方法。分享给大家供大家参考。具体分析如下:在使用java中JFileChoo
- 异常方法//返回此可抛出对象的详细信息消息字符串public String getMessage() //将此可抛发对象及其回溯到标准错误流
- 配置文件请看上篇Java实现redis https://www.jb51.net/article/190922.htm下面测试redis的集
- 本文实例为大家分享了Unity使用摄像机实现望远镜效果的具体代码,供大家参考,具体内容如下听起来挺酷炫,其实超简单,就是控制摄像机的fiel
- 1.java过滤器过滤允许整个项目跨域访问,可通过filter来进行过虑:public class SimpleCORSFilter imp
- 类和结构的区别:1.一个是引用类型一个是值类型Class是引用类型,继承自System.Object类Struct是值类型,继承自Syste
- 编写程序,利用continue语句实现循环体过滤器,过滤“老鹰”字符串,并做相应的处理,但是放弃continue语句之后的所有代码。即若遇到
- dart 是一个面向对象的语言;面向对象有继承封装多态dart的所有东西都是对象,所有的对象都是继承与object类一个类通常是由属性和方法
- 1、使用排序2、原理事实上Collections.sort方法底层就是调用的array.sort方法,而且不论是Collections.so
- 接着上一篇进行学习java文件上传下载1。五、断点续传 对于熟用QQ的程序员,QQ的断点续传功能应该是印象很深刻的。因为它很实用也
- 在之前的博客中已经为大家介绍了,如何在win环境下配置DNK程序,本篇我将带大家实现一个简单的Hello jni程序,让大家真正感受一下ND
- byte:java中最小的数据类型。1字节/8位。-128(2^7)~127(2^7-1),默认值0。short:短整型,2字节/16位,取
- 一、思路1.定义一个toFind变量来传入要查找的元素2.遍历整个顺序表并判定当前下标的元素等不等于toFind3.如果等于就返回一个tru
- 将Program类的删除,将里面的静态类Main修改后放入服务类中:partial class Server1 : ServiceBase&
- 1、MyBatis调用存储过程MyBatis支持使用存储过程的配置。当使用存储过程时,需要设置一个参数“mode”,其值有IN(输入参数)、
- 一、将已经编译后的java中Class文件进行打包;打包命令JAR 如:将某目录下的所有class文件夹全部进行打包处理;使用的命令:jar
- 本文实例讲述了java实现的五子棋游戏代码,分享给大家供大家参考,具体代码如下package gyb.exam;import java.aw
- 实践过程效果代码public partial class Form1 : Form{ public Form1()
- Java 异常的栈轨迹(Stack Trace)详解 捕获到异常时,往往需要进行一些处理。比较简单直接的