Manim中如何精准高亮代码行?高亮边界偏移问题求解
问题分析与解决方案
代码存在的问题
SurroundingRectangle默认padding导致超出边界
SurroundingRectangle默认带有0.1的padding值,会在代码行四周生成额外空间,使得矩形视觉上超出代码行的实际边界。第一行因为内容较长,padding的影响不明显,而短行的padding会让矩形显得明显过宽。ReplacementTransform使用错误
直接对sliding_wins中的元素执行ReplacementTransform会销毁源元素,导致后续循环中无法再次访问该元素进行动画操作,最终会出现动画异常。代码字符串格式不规范
原代码字符串的缩进不统一,且可能存在隐性的行尾空白,导致Code组件生成的Text对象包含多余空白区域,进一步放大了矩形超出的问题。
修复方案
消除SurroundingRectangle的padding
创建矩形时显式设置padding=0,让矩形紧密贴合代码行的实际边界。正确使用ReplacementTransform
使用源矩形的副本执行变换操作,保留原元素以便后续循环复用。规范代码字符串格式
统一缩进,移除行尾空白,确保每一行的Text对象仅包含必要的代码内容。
修改后的完整代码
from manim import * class CodeTrackingAnimation(Scene): def construct(self): # 规范格式的代码字符串,统一缩进、无行尾空白 code_str = '''#include<iostream> using namespace std; int main(){ int sum = 0; for(int i=0;i<n;i++){ sum += i; } return 0; }''' code = self.build_code_block(code_str) # 初始高亮第一行 self.play(self.sliding_wins[0].animate.set_opacity(0.3)) # 逐行切换高亮 for i in range(len(code.code)-1): self.highlight(i, i+1) def build_code_block(self, code_str): code = Code(code=code_str, language='C++', background="window") self.add(code) self.sliding_wins = VGroup() for line in code.code: # 设置padding=0,让矩形精准包围代码行 rect = SurroundingRectangle(line, padding=0) rect.set_fill(YELLOW, opacity=0) self.sliding_wins.add(rect) self.add(self.sliding_wins) return code def highlight(self, prev_line, line): # 淡出上一行高亮 self.play(self.sliding_wins[prev_line].animate.set_opacity(0)) # 使用副本执行变换,避免销毁原元素 self.play(ReplacementTransform( self.sliding_wins[prev_line].copy(), self.sliding_wins[line] )) # 淡入当前行高亮 self.play(self.sliding_wins[line].animate.set_opacity(0.3))
内容的提问来源于stack exchange,提问作者Maluyelang
相关产品推荐
相关产品推荐

