本文介绍: 如果 html 是自己拼接的,并且像素px,不要设置 WebViewSetting 的(默认属性false),否则字体可能显示不正常,偏大或者偏小如果 html 是自己拼接的,并且像素px,当我们设置 WebViewSetting 的,setUseWideViewPorttrue(根据屏幕适应),那么我们需要设置 htmlviewport规则,否则可能显示不正常。

背景

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

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

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

原因分析

我们知道,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 加载网页,是自己拼接htmldebug 之后,发现网页代码大概是这样的

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

可以看到里面字体的单位是 px,跟 Androiddp 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(根据屏幕适应),那么我们需要设置 htmlviewport 规则,否则可能显示不正常
  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 : 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解决思路。

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

推荐阅读

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

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

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

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

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

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

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

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

找到我

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

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

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

原文地址:https://blog.csdn.net/yujun2023/article/details/129290159

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_10111.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注