Chromium Chronicle #33: Views AnimationBuilder

Menggunakan animasi berbasis lapisan di View dapat meningkatkan performa dan mengurangi jank, tetapi sulit untuk disiapkan. Tujuan AnimationBuilder class ini dapat sangat mengurangi kompleksitas dan meningkatkan keterbacaan untuk lapisan animasi.

Misalkan Anda perlu menganimasikan cross-fade berkelanjutan antara dua hal berikut khusus, seperti dalam gambar berikut.

Berikut adalah contoh cara melakukannya menggunakan API animasi lapisan secara langsung.

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());

Berikut ini cara membuat efek yang sama menggunakan AnimationBuilder. Animasi dimulai setelah keluar dari ruang lingkup.

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);

Kode mana yang lebih suka Anda tulis atau baca? Yang lebih penting, AnimationBuilder tidak menambahkan overhead tambahan ke animasi karena dimaksudkan untuk menyederhanakan pembuatan animasi berbasis lapisan. Cobalah di lain waktu Anda menganimasikan sesuatu.

Untuk bantuan tambahan, kirim email chromium-dev@chromium.org.