一、什么是MotionLayout
MotionLayout 是一种布局类型,可帮助您管理应用中的运动和微件动画。MotionLayout 是 ConstraintLayout 的子类,在其丰富的布局功能基础之上构建而成。
二、使用MotionLayout的准备
1.添加MotionLayout依赖项
要在项目中使用 MotionLayout,请向应用的 build.gradle 文件添加 ConstraintLayout 2.0 依赖项。如果您使用了 AndroidX,请添加以下依赖项:
dependencies {
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta1'
}
如果您没有使用 AndroidX,请添加以下支持库依赖项:
dependencies {
implementation 'com.android.support.constraint:constraint-layout:2.0.0-beta1'
}
本人配置如下(使用的是AndroidX,加入了第一个依赖项):
1)
2)
2、创建MotionLayout文件
MotionLayout 是 ConstraintLayout 的子类,因此您可以通过替换布局资源文件中的类名称,将任何现有的 ConstraintLayout 转换为 MotionLayout,如下面的示例所示:
<!-- before: ConstraintLayout -->
<androidx.constraintlayout.widget.ConstraintLayout .../>
<!-- after: MotionLayout -->
<androidx.constraintlayout.motion.widget.MotionLayout .../>
下面的完整示例 MotionLayout 文件可用于创建图 1 中的运动:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.motion.widget.MotionLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layoutDescription="@xml/activity_main_scene"
tools:context=".MainActivity">
<View
android:id="@+id/button"
android:layout_width="64dp"
android:layout_height="64dp"
android:background="@color/colorAccent"
android:text="Button" />
</androidx.constraintlayout.motion.widget.MotionLayout>
3、创建MotionScene文件
在上述的 MotionLayout 示例中,app:layoutDescription 属性引用一个 MotionScene。MotionScene 是一个 XML 资源文件,其中包含相应布局的所有运动描述。为了将布局信息与运动描述分开,每个 MotionLayout 都引用一个单独的 MotionScene。请注意,MotionScene 中的定义优先于 MotionLayout 中的任何类似定义。
下面的示例 MotionScene 文件描述了图 1 中的基本水平运动:
<?xml version="1.0" encoding="utf-8"?>
<MotionScene xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:motion="http://schemas.android.com/apk/res-auto">
<Transition
motion:constraintSetStart="@+id/start"
motion:constraintSetEnd="@+id/end"
motion:duration="1000">
<OnSwipe
motion:touchAnchorId="@+id/button"
motion:touchAnchorSide="right"
motion:dragDirection="dragRight" />
</Transition>
<ConstraintSet android:id="@+id/start">
<Constraint
android:id="@+id/button"
android:layout_width="64dp"
android:layout_height="64dp"
android:layout_marginStart="8dp"
motion:layout_constraintBottom_toBottomOf="parent"
motion:layout_constraintStart_toStartOf="parent"
motion:layout_constraintTop_toTopOf="parent" />
</ConstraintSet>
<ConstraintSet android:id="@+id/end">
<Constraint
android:id="@+id/button"
android:layout_width="64dp"
android:layout_height="64dp"
android:layout_marginEnd="8dp"
motion:layout_constraintBottom_toBottomOf="parent"
motion:layout_constraintEnd_toEndOf="parent"
motion:layout_constraintTop_toTopOf="parent" />
</ConstraintSet>
</MotionScene>
其中:
Transition 包含运动的基本定义。
motion:constraintSetStart 和 motion:constraintSetEnd 指的是运动的端点。这些端点在 MotionScene 后面的 ConstraintSet 元素中定义。
motion:duration 指定完成运动所需的毫秒数。
OnSwipe 可让您通过轻触控制运动。
motion:touchAnchorId 指的是您可以滑动并拖动的视图。
motion:touchAnchorSide 表示我们从右侧拖动视图。
motion:dragDirection 表示拖动的进度方向。例如,motion:dragDirection=“dragRight” 表示当您向右拖动时,进度会增加。
ConstraintSet 是定义描述您的运动的各种限制条件的位置。在此示例中,我们为运动的每个端点定义一个 ConstraintSet。这些端点垂直居中(通过 app:layout_constraintTop_toTopOf=“parent” 和 app:layout_constraintBottom_toBottomOf=“parent”)。在水平方向上,端点位于屏幕最左侧和最右侧。
4、创建过程
1.可手动修改文件成MotionLayout文件和在XML文件下新建MotionScene文件
2.自动创建:
打开布局文件找到Component Tree栏选中后选择ConstraintLayout,点击后会自动将ConstraintLayout文件转换为MotionLayout文件,并在res/xml文件下自动生成MotionScene文件
三、MotionLayout的简单使用
实现组组件的基本触控移动
MotionLayout简单使用
图一 MotionLayout简单使用
四、总结
MotionLayout的使用可以让布局增加更多的可玩性,且入门难度不高,可以在平时的设计中应用,以此达到给设计的app锦上添花的效果。
作者:王乾钧
原文链接