当前位置: 首页 > news >正文

manim边做边学--文字创建销毁的打字机效果

对于Manim的用户来说,创建富有表现力的文本动画是其核心功能之一。

最近,Manim的官方文档中悄然增加了两个新的动画类:TypeWithCursorUntypeWithCursor

它们为我们带来了带有光标的打字和删除效果,极大地丰富了文本动画的可能性。

本文将深入探讨这两个新动画类的特性和应用。

1. 动画概要

TypeWithCursorUntypeWithCursor 的核心作用是模拟真实的打字和删除文本的过程。

相比于Manim中已有的WriteUnWrite等动画,它们最大的特点是引入了“光标”这一视觉元素,使得动画效果更加生动和贴近现实。

TypeWithCursor 类似于 AddTextLetterByLetter,可以逐个字符地显示文本,并在当前输入的最后一个字符后面显示一个光标。

这非常适合用于以下场景:

  • 代码演示: 在教学视频或技术分享中,模拟实时编写代码的过程,让观众更清晰地看到代码的输入流程。
  • 对话模拟: 模拟聊天对话框、终端输入等场景,增强动画的代入感。
  • 逐字稿展示: 配合旁白,以打字机的方式逐字显示字幕或关键信息,引导观众的阅读节奏。

UntypeWithCursor 则与TypeWithCursor相反,它类似于RemoveTextLetterByLetter,可以逐个字符地删除文本,并且光标会跟随删除的进度移动。

其应用场景包括:

  • 文本修正: 模拟删除并修改错误文本的过程,可以用于展示“纠错”或“优化”的概念。
  • 信息擦除: 动态地擦除屏幕上的信息,为新的内容腾出空间。
  • 倒计时效果: 通过删除数字来实现倒计时的视觉效果。

这两个类的主要参数类似:

参数名称 类型 说明
time_per_char float 字母出现的频率
cursor VMobject None
buff float 控制光标在最后添加的字母右侧的距离。
keep_cursor_y bool 光标的 y 坐标设置是否为文本的中心,并在整个动画中保持不变
leave_cursor_on bool 是否在动画后显示光标

需要注意的是:目前这两个动画类仅支持对Text对象进行操作,暂时还不支持MathTex

2. 使用示例

下面,我们将通过两个实际的应用场景,来展示TypeWithCursorUntypeWithCursor的使用方法。

2.1. 模拟代码输入与修正

这个例子将模拟一个在终端中输入Python代码,然后发现错误并进行修正的过程。

我们将使用TypeWithCursor来输入代码,然后用UntypeWithCursor删除错误部分,最后再用TypeWithCursor输入正确的代码。

cursor = Rectangle(height=0.5, width=0.05, fill_color=WHITE, fill_opacity=1, stroke_width=0
)# 错误的Python代码
wrong_code_line = Text("prtin('Hello, Manim!')", font="Monospace").scale(0.7)
# 正确的代码部分
correct_part = (Text("print", font="Monospace").scale(0.7).move_to(wrong_code_line[0:5], aligned_edge=LEFT)
)# 设置光标初始位置
cursor.move_to(wrong_code_line.get_left() + LEFT * 0.1)# 动画过程
self.play(TypeWithCursor(wrong_code_line, cursor, time_per_char=0.15))
self.wait()
# 删除错误的 'prtin'
self.play(UntypeWithCursor(wrong_code_line[0:5], cursor, time_per_char=0.1))
self.wait()
# 输入正确的 'print'
self.play(TypeWithCursor(correct_part, cursor, time_per_char=0.15))

在这个例子中,我们自定义了一个白色的细长矩形作为光标。

通过time_per_char参数,我们控制了打字和删除的速度,使得动画更具节奏感。

同时,通过对Text对象进行切片,我们精确地控制了需要删除和重新输入的文本部分。

2.2. 动态标题展示

这个例子将展示如何使用TypeWithCursorUntypeWithCursor来制作一个动态的、引人注目的标题。

我们将先用打字效果展示一个标题,然后将其删除,再展示另一个标题,并在动画间隙播放光标闪烁动画。

