求助:如何让Term::Animation加载条停在最后一帧
解决Term::Animation加载条到末尾后停止循环的问题
要让加载条到达最后一帧后停止循环,不能依赖库的默认回调函数(它会自动让帧索引循环),需要自定义回调函数来控制帧的更新逻辑,具体实现如下:
核心思路
自定义一个回调函数,在每次更新时检查当前帧是否已经是加载条数组的最后一帧:
- 如果还没到达最后一帧,继续按设定的步长递增帧索引
- 一旦到达最后一帧,就停止帧的更新,保持当前状态
修改后的完整代码
#!/usr/bin/perl use strict; use warnings; use Curses; use Term::Animation 2.0; my $s = Term::Animation->new(); $s->color(1); my $phrase = "Press q to exit"; my @loading= (q{ = }, q{ == }, q{ === }, q{ ==== }, q{ ===== }, q{ ====== }); # 自定义回调:控制加载条停在最后一帧 sub stop_at_last_frame { my ($entity, $delta) = @_; my $current_frame = $entity->position->[3]; # 计算最后一帧的索引(数组从0开始计数) my $max_frame = scalar(@loading) - 1; # 仅当未到达最后一帧时,才执行帧更新 if ($current_frame < $max_frame) { $entity->position->[3] += $delta->[3]; } } $s->new_entity( shape => \@loading, position => [ 30, 2, 20], callback_args => [0,0,0,1], # 保留帧更新步长(每次加1帧) callback => \&stop_at_last_frame, # 指定自定义回调函数 default_color => 'YELLOW', ); my $shape = q# <=O=> #; $s->new_entity( shape => $shape, position => [3, 7, 10], callback_args => [1, 0, 0, 0], wrap => 1 ); halfdelay( 2 ); for(1..500) { $s->animate(); my $in = lc( getch() ); if($in eq 'q') { last; } }
关键细节说明
- 自定义回调函数
stop_at_last_frame接收两个参数:动画实体对象和callback_args传入的增量数组 - 通过
$entity->position->[3]获取当前帧的索引,scalar(@loading)-1计算加载条的最后一帧索引 - 保留原
callback_args的最后一位1,用来控制帧更新的速度(每次递增1帧),但由自定义回调决定是否执行递增操作
修改后,加载条会逐步显示到最长的======状态,之后就会停止在该帧,不会再循环回到初始状态。
内容的提问来源于stack exchange,提问作者Exponecial
相关产品推荐
相关产品推荐

