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

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

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

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

You can use a fixed value as the starting velocity, or you can base it off of the velocity of a touch gesture. If you choose to provide a fixed value, you should define the value in dp per second, then convert it to pixels per second. Defining the value in dp per second allows the velocity to be independent of a device's density and form factors. Дополнительные сведения о преобразовании начальной скорости в пиксели в секунду см. в разделе «Преобразование dp в секунду в пиксели в секунду» в Spring Animation .

To set the velocity, call the setStartVelocity() method and pass the velocity in pixels per second. The method returns the fling object on which the velocity is set.

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

Установить диапазон значений анимации

You can set the minimum and the maximum animation values when you want to restrain the property value to a certain range. This range control is particularly useful when you animate properties that have an intrinsic range, such as alpha (from 0 to 1).

Note : When the value of a fling animation reaches the minimum or maximum value, the animation ends.

To set the minimum and maximum values, call the setMinValue() and setMaxValue() methods, respectively. Both methods return the animation object for which you have set the value.

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

The setFriction() method lets you change the animation's friction. It defines how quickly the velocity decreases in an animation.

Note : If you don't set the friction at the beginning of the animation, the animation uses a default friction value of 1.

The method returns the object whose animation uses the friction value you provide.

Пример кода

The example below illustrates a horizontal fling. The velocity captured from the velocity tracker is velocityX and, the scroll bounds are set to 0 and 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();

Установите минимальное видимое изменение

When you animate a custom property that isn't defined in pixels, you should set the minimal change of animation value that is visible to users. It determines a reasonable threshold for ending the animation.

Нет необходимости вызывать этот метод при анимации 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 пикселя.
  • For animations that use opacity, the minimum visible change is MIN_VISIBLE_CHANGE_ALPHA , or 1/256.

Чтобы установить минимальное видимое изменение для анимации, вызовите метод setMinimumVisibleChange() и передайте либо одну из минимальных видимых констант, либо значение, которое необходимо вычислить для настраиваемого свойства. 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);

Note : You need to pass a value only when you animate a custom property that is not defined in pixels.

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

To calculate the minimum visible change value for a custom property, use the following formula:

Minimum visible change = Range of custom property value / Range of animiation in pixels

For example, the property that you want to animate progresses from 0 to 100. This corresponds to a 200-pixel change. Per the formula, the minimum visible change value is 100 / 200 is equal to 0.5 pixels.