Что такое конфетти?
Конфетти (множественное число) против конфето (единственное число)
Конфетти — это высокопроизводительная, легко настраиваемая библиотека систем частиц, которая может анимировать любой набор объектов в пространстве. Вы можете указать начальные условия и физические условия (например, ускорение по осям X и Y, границы и т. д.), а библиотека конфетти позаботится обо всём остальном.
Начало работы
Добавьте зависимость от конфетти в свой build.gradle.
implementation 'io.openharmony.tpc.thirdlib:confetti:1.0.5'
Простое использование
Единственное, что вам нужно для того, чтобы конфетти появилось на вашем экране, — это родительское представление для размещения ConfettiView и, следовательно, анимации конфетти. С этого момента это родительское представление называется контейнером.
Обратите внимание, что библиотека использует измерения контейнера, чтобы определить, как лучше всего анимировать конфетти. Если контейнер не измерен при создании конфетти, то на экране ничего не появится. Распространённой ошибкой является создание конфетти внутри жизненного цикла активности, поскольку представления, скорее всего, не измеряются в этих точках.
Вы можете создать предварительно настроенное конфетти из CommonConfetti. Вам нужно только предоставить ему родительский контейнер, источник конфетти и массив возможных цветов для конфетти. По умолчанию формами конфетти являются круг, треугольник и квадрат.
CommonConfetti.rainingConfetti(container, new int[] { Color.BLACK })
.infinite();
Более сложное использование
Сначала нам нужно определить, что представляет собой наш индивидуальный конфето с помощью ConfettoGenerator. Каждый вызов generateConfetto должен генерировать новый объект Confetto (менеджер конфетти будет повторно использовать сгенерированный конфето по мере необходимости, поэтому вы можете видеть всё меньше и меньше вызовов generateConfetto по ходу анимации). Мы передаём случайный объект в generateConfetto на случай, если вы захотите случайным образом сгенерировать конфето из списка возможных вариантов.
Простой ConfettoGenerator может выглядеть так:
final List<PixelMap> allPossibleConfetti = constructBitmapsForConfetti();
// В качестве альтернативы мы предоставляем некоторые вспомогательные методы внутри Utils
// для генерации квадратных, круглых и треугольных PixelMap.
// Utils.generateConfettiBitmaps(new int[] { Color.BLACK }, 20 /* size */);
final int numConfetti = allPossibleConfetti.size();
final ConfettoGenerator confettoGenerator = new ConfettoGenerator() {
@Override
public Confetto generateConfetto(Random random) {
final PixelMap pixelMap = allPossibleConfetti.get(random.nextInt(numConfetti));
return new BitmapConfetto(pixelMap);
}
}
Как только у нас есть ConfettoGenerator, нам нужно определить источник конфетти, из которого будут появляться конфетти. Этот источник может быть любой произвольной точкой или линией.
final int containerMiddleX = container.getWidth() / 2;
final int containerMiddleY = container.getHeight() / 2;
final ConfettiSource confettiSource = new ConfettiSource(containerMiddleX, containerMiddleY);
Теперь вы готовы! Создайте свой ConfettiManager, настройте анимацию по своему вкусу, а затем вызовите animate()!
new ConfettiManager(context, confettoGenerator, confettiSource, container)
.setEmissionDuration(1000)
.setEmissionRate(100)
.setVelocityX(20, 10)
.setVelocityY(100)
.setRotationalVelocity(180, 180)
.animate();
Вызов animate() создаст и настроит различные объекты Confetto по запросу, создаст новое представление ConfettiView, инициализирует правильные состояния для всех компонентов, прикрепит представление к контейнеру и запустит анимацию. Представление ConfettiView автоматически отсоединится, когда все конфетти исчезнут с экрана.
Для получения дополнительной информации об использовании библиотеки ознакомьтесь с... Приложение confetti-sample, включённое в этот проект.
Конфигурация
ConfettiManager легко настраивается. Для простоты все атрибуты скорости и ускорения указаны в пикселях в секунду или пикселях на секунду^2, тогда как все необработанные атрибуты времени (такие как ttl и emissionDuration) указаны в миллисекундах.
Вы заметите, что большинство сеттеров для физических атрибутов (например, скорость, ускорение, вращение) могут принимать либо один аргумент для фактического значения, либо два аргумента. Второй аргумент позволяет вам указать случайное отклонение, если вы хотите рандомизировать поведение всех сгенерированных конфетти.
Например:
confettiManager.setVelocityX(200f, 50f);
Сгенерированное конфетти будет иметь начальную скорость X где-то между 200–50 или 150 и 200+50 или 250, в конечном итоге распределённую.
Ещё один интересный метод — enableFadeOut(Interpolator fadeOutInterpolator). Вы можете указать, что затухание происходит, когда конфетти приближается к своей границе (либо достигая физической границы, указанной в bound (это либо вся область контейнера, либо заданная в setBound), либо достигая ttl). Интерполятор по существу принимает значение от 0 до 1 (0 означает, что конфетти находится в источнике, 1 означает, что конфетти достигло своей границы) и выводит альфа-значение от 0 до 1 (0 прозрачно, а 1 непрозрачно). Таким образом, мы позволяем вам полностью контролировать процесс затухания.
Или, если вы ленивы, вы можете просто использовать Utils.getDefaultAlphaInterpolator().
Расширенное использование
Если вы вызовете confettiManager.setTouchEnabled(true), вы сможете позволить пользователю касаться и перетаскивать конфетти на экране. Когда пользователь отпускает конфетти, оно начнёт движение с инициированной пользователем скоростью и предварительно настроенным ускорением и возобновит анимацию оттуда.
Очень легко определить пользовательское Confetto (см. BitmapConfetto). Вам просто нужно расширить класс Confetto и реализовать drawInternal. Функция предоставит вам Canvas для рисования, а также рабочую матрицу и Paint, поэтому вам не придётся выделять объекты на пути рисования. Затем вам нужно нарисовать своё конфетти так, как вы хотите, на холсте, используя указанные x, y и вращение.
Самое интересное, что вы можете интерпретировать вращение так, как хотите. Вместо угла в градусах вы можете выбрать интерпретацию вращения, где каждый градус соответствует новой форме или новому изображению. Таким образом вы можете добиться интересных анимационных эффектов при движении конфетти по экрану.
Если у вас есть доступ к ConfettiManager, вы действительно можете легко изменить конфигурацию во время анимации для более уникальных впечатлений. Например:
confettiManager.setEmissionRate(100)
.animate();
new Handler().postDelayed(new Runnable() {
@Override public void run() {
confettiManager.setEmissionRate(20);
}
}, 3000);
Приведённый выше фрагмент кода настроит начальную частоту выбросов на 100 конфетти в секунду и запустит анимацию. Через 3 секунды он снизит частоту выбросов до 20 конфетти в секунду. Это относится ко всем атрибутам (например, изменение скорости или ускорения в зависимости от некоторых внешних условий).
Copyright 2016 Robinhood Markets, Inc.
Licensed under the Apache License, Version 2.0 (the «License»); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an «AS IS» BASIS, WITHOUT
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )