【Godot4.2】CanvasItem绘图函数全解析 - 6.TextLine和TextParagraph详解

概述

上一节讲述了CanvasItem内置文本绘制函数,以及TextLineTextParagraph类,绘制单行和多行文本的基础内容。
但是实际上TextLineTextParagraph类比我们想象的要功能丰富和强大的多。本节就来详细介绍一下。

系列目录

  • 0.概述
  • 1.绘制简单图形
  • 2.设定绘图变换
  • 3.绘制纹理
  • 4.绘制样式盒
  • 5.绘制字符和字符串
  • 6.TextLine和TextParagraph详解
  • 7.自定义节点TextBoard
  • 8.绘制点索引
  • 9.绘制表格

TextLine详解

制表位的使用

TextLine提供了tab_align()方法,可以直接将单行文本与指定的制表位对齐。这也就是制表符和制表位原始的含义和用法。

extends Node2Dvar font = ThemeDB.fallback_font
var pos := Vector2(200,200)                # 绘制位置 - 表格左上角点func _draw() -> void:# 构造TextLinevar text = TextLine.new()text.add_string("序号\t姓名\t性别\t年龄",font,16)text.tab_align([50,60,60,200])# 绘制text.draw(get_canvas_item(),pos)

在上面的代码中:

  • 我们将字符串"序号\t姓名\t性别\t年龄"添加给TextLine实例
  • 然后为tab_align()传入[50,60,60,200],也就是每列的列宽。

绘制的效果如下:
image.png

图文混排

  • 当你看到TextLine使用add_string()而不是类似text的属性,你就知道问题不简单。
  • 实际上,TextLine确实可以用add_string()以类似数组的append()末尾追加的方式分几次构成一个完整的字符串,但是更重要的是配合add_object()方法,实现图文混排

以下面的代码为例:

extends Node2Dvar font = ThemeDB.fallback_font
var pos := Vector2(200,200)                # 绘制位置 - 表格左上角点
const img0 = preload("res://imgs/0.png")
func _draw() -> void:# 构造TextLinevar text = TextLine.new()text.add_string("前面的文字",font,16)text.add_object(img0,Vector2(36,36),INLINE_ALIGNMENT_BOTTOM,1)text.add_string("后面的文字",font,16)# 绘制text.draw(get_canvas_item(),pos)var rect = text.get_object_rect(img0) # 获取占位矩形大小rect.position += posdraw_texture_rect(img0,rect,false)  # 绘制图片

上面的代码中:

  • 我们首先用add_string()添加了"前面的文字"
  • 然后用add_object()添加了一个(36,36)大小的图片占位
  • 然后又用add_string()添加了"后面的文字"
  • 之后先绘制了文本
  • 然后通过get_object_rect()获取文本占位的矩形,然后利用draw_texture_rect()将图片绘制到了占位的矩形处,从而实现最终的图文混排效果

绘制效果:
image.png

添加和处理多个图片

  • add_string()一样,我们也可以反复多次使用add_object(),来创建一个图文混排的单行文本。
  • 然后通过get_objects()可以获取所有已经添加的占位对象构成的数组,并遍历和绘制。
extends Node2Dvar font = ThemeDB.fallback_font
var pos := Vector2(200,200)                # 绘制位置 - 表格左上角点
const img0 = preload("res://imgs/0.png")
const img1 = preload("res://imgs/1.png")
func _draw() -> void:# 构造TextLinevar text = TextLine.new()#text.add_string("前面的文字",font,16)text.add_object(img0,Vector2(36,36),INLINE_ALIGNMENT_BOTTOM,1)text.add_string("后面的文字",font,16)text.add_object(img1,Vector2(16,16),INLINE_ALIGNMENT_BOTTOM,1)text.add_string("后面的文字",font,16)# 绘制text.draw(get_canvas_item(),pos)var objs = text.get_objects()for obj in objs:var rect = text.get_object_rect(obj) # 获取占位矩形大小rect.position += posdraw_texture_rect(obj,rect,false)  # 绘制图片

绘制的效果:
image.png

绘制下划线

