Chromium Chronicle #33:视图 AnimationBuilder

在 View 中使用基于层的动画可以提高性能并减少卡顿,但它们很难设置。AnimationBuilder 类可以大幅降低复杂性并提高层动画的可读性。

假设您需要在以下两个视图之间为连续的淡入淡出添加动画效果,如下图所示。

以下示例展示了如何直接使用 Layer Animation API 执行此操作。

auto primary_title_sequence = std::make_unique<LayerAnimationSequence>();
auto working_sequence = std::make_unique<LayerAnimationSequence>();
primary_title_sequence->set_is_repeating(true);
working_sequence->set_is_repeating(true);

primary_title_sequence->AddElement(CreatePauseElement(OPACITY, base::Seconds(2)));
primary_title_sequence->AddElement(CreateOpacityElement(0.0f, base::Seconds(1)));
primary_title_sequence->AddElement(CreatePauseElement(OPACITY, base::Seconds(2)));
primary_title_sequence->AddElement(CreateOpacityElement(1.0f, base::Seconds(1)));

working_sequence->AddElement(CreatePauseElement(OPACITY, base::Seconds(2)));
working_sequence->AddElement(CreateOpacityElement(1.0f, base::Seconds(1)));
working_sequence->AddElement(CreatePauseElement(OPACITY, base::Seconds(2)));
working_sequence->AddElement(CreateOpacityElement(0.0f, base::Seconds(1)));

primary_title_->layer()->GetAnimator()->StartAnimation(primary_title_sequence.release());
working_->layer()->GetAnimator()->StartAnimation(working_sequence.release());

下面展示了如何使用 AnimationBuilder 创建相同的效果。退出作用域后动画会开始播放。

AnimationBuilder()
    .Repeatedly()
    .Offset(base::Seconds(2))
    .SetDuration(base::Seconds(1))
    .SetOpacity(primary_title_, 0.0f)
    .SetOpacity(working_, 1.0f)
    .Offset(base::Seconds(2))
    .SetDuration(base::Seconds(1))
    .SetOpacity(primary_title_, 1.0f)
    .SetOpacity(working_, 0.0f);

您想要编写或读取哪个代码?更重要的是,AnimationBuilder 不会为动画添加额外的开销,因为它旨在简化基于层的动画的创建。下次需要为某些内容添加动画效果时 不妨试试吧

如需更多帮助,请发送电子邮件至 chromium-dev@chromium.org