Flutter RichText支持自定義文字背景

extended text 相關文章

  • Flutter RichText支持圖片顯示和自定義圖片效果
  • Flutter RichText支持自定義文本溢出效果
  • Flutter RichText支持自定義文字背景
  • Flutter RichText支持特殊文字效果

之前介紹過了Extended text,老規矩上圖

UI設計說,那個字可以加個卟呤卟呤閃閃的背景嗎? 當然可以啊,沒問題,我就去加,不就是TextStlye里面加個Background的嗎?

那個啥。。我的中文字呢?

又試了試,把背景色改成半透明的,中文字終于出來了,但是

尼瑪,這個頂部高亮是什么鬼

也不吐槽了,想看bug的去24335和24337 看看,這個問題是我發現,@吉原拉面 姐姐幫忙驗證,然后我們2個都開了issue,然后我的被關了,只剩下小姐姐的(有內情嗎)。那個我可以@吉原拉面 嗎,就是那個網紅程序猿 吉原拉面

對產品設計說

被慫為啥別人別的平臺能做啊,不管,必須支持。于是我又去看了下issue,去年的issue,都快4個月了。。搞什么鬼,修不修? 算了,不修,老夫自己來畫。。

文本里面加入圖片我們做過了那么一切好像都是順水成章的事情了。如果下面有哪里覺得講的有點跳躍,請先看之前的那篇文章,謝謝。

先放出圖

直接來到paint方法,還是循環找到BackgroundTextSpan

if (ts is BackgroundTextSpan) {var painter = ts.layout(_textPainter);Rect textRect = topLeftOffset & painter.size;Offset endOffset;if (textRect.right > rect.right) {int endTextOffset = textOffset + ts.toPlainText().length;endOffset = _findEndOffset(rect, endTextOffset);}ts.paint(canvas, topLeftOffset, rect, endOffset: endOffset);} else if (ts.children != null) {_paintSpecialTextChildren(ts.children, canvas, rect,textOffset: textOffset);}textOffset += ts.toPlainText().length;
復制代碼

這里我們要注意,因為你拿到的BackgroundTextSpan并且使用TextPainter出來的只能知道它整個文字的高度長度,不能直接知道它是否換行了,是否里面的文字是否文本溢出了,所以當文本最右邊大于整個文本的右邊的時候,就說明這個換行或者溢出了。使用_findEndOffset方法,我們從BackgroundTextSpan的最后一個字的位置向前找,直到找出BackgroundTextSpan最后一個不是文字溢出的位置

