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

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