extends Node2Dvar font = ThemeDB.fallback_font
var pos := Vector2(200,200)                # 绘制位置 - 表格左上角点
const img0 = preload("res://imgs/0.png")
func _draw() -> void:# 构造TextLinevar text = TextLine.new()#text.add_string("前面的文字",font,16)text.add_object(img0,Vector2(36,36),INLINE_ALIGNMENT_BOTTOM,1)text.add_string("后面的文字",font,16)# 绘制text.draw(get_canvas_item(),pos)text.draw_outline(get_canvas_item(),pos,1,Color.BLACK)# 获取和计算下划线位置var y1 = text.get_size().y + text.get_line_underline_position()var p1 = pos + Vector2(0,y1)var p2 = p1 + Vector2(text.get_line_width(),0)# 绘制下划线draw_line(p1,p2,Color.RED,2)var rect = text.get_object_rect(img0) # 获取占位矩形大小rect.position += posdraw_texture_rect(img0,rect,false)  # 绘制图片

image.png

TextParagraph详解

TextParagraph可以看做是TextLine的可自动换行版本。使用方法和思路几乎如出一辙。

图文混排

TextParagraph也可以实现图文混排。

extends Node2Dvar font = ThemeDB.fallback_font
var pos := Vector2(200,200)                # 绘制位置 - 表格左上角点
const img0 = preload("res://imgs/0.png")
const img1 = preload("res://imgs/1.png")
const img2 = preload("res://imgs/2.png")func _draw() -> void:# 构造TextLinevar text = TextParagraph.new()text.width = 150#text.add_string("前面的文字",font,16)text.add_object(img0,Vector2(36,36),INLINE_ALIGNMENT_BOTTOM)text.add_string("后面的文字",font,16)text.add_object(img1,Vector2(16,16),INLINE_ALIGNMENT_BOTTOM)text.add_string("后面的文字",font,16)text.add_object(img2,Vector2(48,48),INLINE_ALIGNMENT_BOTTOM)text.draw(get_canvas_item(),pos)for l in text.get_line_count():var objs = text.get_line_objects(l)for obj in objs:var rect = text.get_line_object_rect(l,obj) # 获取占位矩形大小rect.position += posdraw_texture_rect(obj,rect,false)  # 绘制图片

绘制的效果:
image.png

逐行绘制

TextParagraph的本意是文本段落。而不是单纯多行文本的并列。
段落是一个整体,可以因为宽度限制而自动换行。而此时段落就是由多行组成。
TextParagraph提供了段落层面的操作,也提供了具体行层面的操作。
draw_line是绘制单行。因此我们可以单独挑选段落中的某一行进行显示,也可以逐行绘制,且设定不同的颜色。

extends Node2Dvar font = ThemeDB.fallback_font
var pos := Vector2(200,200)                # 绘制位置 - 表格左上角点func _draw() -> void:# 构造TextLinevar textP = TextParagraph.new()#textP.break_flags = 4textP.width = 150textP.add_string("白日依山尽,黄河入海流。欲穷千里目,更上一层楼。",font,16)# 逐行绘制for l in textP.get_line_count():# 计算累计的行高var h = 0for i in range(l):h += textP.get_line_size(i).y# 构造随机字色var font_color = Color(randf(),randf(),randf(),1)# 绘制当前行textP.draw_line(get_canvas_item(),pos + Vector2(0,h),l,font_color)

逐行绘制效果:
image.png

绘制表格数据

TextLine一样,TextParagraph也提供了tab_align()方法,可以实现将带有制表符\t的文本渲染为指定列宽的表格形式。

