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

Flutter RichText支持自定义文字背景相关推荐

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

    extended text 相关文章 Flutter RichText支持图片显示和自定义图片效果 Flutter RichText支持自定义文本溢出效果 Flutter RichText支持自定义文 ...

  2. 设置网页背景,支持自定义背景样式

    网上没找到好用的,有的会报错,有的功能受限,有的收费,所以自己手撸了一个浏览器插件,支持css自定义网页样式背景,还有一些不好的地方,我懒得添加功能了,有需要可以自己改插件 安装浏览器插件,插件我放到 ...

  3. Android图片海报制作-自定义文字排版控件组件

    项目地址:https://github.com/coolstar1204/MakePoster 今天主要讲一下项目主要控件,文字排版控件组,实现类似QQ音乐歌词海报效果. 控件主要功能点 可设置背景图 ...

  4. 超轻量级中文OCR,支持竖排文字识别、ncnn推理,总模型仅17M

    整理 | AI科技大本营 光学字符识别(OCR)技术已经得到了广泛应用.比如发票上用来识别关键字样,搜题App用来识别书本上的试题. 近期,这个叫做chineseocr_lite的OCR项目开源了,这 ...

  5. jodconverter水印java,OpenOffice实现Office转Pdf(支持自定义添加水印、页眉、页脚)

    java OpenOffice officetopdf 最近项目需要实现下载Office文档时自动转成PDF文档,以下代码支持2003及2007版的Word,PPT,Excel转换,并支持自定义添加水 ...

  6. python selenium post请求_工作随笔——selenium支持post请求,支持自定义header

    2018-01-10:fix post 请求数据遗漏部分内容 背景: 最近在写一个小程序,发现博主所在的地区访问该网站时有防ddos功能验证导致程序不能正常工作. 经过试验发现可以用国外代理ip解决这 ...

  7. AllsitePasswd 全站密码访问插件 支持自定义主题模板

    简介: AllsitePasswd 是一款启用全站密码访问插件,支持自定义主题模板:@呆滞 欢迎 fork,start 说明: 插件默认自带一套模板 用户可以自定义模板,把你的html模板文件放进th ...

  8. 一行代码教你撩妹手到擒来❤html+css+js烟花告白3D相册(含音乐+可自定义文字)520表白/七夕情人节/求婚

    ❤ 我是如何获取学姐芳心~html+css+js实现满屏烟花3D相册(含音乐+自定义文字) 一年一度的520情人节/七夕情人节/女朋友生日/程序员表白/送礼物/3D相册,是不是要给女朋友或者正在追求的 ...

  9. IM界面高仿微信,android表情转ios表情,支持自定义表情,支持语音(实战界面)

    前言: 2018年底由子公司来到现在的集团公司,从互联网公司变成了企业公司.在最近一个项目里,做的辛辛苦苦,功能又被砍了.没有理由,心力交瘁!本来是打算自己做IM的,现在被砍了.我就把本地功能贡献出来 ...

最新文章

  1. 七夕福利 | 3D视觉从入门到精通系统学习教程
  2. 贝叶斯居然用事件概率,就轻松预知了未来?
  3. 12本最优秀的Android开发电子书强力推荐
  4. windows如何安装python-手把手教你如何在windows系统安装python?
  5. mysql两个表left join_mysql中两张表使用left join on 求差集
  6. Fifth Week:Node.js学习
  7. 5-Error:failed to find Build Tools revision 28.0.0 rc1解决方案
  8. Java中字符串以小数点分割时无效,String s = “12.34“; String[] ss = split(“.“);分割结果为空
  9. ES6学习--Javascript中的那三个点(...)
  10. matlab流量结构分析,科学网-分享求解“结构分解分析(SDA)”各项均值的MATLAB程序-计军平的博文...
  11. 在Web.Config中指定页面的基类
  12. open表和closed表_什么是左外连接?左外连接在工作表查询中的应用
  13. 《 ATSS:Adaptive Training Sample Selection》
  14. Java 实战篇-JDK9新特性
  15. SiT5357:±0.1~±0.25ppm超高精度Stratum 3温补振荡器TCXO,60-220MHz
  16. python屏幕录制与回放_使用Python来做一个屏幕录制工具的操作代码
  17. GBase 8s 数据库操作指南
  18. 智能物联网系统降低劳动强度和人工成本
  19. 一些英文论文中的常用句式
  20. 怎么在Word中插入几何画板图形

热门文章

  1. java 入门 博客园_javaweb入门
  2. POJ3006-Dirichlet's Theorem on Arithmetic Progressions
  3. 基于mykernel完成多进程的简单内核
  4. 【AGC005F】Many Easy Problems (NTT)
  5. POJ 2773 欧几里得
  6. 利用photoshop制作gif图片
  7. HDU1598【最小生成树拓展】
  8. socket与socketServer通信
  9. Silverlight学习笔记十七BingMap(三)之地图的地区标识
  10. shell 脚本编写使用