日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Flutter RichText支持自定义文本溢出效果

發布時間:2025/4/16 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Flutter RichText支持自定义文本溢出效果 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

extended text 相關文章

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

之前介紹過了Extended text的圖片功能 ,今天要講的還是跟產品設計有關系,老規矩上圖

產品說,那個文本溢出的點點點后面給我加個雞腿,想什么啊,是加個 “全文”字樣,點擊之后跳轉到全文去。

就像下面這種一樣

首先,我看了下Text的源碼,發現這個...是被寫死了的,傳遞給了TextPainter

const String _kEllipsis = '\u2026'; 復制代碼

然后再向里面看,就是引擎繪畫的代碼了。。看不到了。。是我太弱了。 在google上搜索了下,發現也有問這個問題26748,上面也是說了。。需要把源碼復制出來,把_kEllipsis改成你想要的,但是。。這個是個字符串啊。。那個比如說藍色怎么弄?比如說點擊怎么弄?

想來想去,一個字就是畫,在Canvas上面盡情畫。

首先,我定義了一個TextSpan 用于用戶自定義文本溢出效果

overFlowTextSpan: OverFlowTextSpan(children: <TextSpan>[TextSpan(text: ' \u2026 '),TextSpan(text: "more detail",style: TextStyle(color: Colors.blue,),recognizer: TapGestureRecognizer()..onTap = () {launch("https://github.com/fluttercandies/extended_text");})], background: Theme.of(context).canvasColor), 復制代碼

然后我們直接來到ExtendedRenderParagraph的paint方法

@overridevoid paint(PaintingContext context, Offset offset) {_paintSpecialText(context, offset);_paint(context, offset);_paintTextOverflow(context, offset);} 復制代碼

這個效果肯定需要在畫好字之后,再來魔改