# 自定义一个黄色的下划线作为光标
cursor = Line(DOWN * 0.1, RIGHT * 0.2 + DOWN * 0.1, color=YELLOW)# 第一个标题
title1 = Text("Welcome to My Channel", font_size=30)# 第二个标题
title2 = Text("Let's Learn Manim!", font_size=30, color=BLUE)# 动画过程
# 播放打字动画
self.play(TypeWithCursor(title1, cursor, keep_cursor_y=True, time_per_char=0.1))
# 在等待期间播放光标闪烁动画
self.play(Blink(cursor, blinks=3))
# 播放删除动画
self.play(UntypeWithCursor(title1,cursor,keep_cursor_y=True,time_per_char=0.05,leave_cursor_on=True,)
)
# 再次播放光标闪烁
self.play(Blink(cursor, blinks=3))
# 播放第二个标题的打字动画
self.play(TypeWithCursor(title2, cursor, buff=0.2, time_per_char=0.12))
# 结束时再次闪烁
self.play(Blink(cursor))

在这个例子中,我们使用了一个黄色的Line作为光标,并通过Blink动画使其闪烁。

在动画中,我们设置keep_cursor_y=True来确保光标在y轴方向上保持稳定,这在处理多行文本时非常有用。

我们还通过调整buff参数增大了光标和文字的间距,并通过leave_cursor_on=True让光标在删除动画后依然停留在屏幕上,为接下来的输入动画做好了衔接。

3. 附件

文中的代码只是关键部分的截取,完整的代码共享在网盘中(type_cursor.py),

下载地址: 完整代码 (访问密码: 6872)

http://www.jsqmd.com/news/33166/

相关文章:

  • 2025年河北泵用挤压软管体验权威推荐:河北抽负压真空胶管清洁/河北抽真空胶管安装/河北真空侵胶管维护源头厂家精选
  • 2025年移动照明车灯塔工厂权威推荐:液压升降移动照明车/拖车式移动照明车/太阳能移动照明车源头厂家精选
  • 学习Hyperledger Fabric2.5
  • DHTMLX Gantt 9.1 的核心目标——在保持稳定性能的基础上,带来更智能的时间刻度优化、更灵活的任务渲染、更高效的实时协作能力及更完善的资源管理功能。
  • 量化选股与量化交易第857篇:通达信主升操盘 - Leone
  • 【中大厂前端】Java常见面试题 - 教程
  • 量化选股与量化交易第858篇:通达信擒龙三把锁 - Leone
  • 量化选股与量化交易第861篇:通达信绝杀大牛 - Leone
  • 国产化Excel处理控件Spire.XLS教程:使用Java将CSV转换为PDF(含格式设置)
  • Python 机器学习02 - 常见分类算法
  • 系统基础文件属性(二)
  • 量化选股与量化交易第882篇:通达信量能趋势启动 - Leone
  • 量化选股与量化交易第883篇:通达信顶底雷达 - Leone
  • 量化选股与量化交易第878篇:通达信起爆点探测器 - Leone
  • 量化选股与量化交易第879篇:通达信强势反转战法 - Leone
  • 量化选股与量化交易第886篇:通达信收割机 - Leone
  • 量化选股与量化交易第888篇:通达信龙头趋势量化 - Leone
  • 量化选股与量化交易第889篇:通达信趋势拐点 - Leone
  • 【深入理解计算机网络04】通信基础核心知识全解析:从信号原理到物理层设备 - 教程
  • 详细介绍:vue3和uniapp的生命周期
  • DMS Airflow:企业级数据工作流编排平台的专业实践
  • iOS HTTPS 抓包,从原理到落地排查的工程化方法(Charles / tcpdump / Sniffmaster)
  • vite-plugin-top-level-await Failed to convert rust `String` into napi `string`
  • 2025.11.6博客
  • 计算机视觉领域的里程碑:关键贡献者、核心理念与技术演进 - 教程
  • torchvision 使用本地 FashionMNIST 数据集进行导入的方法
  • 深入解析:产品运营必备的职场通用能力有哪些?
  • Redis数据持久化、高阶数据结构与事务脚本【第二部分】
  • openEuler + Nginx 高性能 Web 服务深度评测
  • 应用型本科计算机类专业毕业设计与论文选题指南 - 教程