MotionLayout — это мощный макет в Android, который помогает создавать красивые и интерактивные пользовательские интерфейсы. Это расширение ConstraintLayout , позволяющее выполнять сложную анимацию и переходы между различными состояниями макета.

MotionLayout является частью библиотеки ConstraintLayout и может использоваться в приложениях Android Kotlin путем добавления следующей зависимости в файл build.gradle уровня приложения:

implementation 'androidx.constraintlayout:constraintlayout:2.1.0'

После добавления зависимости вы можете начать использовать MotionLayout в своем приложении.

Что такое MotionLayout?

MotionLayout — это подкласс ConstraintLayout , который позволяет создавать сложные анимации и переходы между различными состояниями макета. Вы можете определить различные состояния макета, такие как начальное, конечное и любые промежуточные состояния, а затем использовать MotionLayout для анимации между ними.

MotionLayout позволяет определять анимацию с помощью ключевых кадров, которые являются начальной и конечной точками анимации. Вы можете указать различные свойства, такие как положение, поворот, масштаб и альфа-канал для каждого ключевого кадра, и MotionLayout будет автоматически выполнять анимацию между ними.

Как использовать MotionLayout?

Чтобы использовать MotionLayout в своем приложении, вам нужно определить макет в XML, а затем создать файл MotionScene , который определяет анимацию и различные состояния макета.

Определение макета

Чтобы определить макет в XML, вы можете использовать тот же синтаксис, что и ConstraintLayout. Вот пример простого MotionLayout:

<androidx.constraintlayout.motion.widget.MotionLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">
  <ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher_background"/>
</androidx.constraintlayout.motion.widget.MotionLayout>

В этом примере мы определили MotionLayout , который содержит ImageView. Теперь мы можем определить различные состояния макета и анимацию перехода между ними.

Определение сцены движения

Чтобы определить анимацию и различные состояния макета, нам нужно создать файл MotionScene . MotionScene file — это файл XML, который определяет различные состояния макета и анимацию перехода между ними.

Вот пример файла MotionScene file:

<MotionScene xmlns:app="http://schemas.android.com/apk/res-auto">
  <Transition
        app:constraintSetEnd="@+id/end"
        app:constraintSetStart="@+id/start">
        <KeyFrameSet>
            <KeyAttribute
                app:target="@id/imageView"
                app:framePosition="0"
                android:alpha="1"/>
            <KeyAttribute
                app:target="@id/imageView"
                app:framePosition="100"
                android:alpha="0"/>
        </KeyFrameSet>
    </Transition>
    <ConstraintSet android:id="@+id/start">
        <Constraint
            android:id="@+id/imageView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            android:alpha="1"/>
    </ConstraintSet>
    <ConstraintSet android:id="@+id/end">
        <Constraint
            android:id="@+id/imageView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            android:alpha="0"/>
    </ConstraintSet>
</MotionScene>

В этом примере мы определили простую анимацию, которая исчезает с экрана. Элемент <Transition> определяет анимацию, а элементы <ConstraintSet> определяют различные состояния макета.

Элемент <KeyFrameSet> определяет ключевые кадры анимации. В этом примере мы определили два ключевых кадра — один в начале анимации (framePosition='0') и один в конце анимации (framePosition='100'). Мы также определили свойство альфа для каждого ключевого кадра, которое указывает непрозрачность ImageView.

Использование MotionScene в макете

Как только мы определили MotionScene, мы можем использовать его в MotionLayout , добавив следующий атрибут:

app:layoutDescription="@xml/motion_scene"

Здесь motion_scene — это имя файла MotionScene, который мы создали.

<androidx.constraintlayout.motion.widget.MotionLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layoutDescription="@xml/motion_scene">
  <ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher_background"/>
</androidx.constraintlayout.motion.widget.MotionLayout>

Обработка событий движения

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

Например, вы можете определить анимацию, которая масштабирует представление, когда пользователь нажимает на него:

<Transition
    app:constraintSetEnd="@+id/end"
    app:constraintSetStart="@+id/start">
  <OnSwipe
        app:dragDirection="dragUp"
        app:touchAnchorId="@id/imageView"
        app:touchAnchorSide="top"/>
    <KeyFrameSet>
        <KeyAttribute
            app:target="@id/imageView"
            app:framePosition="0"
            android:scaleX="1"
            android:scaleY="1"/>
        <KeyAttribute
            app:target="@id/imageView"
            app:framePosition="100"
            android:scaleX="2"
            android:scaleY="2"/>
    </KeyFrameSet>
</Transition>

В этом примере мы добавили элемент <OnSwipe> к элементу <Transition>. Это указывает, что анимация должна запускаться, когда пользователь проводит пальцем вверх по ImageView. Мы также определили два ключевых кадра, которые масштабируют ImageView от исходного размера до удвоенного.

Заключение

MotionLayout — это мощный макет в Android, который позволяет создавать сложные анимации и переходы между различными состояниями макета. Это расширение ConstraintLayout , позволяющее определять анимацию с использованием ключевых кадров. MotionLayout также обеспечивает поддержку обработки сенсорных событий, что позволяет создавать интерактивные пользовательские интерфейсы.

Используя MotionLayout в своих приложениях Android Kotlin, вы можете создавать красивые и привлекательные пользовательские интерфейсы, обеспечивающие беспрепятственный пользовательский интерфейс.