composition

class janim.anims.composition.AnimGroup(*anims: ~janim.typing.SupportsAnim, at: float = 0, duration: float | None = None, lag_ratio: float = 0, offset: float = 0, rate_func: RateFunc = <function linear>, name: str | None = None, collapse: bool = False)

基类:Animation

动画集合(并列执行)

  • 若不传入 duration,则将终止时间(子动画结束时间的最大值)作为该动画集合的 duration

  • 若传入 duration,则会将子动画的生效时间进行拉伸,使得总终止时间与 duration 一致

  • 且可以使用 at 进行总体偏移(如 at=1 则是总体延后 1s)

可以使用 lag_ratiooffset 控制每个子动画相对于前一个子动画的时间位置:

  • lag_ratio 表示 “前一个进行到百分之多少时,进行下一个”

  • offset 表示 “前一个进行多少秒后,进行下一个”

时间示例:

AnimGroup(
    Anim1(duration=3),  # 0~3s
    Anim2(duration=4)   # 0~4s
)

AnimGroup(
    Anim1(duration=3),  # 0~4.5s
    Anim2(duration=4),  # 0~6s
    duration=6
)

AnimGroup(
    Anim1(duration=3),  # 1~5.5s
    Anim2(duration=4),  # 1~7s
    at=1,
    duration=6
)

另外,collapse 表示在预览界面中是否折叠该动画组(默认不折叠,而例如 TransfromMatchingShapes 默认是折叠的)

lag_ratiooffset 的交互式示例:

0
0
Anim1 1s
Anim2 1s
Anim3 2s
Anim4 1s
AnimGroupExample
from janim.imports import *

class AnimGroupExample(Timeline):
    def construct(self):
        group = Group(
            Circle(fill_alpha=0.5),
            Square(fill_alpha=0.5),
            Text('Text', font_size=48),
            color=BLUE
        )
        group.points.arrange(buff=LARGE_BUFF)

        self.forward()
        self.play(
            FadeIn(group[0]),
            AnimGroup(
                FadeIn(group[1]),
                FadeIn(group[2]),
                duration=2
            )
        )
        self.forward()

        self.hide(group)
        self.play(
            FadeIn(group[0], duration=2),
            AnimGroup(
                FadeIn(group[1]),
                FadeIn(group[2]),
                at=1,
                duration=2
            )
        )
        self.forward()

备注

为了更好地了解这些动画组合的效果,你可以复制到你的文件中运行,这样你就可以在界面上看到子动画对应的区段

class janim.anims.composition.Succession(*anims: Animation, lag_ratio: float = 1, offset: float = 0, **kwargs)

基类:AnimGroup

动画集合(顺序执行)

  • 会将传入的动画依次执行

  • 相当于默认值 lag_ratio=1AnimGroup

时间示例:

Succession(
    Anim1(duration=3),  # 0~3s
    Anim2(duration=4)   # 3~7s
)

Succession(
    Anim1(duration=2),          # 0~2s
    Anim2(at=1, duration=2),    # 3~5s
    Anim3(at=0.5, duration=2)   # 5.5~7.5s
)

Succession(
    Anim1(duration=2),  # 0~2s
    Anim2(duration=2),  # 2.5~4.5s
    Anim3(duration=2),  # 5~7s
    offset=0.5
)

lag_ratiooffset 的交互式示例:

0
0
Anim1 1s
Anim2 1s
Anim3 2s
Anim4 1s
SuccessionExample
from janim.imports import *

class SuccessionExample(Timeline):
    def construct(self):
        group = Group(
            Circle(fill_alpha=0.5),
            Square(fill_alpha=0.5),
            Text('Text', font_size=48),
            color=BLUE
        )
        group.points.arrange(buff=LARGE_BUFF)

        self.forward()
        self.play(
            Succession(
                *map(FadeIn, group)
            )
        )
        self.forward()

        self.hide(group)
        self.play(
            Succession(
                *map(FadeIn, group),
                offset=1
            )
        )
        self.forward()

        self.hide(group)
        self.play(
            Succession(
                *map(FadeIn, group),
                offset=-0.7
            )
        )
        self.forward()
class janim.anims.composition.Aligned(*anims: ~janim.typing.SupportsAnim, at: float = 0, duration: float | None = None, rate_func: RateFunc = <function linear>, name: str | None = None, collapse: bool = False)

基类:AnimGroup

动画集合(并列对齐执行)

也就是忽略了子动画的 atduration,使所有子动画都一起开始和结束

时间示例:

Aligned(
    Anim1(duration=1),
    Anim2(duration=2)
)
# Anim1 & Anim2: 0~2s

Aligned(
    Anim1(at=1, duration=1),
    Anim2(duration=2),
    duration=4
)
# Anim1 & Anim2: 0~4s

警告

视频示例的代码在下方,不是上方的时间示例

AlignedExample
from janim.imports import *

class AlignedExample(Timeline):
    def construct(self):
        group = Group(
            Circle(fill_alpha=0.5),
            Square(fill_alpha=0.5),
            Text('Text', font_size=48),
            color=BLUE
        )
        group.points.arrange(buff=LARGE_BUFF)

        self.forward()
        self.play(
            Aligned(
                FadeIn(group[0], duration=2),
                FadeIn(group[1], duration=3),
                FadeIn(group[2], at=0.5, duration=0.5)
            )
        )
        self.forward()
class janim.anims.composition.Wait(duration: float = 1, **kwargs)

基类:Animation

等待特定时间,在 Succession() 中比较有用

(其实就是一个空动画)

class janim.anims.composition.Do(func, *args, at: float = 0, detect_changes: bool = True, **kwargs)

基类:Animation

在动画的特定时间执行指定操作