Настройка анимации в AnimatedVisibility

Последнее обновление: 13.04.2024

Для управления анимацией при появлении и исчезновении вложенных компонентов в AnimatedVisibility применяются параметры enter и exit. Этим параметрам передается одна из функций, которые создают эффект анимации. В частности, это следующие функции:

  • expandHorizontally(): содержимое отображается с использованием метода горизонтального отсечения. Позволяет указать, какая часть контента изначально отображается до начала анимации.

  • expandVertically(): содержимое отображается с использованием техники вертикального отсечения. Позволяет указать, какая часть контента изначально отображается до начала анимации.

  • expandIn(): содержимое отображается с использованием методов горизонтального и вертикального отсечения. Позволяет указать, какая часть контента изначально отображается до начала анимации.

  • fadeIn(): постепенно делает прозрачное содержимое непрозрачным. Начальная прозрачность может быть объявлена с использованием значения с плавающей запятой от 0 до 1.0. Значение по умолчанию - 0.

  • fadeOut(): постепенно делает непрозрачное содержимое прозрачным (невидимым). Целевая прозрачность перед исчезновением содержимого может быть объявлена с использованием значения с плавающей запятой от 0 до 1.0. Значение по умолчанию - 0.

  • scaleIn(): содержимое постепенно увеличивается. По умолчанию содержимое начинается с нулевого размера и расширяется до полного размера, хотя это значение по умолчанию можно изменить, указав начальное значение масштаба как плавающее значение от 0 до 1.0.

  • scaleOut(): содержимое постепенно уменьшается и в конце полностью исчезает. По умолчанию целевой масштаб равен 0, но его можно настроить с использованием плавающего значения от 0 до 1.0.

  • shrinkHorizontally(): компонент постепенно сживается по горизонтали, пока польностью не исчезнет.

  • shrinkVertically(): компонент постепенно сживается по вертикали, пока польностью не исчезнет.

  • shrinkOut(): ккомпонент постепенно сживается по горизонтали и вертикали, пока польностью не исчезнет.

  • slideInHorizontally(): содержимое перемещается в область обзора вдоль горизонтальной оси

  • slideInVertically(): содержимое перемещается в область обзора вдоль вертикальной оси.

  • slideIn(): содержимое появляется в области обзора под настраиваемым углом, определяемым через начальное значение смещения.

  • slideOut(): содержимое исчезает из поля зрения под настраиваемым углом, определяемым через начальное значение смещения.

  • slideOutHorizontally(): содержимое выходит из области обзора вдоль горизонтальной оси.

  • slideOutVertically(): содержимое выходит из поля зрения вдоль вертикальной оси

Например, применм пару из них:

package com.example.helloapp

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.fadeIn
import androidx.compose.animation.slideOutVertically
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp

class MainActivity : ComponentActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent{
            val boxVisible = remember { mutableStateOf(true) }
            Column(Modifier.padding(20.dp), horizontalAlignment = Alignment.CenterHorizontally) {
                AnimatedVisibility(
                    visible = boxVisible.value,
                    Modifier.padding(40.dp),
                    enter = fadeIn(),
                    exit = slideOutVertically()) {
                        Box(Modifier.size(200.dp).background(Color.DarkGray))
                }
                Row(Modifier.fillMaxWidth(),horizontalArrangement = Arrangement.SpaceEvenly) {
                    Button({boxVisible.value = true}, enabled = !boxVisible.value){ Text("Show", fontSize = 28.sp)}
                    Button({boxVisible.value = false}, enabled = boxVisible.value){ Text("Hide", fontSize = 28.sp)}
                }
            }
        }
    }
}

В данном случае при появлении компонент Box будет постепенно отображаться, пока не станет полностью непрозрачным (видимым). А при исчезновении он будет склользить по вертикали вверх, как бы уходя из поля зрения:

enter = fadeIn(),
exit = slideOutVertically()

Стоит отметить, что с помощью операции сложения мы можем комбинировать несколько функций:

AnimatedVisibility(
    visible = boxVisible,
    enter = fadeIn() + expandHorizontally(),
    exit = slideOutVertically()
) {

Настройка времени и плавности анимации

Для настройки анимации вышеуказанные функции имеют параметр animationSpec, который представляет интерфейс AnimationSpec. Так, для установки времени и сглаживания анимации в AnimatedVisibility может использоваться рассмотренная в одной из прошлых тем функция tween(). Например:

package com.example.helloapp

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.core.tween
import androidx.compose.animation.fadeIn
import androidx.compose.animation.slideOutVertically
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp

class MainActivity : ComponentActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent{
            val boxVisible = remember { mutableStateOf(true) }
            Column(Modifier.padding(20.dp), horizontalAlignment = Alignment.CenterHorizontally) {
                AnimatedVisibility(
                    visible = boxVisible.value,
                    Modifier.padding(40.dp),
                    enter = fadeIn(animationSpec = tween(durationMillis = 5000)),
                    exit = slideOutVertically()) {
                        Box(Modifier.size(200.dp).background(Color.DarkGray))
                }
                Row(Modifier.fillMaxWidth(),horizontalArrangement = Arrangement.SpaceEvenly) {
                    Button({boxVisible.value = true}, enabled = !boxVisible.value){ Text("Show", fontSize = 28.sp)}
                    Button({boxVisible.value = false}, enabled = boxVisible.value){ Text("Hide", fontSize = 28.sp)}
                }
            }
        }
    }
}

В данном случае для анимации появления на экране применяется функция fadeIn()

enter = fadeIn(animationSpec = tween(durationMillis = 5000)),

То есть появление компонента на экране будет занимать 5000 миллисекунд.

Аналогичным образом можно настраивать и другие функции, например:

import androidx.compose.animation.core.LinearOutSlowInEasing
import androidx.compose.animation.slideInHorizontally

...................................
enter = slideInHorizontally(tween(durationMillis = 5000, easing = LinearOutSlowInEasing)),

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

Или

import androidx.compose.animation.shrinkVertically
import androidx.compose.animation.slideInVertically
............................................

AnimatedVisibility(
    visible = boxVisible.value,
    Modifier.padding(40.dp),
    enter =slideInVertically(tween(durationMillis = 5000, easing = LinearOutSlowInEasing)),
    exit = shrinkVertically(tween(durationMillis = 5000, easing = LinearOutSlowInEasing))) {
        Box(Modifier.size(200.dp).background(Color.DarkGray))
}

В данном случае компонент будет постепенно появляться в течение 5 секунд, выдвигаясь из-за вертикальной границы. И будет ужиматься вдоль вертикальной оси в течение 5 секунд.

Также для установки специафикации анимации можно использовать и другие функции, которые возвращают объект AnimationSpec. Например, используем функцию repeatable(), чтобы повторить анимацию 10 раз:

import androidx.compose.animation.core.RepeatMode
import androidx.compose.animation.core.repeatable
......................................

AnimatedVisibility(
    visible = boxVisible.value,
    Modifier.padding(40.dp),
    enter =fadeIn(animationSpec = 
        repeatable(10,
            animation = tween(durationMillis = 2000),
            repeatMode = RepeatMode.Reverse)
    ),
    exit = fadeOut()) {
        Box(Modifier.size(200.dp).background(Color.DarkGray))
}
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850