Offset _findEndOffset(Rect rect, int endTextOffset) {Offset endOffset = getOffsetForCaret(TextPosition(offset: endTextOffset, affinity: TextAffinity.upstream),rect,);//overflowif (endOffset == null || (endTextOffset != 0 && endOffset == Offset.zero)) {return _findEndOffset(rect, endTextOffset - 1);}return endOffset;}
復制代碼

找到之后就好辦了,如果endOffset為null,說明可以直接畫背景

  canvas.drawRect(textRect, background);
復制代碼

否則就說明這個BackgroundTextSpan有換行。

paint(Canvas canvas, Offset offset, Rect rect, {Offset endOffset})
復制代碼

那么就分為三部分: 1.offset 到整個文本的最右邊 2.整行 3.整個文本的最左邊到endOffset

其實應該很好理解,通過下面的算法,計算出中間是否有整行

      ///endOffset.y has deviation,so we calculate with text height///print(((endOffset.dy - offset.dy) / _painter.height));var fullLinesAndLastLine =((endOffset.dy - offset.dy) / _textPainterHelper.painter.height).round();
復制代碼

剩下的就是繪畫了,詳見

到了這里,我們就已經解決掉了,中文字體和數字在一個TextSpan的時候Background的問題了。

但是這時候產品設計又來了,這是卟呤卟呤閃閃的背景?加個圓角可以不? 加個陰影可以不??

當然可以,什么東西我不能畫的,除了錢。。

于是我給BackgroundTextSpan加了clipBorderRadius圓角設置和paintBackground回調

  ///clip BorderRadiusfinal BorderRadius clipBorderRadius;///paint background by yourselffinal PaintBackground paintBackground;
復制代碼

圓角設置簡單。。之前我們不就做過了,詳見

PaintBackground 回調,給大家自己定義背景的機會。

             if (backgroundTextSpan.clipBorderRadius != null) {canvas.save();canvas.clipPath(Path()..addRRect(backgroundTextSpan.clipBorderRadius.resolve(painter.textDirection).toRRect(fullLineRect)));}///draw full line                              canvas.drawRect(fullLineRect, backgroundTextSpan.background);if (backgroundTextSpan.clipBorderRadius != null) {canvas.restore();}
復制代碼

至于陰影,官方的BoxDecoration里面寫的很詳細,其實很多效果我都是看這個類才會的。。大家有空的話多看看源碼能得到不少啟示。

最后放上 Github Extended_Text,如果你有什么不明白的地方,請告訴我,歡迎加入Flutter Candies,一起生產可愛的Flutter 小糖果(QQ群:181398081)

轉載于:https://juejin.im/post/5c8bf9516fb9a049c9669204

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/275553.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/275553.shtml
英文地址,請注明出處:http://en.pswp.cn/news/275553.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

細說 Vue.js 3.2 關于響應式部分的優化

大家好,我是若川。上一篇寫的是:初學者也能看懂的 Vue3 源碼中那些實用的基礎工具函數。今天再分享一篇 Vue 3.2 的文章。學習源碼整體架構系列、年度總結、JS基礎系列背景Vue 3 正式發布距今已經快一年了,相信很多小伙伴已經在生產環境用上了…

linux 運行apj,pxe+ris-linux實現在DELL R710上網絡安裝windows2003

一、前言網絡遠程安裝windows2003,目前有兩種方法:一就是通過windows自帶的遠程安裝服務(RIS,Remote Installation Service),但這種方法需要用windows做為源服務器,需要安裝域控制器,dhcp,tftp等…

Debian Security Advisory(Debian安全報告) DSA-4411-1 firefox-esr security update

Debian Security Advisory(Debian安全報告) DSA-4411-1 firefox-esr security update Package :firefox-esr CVE ID: CVE-2018-18506 CVE-2019-9788 CVE-2019-9790 CVE-2019-9791 CVE-2019-9792 CVE-2019-9793 CVE-2019-9795 CVE-2019-9796 CVE…

Entity framework WhereInExtension

摘自 http://www.cnblogs.com/ejiyuan/archive/2009/07/20/1527224.html publicstaticclassWhereInExtension {privatestaticExpression<Func<TElement, bool>>BuildWhereInExpression<TElement, TValue>(Expression<Func<TElement, TValue>>pro…

寫給初中級前端的高級進階指南

大家好&#xff0c;我是若川。最近組織了源碼共讀活動。每周讀 200 行左右的源碼。很多第一次讀源碼的小伙伴都感覺很有收獲&#xff0c;感興趣可以加我微信ruochuan12&#xff0c;拉你進群學習。前言我曾經一度很迷茫&#xff0c;在學了 Vue、React 的實戰開發和應用以后&…

Spring Boot Log4j2 日志學習

簡介 Java 中比較常用的日志工具類&#xff0c;有&#xff1a; Log4j、SLF4j、Commons-logging&#xff08;簡稱jcl&#xff09;、Logback、Log4j2&#xff08;Log4j 升級版&#xff09;、Jdk LoggingSpring Boot 默認使用 Logback&#xff0c;但相比較而言&#xff0c;Log4j2 …

學習java過程中

今天看了一個java的代碼&#xff0c;結果出現Class bytes found but defineClass()failed for的錯誤&#xff0c;在網上google了一把&#xff0c;找到原因是&#xff1a;我的編譯環境的jdk和代碼的jdk不一致&#xff0c;比原來的jdk要高。換一下就解決了。轉載于:https://www.c…

linux系統遠程教程,Linux下實現遠程協助

一、檢查系統是否安裝有tcl和expect這2個軟件包[rootlocalhost:~]$ rpm -qa | grep tcltcl-8.4.7-2tclx-8.3.5-4[rootlocalhost:~]$ rpm -qa | grep expectexpect-5.42.1-1二、檢查是否有kibitz命令[rootlocalhost:~]$ whereis kibitzkibitz: /usr/bin/kibitz /usr/share/man/m…

圖片相似度對比原理_設計原理:對比和相似性的應用

圖片相似度對比原理You know why you are able to read this article right now apart from the availability of your eyes, internet, device, etc.? What is the font color of this text you’re reading? — Black. What is the background color of this page you’re …

學習尤雨溪寫的 Vue3 源碼中的簡單工具函數

大家好&#xff0c;我是若川。最近組織了源碼共讀活動。每周讀 200 行左右的源碼。很多第一次讀源碼的小伙伴都感覺很有收獲&#xff0c;感興趣可以加我微信ruochuan12&#xff0c;拉你進群學習。初學者也能看懂的 Vue3 源碼中那些實用的基礎工具函數本文是紀年小姐姐源碼共讀第…

APK 本地化

一個APK反編譯利器Apktool(android漢化)2010-07-19 18:52轉載自&#xff1a;http://blog.sina.com.cn/s/blog_5752764e0100kv34.html APK 本地化 [http://www.andmoto.com/viewthread.php?tid3873]說起APK的漢化&#xff0c;目前大部分教程都是讓用Hex Workshop或者Android R…

Linux manjaro系統安裝后無法連接wifi,解決方案

2019獨角獸企業重金招聘Python工程師標準>>> 筆記本為聯想 thinkpad E480 首先通過命令lspci -k看一下原因是否為缺少wifi驅動&#xff0c;如下&#xff0c;如果沒有Kernel driver in use&#xff0c;說明缺少驅動。05:00.0 Network controller: Realtek Semiconduc…

檢測輸入路徑是否存在錯誤_為什么存在用戶輸入錯誤

檢測輸入路徑是否存在錯誤Errors are a fact of life when using almost any type of software. Forms are the worst though. Nothing is more frustrating than filling out a form and getting a robotic message from the computer telling you that you have failed, plea…

若川邀你進 源碼共讀 群~長期交流學習

大家好&#xff0c;我是若川。這是一個愉快的周六~估計還是有很多讀者不知道我。若川名字由來是取自&#xff1a;上善若水&#xff0c;海納百川。順便放兩篇文章。我讀源碼的經歷&#xff0c;跟各位讀者朋友分享下公眾號運營策略加我微信進 源碼共讀 群最近組織了近200人每周源…

2005 打開 2010 項目經驗總結

下面是網上的直接復制粘貼&#xff1a;網址為 http://hi.baidu.com/zealot886/blog/item/7364d4266a2a1555ac34dea6.html/cmtid/65ff140a660e02246159f3db 這里是我自己的總結 &#xff08; 1、用vs2010 將該解決方案的所有 項目都改為 net 2.0&#xff08;方法&#xff0c;右擊…

讀取linux的運行狀態,Linux下安裝使用sar工具來獲取系統運行狀態

sar 找出系統瓶頸的利器sar是System Activity Reporter(系統活動情況報告)的縮寫。sar工具將對系統當前的狀態進行取樣&#xff0c;然后通過計算數據和比例來表達系統的當前運行狀態。它的 特點是可以連續對系統取樣&#xff0c;獲得大量的取樣數據&#xff1b;取樣數據和分析的…

說說 Spring 的事務同步管理器

Spring 將 JDBC 的 Connection、Hibernate 的 Session 等訪問數據庫的連接或者會話對象統稱為資源&#xff0c;這些資源在同一時刻是不能多線程共享的 。 為了讓 DAO 或 Service 類可以實現單例模式&#xff0c; Spring 的事務同步管理類 org.springframework.transaction.supp…

錯過校招_我們在用戶測試中容易錯過的事情

錯過校招What makes a tool well designed? As a designer, I’ve thought about this question for a long time, and over the past few years I’ve developed a system that I now use with every new project I approach, from small startups to large companies like L…

這些 JS 中強大的操作符,總有幾個你沒聽說過

大家好&#xff0c;我是若川。今天推薦一篇相對簡單些的文章。大家應該都知道了我最近組織了源碼共讀活動&#xff0c; 有小伙伴表示讀源碼上癮&#xff0c;也很有收獲。工作0-5年都可以參與。感興趣可以加我微信 ruochuan12 私信 源碼 進群。1. 數值分割符 _2. 逗號運算符 ,3.…

Class 創建性能大比拼(反射,泛型反射,泛型創建,緩存Emit,非緩存Emit)

一說到反射&#xff0c;很多人都想到了性能&#xff0c;更有甚者直接說“慎用反射&#xff0c;遺患無窮”&#xff0c;“用反射&#xff0c;感覺怎么像是退步啊&#xff5e;”&#xff0c;看到這種言論&#xff0c;直接把反射妖魔化了&#xff0c;如果這種言論長此以往&#xf…