Android WebView 踩坑日記,字體怎麼突然變小了???

来源:https://www.cnblogs.com/gdutxiaoxu/archive/2023/02/21/17141457.html
-Advertisement-
Play Games

背景 最近,端內在做 webView 統一的時候,個性簽名中的 WebView 替換為 CustomWebView 之後,發現字體突然變小。 一開始不知道是什麼原因,通過二分法查找最近的提交,排查之後,發現是 SignatureWebView 的繼承關係從 WebView 修改為 CustomWeb ...


背景

最近,端內在做 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 : 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 開發相關知識:包括 java,kotlin, Android 技術。
2.面試相關分享:包括常見的面試題目,大廠面試真題、面試經驗套路分享。
3.演算法相關學習筆記:比如怎麼學習演算法,leetcode 常見演算法總結,跟大家一起學習演算法。
4.時事點評:主要是關於互聯網的,比如小米高管屌絲事件,拼多多女員工猝死事件等

希望我們可以成為朋友,成長路上的忠實伙伴!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文旨在站在研發的角度上通過手動實踐搭建運行環境,文中不拖泥帶水過多講述基礎知識,結合Hadoop和Spark最新版本,幫助大家跟著步驟一步步實踐環境搭建。 ...
  • 背景: pgsql連接時候報錯org.postgresql.util.PSQLException: FATAL: sorry, too many clients already, 意思是client已經把連接池占滿了. 使用ps -ef | grep postgres刪除幾個進程, 進入資料庫運行S ...
  • PXC
    centos8下安裝pxc-80 官方地址 https://www.percona.com/doc/percona-repo-config/index.html https://www.percona.com/doc/percona-xtradb-cluster/LATEST/install/yum ...
  • 數據驅動理念已被各行各業所熟知,核心環節包括數據採集、埋點規劃、數據建模、數據分析和指標體系構建。在用戶行為數據領域,對常見的多維數據模型進行信息提煉和模型整合,可以形成一套常見的數據分析方法來發現用戶行為的內在聯繫,能更好洞察用戶的行為習慣和行為規律,幫助企業挖掘用戶數據的商業價值。 行業內... ...
  • 閱識風雲是華為雲信息大咖,擅長將複雜信息多元化呈現,其出品的一張圖(雲圖說)、深入淺出的博文(雲小課)或短視頻(雲視廳)總有一款能讓您快速上手華為雲。更多精彩內容請單擊此處。 摘要:Flink是一個批處理和流處理結合的統一計算框架,其核心是一個提供了數據分發以及並行化計算的流數據處理引擎。它的最大亮 ...
  • 摘要:你知道數倉是如何應運而生的嗎?你瞭解數倉未來的發展趨勢嗎?想知道國內數倉專家的看法嗎? 導語 數據倉庫的發展一直是備受關註的議題,隨著近年來技術的不斷演進,數倉也在更新迭代。 你知道數倉是如何應運而生的嗎?你瞭解數倉未來的發展趨勢嗎?想知道國內數倉專家的看法嗎? 今天我們邀請到了華為雲數據倉庫 ...
  • ETL的架構 ETL架構的優勢: ETL相對於EL-T架構可以實現更為複雜的數據轉化邏輯 ETL採用單獨的硬體伺服器,可以分擔資料庫系統的負載 ETL與底層的資料庫數據存儲無關,可以保持所有的數據始終在資料庫當中,避免數據的載入和導出,從而保證效率,提高系統的可監控性。 ELT主要通過資料庫引擎來實 ...
  • 九宮格圖片佈局,長按直接拖拽圖片,長按時顯示底部刪除佈局,拖拽到刪除佈局處鬆手可刪除佈局,最後添加按鈕不可拖拽,基於 BaseQuickAdapter 基礎上實現 BaseQuickAdapter 確實很好用,簡化我們的實現代碼,它本身也集成了一套拖拽實現,不過目前無法完美的滿足上面的需求,需要做一 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...