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

Попробуйте способ «Композиции»
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")
            }
            

Создайте анимацию броска

The FlingAnimation class lets you create a fling animation for an object. To build a fling animation, create an instance of the FlingAnimation class and provide an object and the object's property that you want to animate.

Котлин

val fling = FlingAnimation(view, DynamicAnimation.SCROLL_X)

Ява

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

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

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

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

Чтобы задать скорость, вызовите метод 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.

To set the minimum visible change for an animation, call the setMinimumVisibleChange() method and pass either one of the minimum visible constants or a value that you need to calculate for a custom property. For more information on calculating this value, refer to the Calculating a minimum visible change value section.

Котлин

anim.minimumVisibleChange = DynamicAnimation.MIN_VISIBLE_CHANGE_SCALE

Ява

anim.setMinimumVisibleChange(DynamicAnimation.MIN_VISIBLE_CHANGE_SCALE);

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

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

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

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

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