void _paintTextOverflow(PaintingContext context, Offset offset) {if (_hasVisualOverflow && overFlowTextSpan != null) {final Canvas canvas = context.canvas;///we will move the canvas, so rect top left should be (0,0)final Rect rect = Offset(0.0, 0.0) & size;var textPainter = overFlowTextSpan.layout(_textPainter);assert(textPainter.width <= rect.width,);} 復制代碼

首先我們需要layout一下我們的overFlowTextSpan,如果你定義的太長,已經超出一行了的話,那么抱歉

老動作,把畫布移動到整個文字的左上角,根據overFlowTextSpanOffset的左上角,計算出最近的TextPosition。

canvas.save();///move to extended textcanvas.translate(offset.dx, offset.dy);final Offset overFlowTextSpanOffset = Offset(rect.width - textPainter.width, rect.height - textPainter.height);///find TextPosition near overflowTextPosition overflowOffset =getPositionForOffset(overFlowTextSpanOffset); 復制代碼

再通過這個找出最近文字的top-left,這樣才能保證不會剪切到半個或者不完全的文字。

///find overflow TextPosition that not clip the original textOffset finalOverflowOffset = _findFinalOverflowOffset(rect, rect.width - textPainter.width, overflowOffset.offset);Offset _findFinalOverflowOffset(Rect rect, double x, int endTextOffset) {Offset endOffset = getOffsetForCaret(TextPosition(offset: endTextOffset, affinity: TextAffinity.upstream),rect,);//overflowif (endOffset == null || (endTextOffset != 0 && endOffset == Offset.zero)) {return _findFinalOverflowOffset(rect, x, endTextOffset - 1);}if (endOffset.dx > x) {return _findFinalOverflowOffset(rect, x, endTextOffset - 1);}return endOffset;} 復制代碼

這樣子我們就找到我們需要在哪個文字的位置把OverFlowTextSpan繪畫出來,并且想辦法把OverFlowTextSpan下一層的文字給清除或者遮擋住。

首先嘗試是用BlendMode.clear來清除指定區域的文字,失敗,不知道為什么, 我看別人也是這樣子寫的,能清除掉Canvas上面的內容,如果有哪個兄弟知道,請一定要告訴我,感謝萬分。

///why BlendMode.clear not clear the text // canvas.saveLayer(overFlowTextSpanRect, Paint()); // canvas.drawRect( // overFlowTextSpanRect, // Paint() // ..blendMode = BlendMode.clear); // canvas.restore(); 復制代碼

那么只能畫一層跟Canvas一樣的顏色來遮住文字了。這里默認使用的是

Theme.of(context).canvasColor 復制代碼

然后我們再畫上OverFlowTextSpan

textPainter.paint(canvas, Offset(finalOverflowOffset.dx, overFlowTextSpanOffset.dy)); 復制代碼

最后我們要處理一下點擊事件,保存textPainter繪畫的點(相對整個系統坐標的)

overFlowTextSpan.textPainterHelper.saveOffset(Offset(offset.dx + finalOverflowOffset.dx,offset.dy + overFlowTextSpanOffset.dy)); 復制代碼

在handleEvent方法中,我們加入以下代碼,如果找到了對應注冊了recognizer的TextSpan,我們就給它觸發,并且return(因為overFlowTextSpan在原來的字的上一層)

if (overFlowTextSpan != null) {final TextPosition position =overFlowTextSpan.textPainterHelper.getPositionForOffset(offset);final TextSpan span =overFlowTextSpan.textPainterHelper.getSpanForPosition(position);if (span?.recognizer != null) {span.recognizer.addPointer(event);return;}} 復制代碼

_offset是我們剛才保持的相對整個系統坐標的點,我們需要把傳入的Offset減掉 _offset,這樣這個overFlowTextSpan的相對自己的坐標系才是以(0,0)開始的,最后用這個TextPosition找到對應的TextSpan,大功告成。

///method for [OverFlowTextSpan]///offset int coordinate systemOffset _offset;void saveOffset(Offset offset) {_offset = offset;}///method for [OverFlowTextSpan]TextPosition getPositionForOffset(Offset offset) {return painter.getPositionForOffset(offset - _offset);}///method for [OverFlowTextSpan]TextSpan getSpanForPosition(TextPosition position) {return painter.text.getSpanForPosition(position);} 復制代碼

除了清除(覆蓋)文字的那個部分,其他應該都是比較完美的解決方案,期待大家能帶來更多點子,改進 Extended Text

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

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

總結

以上是生活随笔為你收集整理的Flutter RichText支持自定义文本溢出效果的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产精品电影网站 | 色婷五月 | 成人午夜激情网 | 天干夜夜爽爽日日日日 | 欧美深性狂猛ⅹxxx深喉 | 福利片在线观看 | 韩国中文三级hd字幕 | 欧美一级高潮片 | 能看的黄色网址 | 亚洲AV无码久久精品色三人行 | 视频免费在线观看 | www免费网站在线观看 | videos麻豆 | 天天摸天天 | 亚洲熟女综合色一区二区三区 | 波多野结衣不卡 | 九九热在线视频免费观看 | 成人激情视频在线观看 | 久久九九热| 亚洲精品资源在线 | 久久久久久久久久影视 | 国产三级自拍 | 人人爱人人艹 | 中文字幕日韩av | 一个综合色 | 色屁屁一区二区 | 精品视频一区二区三区四区 | 韩国主播青草55部完整 | 成人涩涩 | 玖玖精品视频 | 欧美一区二区激情视频 | 黄色片网站免费在线观看 | 殴美一级黄色片 | 亚洲视频在线网 | 免费av中文字幕 | 强制高潮抽搐哭叫求饶h | 老司机精品福利视频 | 久久久国产打桩机 | 艳妇臀荡乳欲伦交换在线播放 | 伊人网综合视频 | 名人明星三级videos | 国产一级自拍视频 | 久久视频一区二区 | 裸体女视频 | 黄瓜视频污在线观看 | av在线超碰 | 亚洲欧美一区二区三区在线 | 色美av| 国产乱码精品一区二三区蜜臂 | 亚洲AV蜜桃永久无码精品性色 | 成人熟女一区二区 | 欧美日韩aa | 国产精自产拍久久久久久蜜 | 亚洲精品在线视频观看 | 丰满人妻一区二区三区性色 | 香蕉国产精品 | 免费看一级 | 成人午夜网址 | 97精品一区二区 | 黄色91免费版 | 男男做爰猛烈叫床爽爽小说 | 人体私拍套图hdxxxx | 日本一区二区人妻 | 最新激情网站 | 欧美一级黄色片 | 久久精品成人一区二区三区蜜臀 | 欧美啪啪小视频 | 久久久久久国产免费a片 | 91在线观看免费高清 | 久久久精品综合 | 操人视频网站 | 国产一级aa大片毛片 | 久久激情婷婷 | 免费一区二区三区视频在线 | 欧美激情一区二区三区 | 亚洲熟妇av日韩熟妇在线 | 欧洲视频一区二区 | 野花成人免费视频 | 色屁屁一区二区三区视频 | 少妇久久久久久被弄高潮 | 嫩草午夜少妇在线影视 | 伊人一区二区三区 | 亚洲色图50p | 亚洲av不卡一区二区 | 亚洲精品乱码久久久久久日本蜜臀 | 亚洲成人精品在线播放 | 久久免费视频一区二区 | 国产一区免费观看 | 四虎国产成人精品免费一女五男 | 国产区小视频 | 免费观看一级一片 | 精品国产欧美日韩 | 欧美一级特黄aaaaaa | 日韩美女在线视频 | 孕妇疯狂做爰xxxⅹ 国产精品乱码久久久久久 99久久久成人国产精品 | 婷婷伊人久久 | 久久精品国产亚洲a | 蜜桃视频久久 | 午夜婷婷丁香 |