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

Попробуйте способ Compose
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() и передайте скорость в пикселях в секунду. Метод возвращает объект fling, на котором установлена ​​скорость.

Примечание: используйте классы 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 пикселя.