Chromium Chronicle #33:View AnimationBuilder

在 View 中使用以圖層為基礎的動畫可以提高效能並減少卡頓,但並不容易設定。AnimationBuilder 類別可以大幅降低複雜度,並提高圖層動畫的可讀性。

假設您需要在以下兩個檢視畫面之間建立連續交叉淡出的動畫,如下圖所示。

以下範例說明如何直接使用圖層動畫 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