extends Node2Dvar font = ThemeDB.fallback_font
var pos := Vector2(200,200)                # 绘制位置 - 表格左上角点var table = """
姓名	性别	年龄
张三	男	35
李四	男	45
"""func _draw() -> void:# 构造TextParagraphvar textP = TextParagraph.new()textP.add_string(table,font,16)textP.tab_align([100,100,100])# 绘制textP.draw(get_canvas_item(),pos)

上面代码中:

  • table变量存储了多行文本数据,每行字段和数据之间用Tab键分割,在Godot的代码编辑器中它是以制表符对齐显示的

image.png

  • 同样通过tab_align设定三列的宽度

绘制效果:
image.png

总结

  • 本节简单补充了一下TextLineTextParagraph的细节功能,包括图文混排和制表这两个非常重要的功能。
  • 其实add_object()不仅仅可以添加图片站位来实现图文混排,实际上也可以将控件或某些节点混合到文字中国
  • 对于绘制表格,如果想要更细节的控制则不能单单使用tab_align和制表符实现。对于更好的表格绘制,可以见后续文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/616469.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【微信小程序——案例——本地生活(列表页面)】

案例——本地生活(列表页面) 九宫格中实现导航跳转——以汽车服务为案例(之后可以全部实现页面跳转——现在先实现一个) 在app.json中添加新页面 修改之前的九宫格view改为navitage 效果图: 动态设置标题内容—…

linux 部署安装mongodb教程

现在去官网下载mongodb的tar包,在本地创建文件夹 cd /home wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.2.17.tgz tar -zxvf mongodb-linux-x86_64-rhel70-4.2.17.tgz mv mongodb-linux-x86_64-rhel70-4.2.17 mongodb cd /home/mongodb mkdir log t…

计算机服务器中了360后缀勒索病毒怎么办?360后缀勒索病毒解密步骤

网络技术的不断应用与发展,为企业的生产运营提供了极大便利,利用网络可以开展各项工作业务,可以大大提高企业的生产效率,然而,网络是一把双刃剑,在为企业提供便利的同时,也为企业的数据安全带来…

机器学习——自动驾驶

本章我们主要学习以下内容: 阅读自动驾驶论文采集数据根据论文搭建自动驾驶神经网络训练模型在仿真环境中进行自动驾驶 论文介绍 本文参考自2016年英伟达发表的论文《End to End Learning for Self-Driving Cars》 📎end2end.pdf

装饰器模式:动态扩展对象功能的设计艺术

在面向对象设计中,装饰器模式是一种灵活的结构型模式,用于在不修改对象的基础上,动态地给一个对象添加额外的职责。这种模式通过创建一个包含原始对象的包装对象来实现功能的扩展,是继承关系的一个替代方案。本文将详细介绍装饰器…

ZooKeeper分布式服务与Kafka消息队列+ELKF整合方案

前言 ZooKeeper 是一个分布式的、开放源码的分布式应用程序协调服务,提供配置维护、命名服务、分布式同步、组服务等功能; Kafka 是一个开源的分布式流处理平台,它被设计用来处理实时数据流,包括发布和订阅消息系统、日志收集以…

【蓝桥杯】第十五届蓝桥杯大赛软件赛省赛(Java研究生组)个人解题思路及代码分享

文章目录 试题A:劲舞团试题B:召唤数字精灵试题C:封闭图形的个数试题D:商品库存管理试题E:砍柴试题F:回文字符串试题G:最大异或节点试题H:植物生命力 试题A:劲舞团 【问题…

如何获取手机root权限?

获取手机的 root 权限通常是指在 Android 设备上获取超级用户权限,这样用户就可以访问和修改系统文件、安装定制的 ROM、管理应用权限等。然而,需要注意的是,获取 root 权限可能会导致手机失去保修、安全性降低以及使系统变得不稳定。在获取 …

学习Rust的第4天:常见编程概念

欢迎来到学习Rust的第四天,基于Steve Klabnik的《The Rust Programming Language》一书。昨天我们做了一个 猜谜游戏 ,今天我们将探讨常见的编程概念,例如: Variables 变量Constants 常数Shadowing 阴影Data Types 数据类型Functi…

【Godot4.2】CanvasItem绘图函数全解析 - 9.绘制表格

概述 之前介绍TextLine和TextParagraph的时候,提到了用制表符和设定列宽形式来绘制简易表格,但是很明显,单纯使用此种方式很难获得对表格的精确控制。 所以对于表格绘制问题,我决定单独开坑,单独深入研究。 目前比较…

基于 LSTM 模型的古诗词自动生成算法实现及系统实现

近年来,研究者在利用循环神经网络(Recurrent Neural Network,RNN)进行古诗自动生成方面取得了显著的效果。但 RNN 存在梯度问题,导致处理时间跨度较长的序列时 RNN 并不具备长期记忆存储功能。随后,出现的基…

C程序的编译

经过预处理后的源文件,退去一切包装,注释被删除,各种预处理命令也基本上被处理掉,剩下的就是原汁原味的C代码了。接下来的第二步,就开始进入编译阶段。编译阶段主要分两步:第一步,编译器调用一系列解析工具,去分析这些C代码,将C源文件编译为汇编文件;第二步,通过汇编…