Анимация на основе броска использует силу трения, пропорциональную скорости объекта. Используйте его, чтобы анимировать свойство объекта и постепенно завершить анимацию. Он имеет начальный импульс, который в основном получается от скорости жеста, и постепенно замедляется. Анимация завершается, когда ее скорость становится настолько низкой, что на экране устройства не происходит видимых изменений.
Дополнительную информацию можно найти в следующих руководствах:
Добавьте библиотеку AndroidX
Чтобы использовать анимацию на основе физики, необходимо добавить библиотеку AndroidX в проект следующим образом:
- Откройте файл
build.gradleдля модуля приложения. - Добавьте библиотеку AndroidX в раздел
dependencies.Яркий
dependencies { implementation 'androidx.dynamicanimation:dynamicanimation:1.0.0' }
Kotlin
dependencies { implementation("androidx.dynamicanimation:dynamicanimation:1.0.0") }
Как создать анимацию пролистывания
Класс FlingAnimation позволяет создать анимацию резкого движения для объекта. Чтобы создать анимацию броска, создайте экземпляр класса FlingAnimation и укажите объект и его свойство, которое вы хотите анимировать.
Kotlin
val fling = FlingAnimation(view, DynamicAnimation.SCROLL_X)
Java
FlingAnimation fling = new FlingAnimation(view, DynamicAnimation.SCROLL_X);
Задать скорость
Начальная скорость определяет, насколько быстро изменяется свойство анимации в ее начале. По умолчанию начальная скорость равна нулю пикселей в секунду. Поэтому необходимо определить начальную скорость, чтобы анимация не заканчивалась сразу.
В качестве начальной скорости можно использовать фиксированное значение или скорость жеста касания. Если вы решите указать фиксированное значение, определите его в dp/с, а затем преобразуйте в пиксели в секунду. Определение значения в dp в секунду позволяет сделать скорость независимой от плотности и форм-факторов устройства. Подробнее о том, как преобразовать начальную скорость в пиксели в секунду, рассказывается в разделе Преобразование dp в секунду в пиксели в секунду статьи Пружинная анимация.
Чтобы задать скорость, вызовите метод setStartVelocity() и передайте значение в пикселях в секунду. Метод возвращает объект fling, для которого задана скорость.
Примечание. Используйте классы GestureDetector.OnGestureListener и VelocityTracker, чтобы получать и вычислять скорость жестов касания.
Как задать диапазон значений анимации
Вы можете задать минимальное и максимальное значения анимации, если хотите ограничить значение свойства определенным диапазоном. Это особенно полезно при анимации свойств, имеющих внутренний диапазон, например альфа (от 0 до 1).
Примечание. Когда значение анимации броска достигает минимального или максимального значения, анимация заканчивается.
Чтобы задать минимальное и максимальное значения, вызовите методы setMinValue() и setMaxValue() соответственно.
Оба метода возвращают объект анимации, для которого вы задали значение.
Задать трение
Метод setFriction() позволяет изменить трение анимации. Оно определяет, насколько быстро уменьшается скорость анимации.
Примечание. Если вы не зададите трение в начале анимации, будет использоваться значение по умолчанию, равное 1.
Метод возвращает объект, анимация которого использует указанное вами значение трения.
Пример кода
Ниже показан пример горизонтального пролистывания. Скорость, полученная от VelocityTracker, равна velocityX, а границы прокрутки установлены на 0 и maxScroll. Трение установлено на 1,1.
Kotlin
FlingAnimation(view, DynamicAnimation.SCROLL_X).apply { setStartVelocity(-velocityX) setMinValue(0f) setMaxValue(maxScroll) friction = 1.1f start() }
Java
FlingAnimation fling = new FlingAnimation(view, DynamicAnimation.SCROLL_X); fling.setStartVelocity(-velocityX) .setMinValue(0) .setMaxValue(maxScroll) .setFriction(1.1f) .start();
Как задать минимальное видимое изменение
Если вы анимируете дополнительный параметр, который не задан в пикселях, необходимо указать минимальное изменение значения анимации, которое будет заметно пользователям. Она определяет разумный порог для завершения анимации.
При анимации DynamicAnimation.ViewProperty вызывать этот метод не нужно, поскольку минимальное видимое изменение определяется свойством. Пример:
- По умолчанию минимальное значение видимого изменения составляет 1 пиксель для таких свойств, как
TRANSLATION_X,TRANSLATION_Y,TRANSLATION_Z,SCROLL_XиSCROLL_Y. - Для анимаций, использующих вращение, таких как
ROTATION,ROTATION_XиROTATION_Y, минимальное видимое изменение составляетMIN_VISIBLE_CHANGE_ROTATION_DEGREES, или 1/10 пикселя. - Для анимаций, в которых используется прозрачность, минимальное видимое изменение составляет
MIN_VISIBLE_CHANGE_ALPHA, или 1/256.
Чтобы задать минимальное видимое изменение для анимации, вызовите метод setMinimumVisibleChange() и передайте одну из констант минимального видимого изменения или значение, которое нужно рассчитать для пользовательского свойства. Подробнее о том, как рассчитать это значение, читайте в разделе Расчет минимального значения видимого изменения.
Kotlin
anim.minimumVisibleChange = DynamicAnimation.MIN_VISIBLE_CHANGE_SCALE
Java
anim.setMinimumVisibleChange(DynamicAnimation.MIN_VISIBLE_CHANGE_SCALE);
Примечание. Значение нужно передавать, только если вы анимируете дополнительный параметр, который не задан в пикселях.
Как рассчитать минимальное значение видимого изменения
Чтобы рассчитать минимальное видимое изменение для дополнительного параметра, используйте следующую формулу:
Минимальное видимое изменение = диапазон значений дополнительного параметра / диапазон анимации в пикселях.
Например, значение анимируемого свойства увеличивается от 0 до 100. Это соответствует изменению на 200 пикселей. Согласно формуле, минимальное значение видимого изменения составляет 100 / 200 = 0,5 пикселя.