Перемещение видов с помощью анимации перемещения

Попробуйте способ создания композиций.
Jetpack Compose — это рекомендуемый набор инструментов для создания пользовательского интерфейса для Android. Узнайте, как использовать анимации в Compose.

Анимация, основанная на бросании, использует силу трения, пропорциональную скорости объекта. Она применяется для анимации свойства объекта и для постепенного завершения анимации. Анимация имеет начальный импульс, который в основном определяется скоростью движения, и постепенно замедляется. Анимация заканчивается, когда скорость анимации становится достаточно низкой, чтобы не вызывать видимых изменений на экране устройства.

Рисунок 1. Анимация броска.

Чтобы узнать больше о смежных темах, ознакомьтесь со следующими руководствами:

Добавьте библиотеку AndroidX.

Для использования анимации, основанной на физических принципах, необходимо добавить библиотеку AndroidX в ваш проект следующим образом:

  1. Откройте файл build.gradle для вашего модуля приложения.
  2. Добавьте библиотеку AndroidX в раздел dependencies .

    Классный

            dependencies {
                implementation 'androidx.dynamicanimation:dynamicanimation:1.0.0'
            }
            

    Котлин

            dependencies {
                implementation("androidx.dynamicanimation:dynamicanimation:1.0.0")
            }
            

Создайте анимацию флинга

Класс FlingAnimation позволяет создать анимацию «броска» для объекта. Для создания анимации «броска» создайте экземпляр класса FlingAnimation и укажите объект и свойство объекта, которое вы хотите анимировать.

Котлин

val fling = FlingAnimation(view, DynamicAnimation.SCROLL_X)

Java

FlingAnimation fling = new FlingAnimation(view, DynamicAnimation.SCROLL_X);

Установить скорость

Начальная скорость определяет скорость изменения свойства анимации в начале её выполнения. По умолчанию начальная скорость установлена ​​на ноль пикселей в секунду. Поэтому необходимо задать начальную скорость, чтобы анимация не завершилась сразу.

В качестве начальной скорости можно использовать фиксированное значение или определить её на основе скорости сенсорного жеста. Если вы выберете фиксированное значение, его следует задать в децибелах в секунду (dp/s), а затем преобразовать в пиксели в секунду (pixels/s). Задание значения в децибелах в секунду позволяет сделать скорость независимой от плотности и форм-фактора устройства. Для получения дополнительной информации о преобразовании начальной скорости в пиксели в секунду см. раздел «Преобразование децибелов в секунду в пиксели в секунду» в Spring Animation .

Чтобы задать скорость, вызовите метод setStartVelocity() и передайте значение скорости в пикселях в секунду. Метод возвращает объект броска, для которого задана скорость.

Примечание: Для получения и вычисления скорости сенсорных жестов используйте классы GestureDetector.OnGestureListener и VelocityTracker соответственно.

Задайте диапазон значений анимации

Вы можете установить минимальное и максимальное значения анимации, если хотите ограничить значение свойства определенным диапазоном. Этот контроль диапазона особенно полезен при анимации свойств, имеющих заданный диапазон, таких как альфа-канал (от 0 до 1).

Примечание : Когда значение анимации броска достигает минимального или максимального значения, анимация завершается.

Чтобы установить минимальное и максимальное значения, вызовите методы setMinValue() и setMaxValue() соответственно. Оба метода возвращают объект анимации, для которого вы установили значение.

Установите трение

Метод setFriction() позволяет изменять трение в анимации. Он определяет, насколько быстро уменьшается скорость в анимации.

Примечание : Если вы не зададите значение трения в начале анимации, анимация будет использовать значение трения по умолчанию, равное 1.

Этот метод возвращает объект, анимация которого использует предоставленное вами значение трения.

Пример кода

В приведенном ниже примере показан горизонтальный бросок. Скорость, регистрируемая трекером скорости, обозначается как velocityX , а границы прокрутки установлены на 0 и maxScroll. Коэффициент трения установлен на 1,1.

Котлин

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() и передайте либо одну из констант минимального видимого изменения, либо значение, которое необходимо вычислить для пользовательского свойства. Дополнительную информацию о вычислении этого значения см. в разделе «Вычисление значения минимального видимого изменения» .

Котлин

anim.minimumVisibleChange = DynamicAnimation.MIN_VISIBLE_CHANGE_SCALE

Java

anim.setMinimumVisibleChange(DynamicAnimation.MIN_VISIBLE_CHANGE_SCALE);

Примечание : значение необходимо передавать только в том случае, если вы анимируете пользовательское свойство, не заданное в пикселях.

Расчет минимального видимого значения изменения

Для расчета минимального видимого изменения для пользовательского свойства используйте следующую формулу:

Минимальное видимое изменение = Диапазон значений пользовательского свойства / Диапазон анимации в пикселях

Например, свойство, которое вы хотите анимировать, изменяется от 0 до 100. Это соответствует изменению на 200 пикселей. Согласно формуле, минимальное видимое значение изменения составляет 100 / 200, что равно 0,5 пикселя.