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

Попробуйте способ создания
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)

Ява

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

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

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

Вы можете использовать фиксированное значение в качестве начальной скорости или основывать его на скорости сенсорного жеста. Если вы решите указать фиксированное значение, вам следует определить значение в dp в секунду, а затем преобразовать его в пиксели в секунду. Определение значения в dp в секунду позволяет скорости не зависеть от плотности и форм-фактора устройства. Дополнительные сведения о преобразовании начальной скорости в пиксели в секунду см. в разделе « Преобразование dp в секунду в пиксели в секунду» в 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()
}

Ява

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

Ява

anim.setMinimumVisibleChange(DynamicAnimation.MIN_VISIBLE_CHANGE_SCALE);

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

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

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

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

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