秒懂Android开发之MotionLayout简单上手

2023-12-12 20:48

本文主要是介绍秒懂Android开发之MotionLayout简单上手,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【版权申明】非商业目的注明出处可自由转载
博文地址:https://blog.csdn.net/ShuSheng0007/article/details/106182408
出自:shusheng007

文章目录

  • 概述
  • 动画布局基本元素
    • MotionLayout
    • MotionScene
    • ConstraintSet
    • Transition
  • MotionLayout基础使用
  • 扩展
  • 总结

概述

前段时间升级了Android Studio到4.0, 发现新增了一个动画编辑器的功能,又一次感叹Android开发真的是越来越简单了。看了一下感觉挺有意思,所以就简单上手一下这个动画布局MotionLayout,通过这个布局我们可以以非常简单的方式作出很炫的动画。

动画布局基本元素

先上一张动图吧,图中的动画使用MotionLayout不到两分钟就可以完成,在此感谢老婆贡献自己的美照。

在这里插入图片描述
我们只要搞清楚几个关键元素,上手就易如反掌了,当然高级特性还需要熟练后深入探索,这个成年人都明白。

我们可以用一句话来描述一个View的动画:此View从开始状态到达结束状态的一个过程

MotionLayout

MotionLayout是整个动画的容器,正是它提供了让其内部的直接嵌套View 做动画的能力。它是ConstraintLayout 的子类, 可以从AS中通过ConstraintLayout转换而来。

MotionScene

动画场景,顾名思义,它的作用就是描述整个动画。是一个xml文件,放在xml 文件夹内,作为MotionLayoutlayoutDescription属性的值,本例中我写了个一个名为activity_motion_scene.xml的MotionScence文件并设置给MothionLayout,如下所示

<androidx.constraintlayout.motion.widget.MotionLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"...app:layoutDescription="@xml/activity_motion_scene">...
</androidx.constraintlayout.motion.widget.MotionLayout>

ConstraintSet

动画开始时或者结束时的快照,其用来描述一个View开始和结束时候的状态。例如一个View动画开始前在哪里,多大尺寸,什么颜色等等。 其嵌套在MotionScene 里面,一般有两个,一个开始一个结束。

<MotionScene xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"><!--    动画开始快照--><ConstraintSet android:id="@+id/start"><Constraintandroid:id="@+id/my_wife"android:layout_width="60dp"android:layout_height="60dp"app:layout_constraintStart_toStartOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintBottom_toBottomOf="parent"/></ConstraintSet><!--    动画结束快照--><ConstraintSet android:id="@+id/end"><Constraintandroid:id="@+id/my_wife"android:layout_width="150dp"android:layout_height="150dp"android:layout_marginStart="5dp"android:layout_marginEnd="5dp"app:layout_constraintStart_toEndOf="@id/my_wife_left"app:layout_constraintEnd_toStartOf="@id/my_wife_right"app:layout_constraintTop_toTopOf="parent"/></ConstraintSet>...
</MotionScene>

Transition

描述View从开始状态变换到结束状态的过程,且响应用户的操作,其嵌套在MotionScene 里,与ConstraintSet平级,是整个动画布局的精华部分。

Transition 的constraintSetEnd 属性设置开始ConstraintSet ,constraintSetStart属性设置结束那个ConstraintSet ,再设置一个动画时间即可。

其可以包含一个<KeyFrameSet> 负责在动画过程中改变view的位置和属性。如果不设置此标签,那么我们的动画就会线性的从开始运动到结束。

    <Transitionapp:constraintSetEnd="@+id/end"app:constraintSetStart="@id/start"app:duration="2000"><KeyFrameSet><KeyPositionapp:motionTarget="@id/my_wife_left"app:framePosition="40"app:keyPositionType="parentRelative"app:percentX="0"/>...<KeyAttributeapp:motionTarget="@id/my_wife"app:framePosition="40"android:rotationY="360"/></KeyFrameSet><OnSwipeapp:touchAnchorId="@+id/my_wife"app:touchAnchorSide="top"app:dragDirection="dragUp" /><OnClick app:targetId="@+id/my_wife" app:clickAction="toggle" /></Transition>

MotionLayout基础使用

明白了以上几个元素使用就非常简单了,让我们完成文章最开始的动画

  • 配置环境
    需要升级constraintlayout控件库到2.0以上,现在是beta6了,已经过了alpha,说明接口稳定了。
implementation "androidx.constraintlayout:constraintlayout:2.0.0-beta6"
  • 具体使用
  1. 在layout文件中用MotionLayout 包裹需要做动画的View。
       <androidx.constraintlayout.motion.widget.MotionLayoutxmlns: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_motion_scene"app:motionDebug="SHOW_PATH"tools:context=".animation.MotionActivity"><ImageViewandroid:id="@+id/my_wife_left"android:layout_width="60dp"android:layout_height="60dp"android:src="@drawable/my_wife"/><ImageViewandroid:id="@+id/my_wife"android:layout_width="60dp"android:layout_height="60dp"android:src="@drawable/my_wife"/><ImageViewandroid:id="@+id/my_wife_right"android:layout_width="60dp"android:layout_height="60dp"android:src="@drawable/my_wife" /></androidx.constraintlayout.motion.widget.MotionLayout>
    
  2. 在res/xml 文件夹中新建一个名为:activity_motion_scene的MotionScene文件,并设置到MotionLayout的layoutDescription属性中
  3. 在MotionScene中定义两个ConstraintSet,一个为View的开始状态,一个为View结束状态。
  4. 在MotionScene中定义一个Transition,并设置开始与结束的ConstraintSet 。
<MotionScene xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"><Transitionapp:constraintSetEnd="@+id/end"app:constraintSetStart="@id/start"app:duration="2000"><KeyFrameSet><KeyPositionapp:motionTarget="@id/my_wife_left"app:framePosition="40"app:keyPositionType="parentRelative"app:percentX="0"/><KeyPositionapp:motionTarget="@id/my_wife_right"app:framePosition="40"app:keyPositionType="parentRelative"app:percentX="1"/></KeyFrameSet><!-- 使动画响应滑动事件--><OnSwipeapp:touchAnchorId="@+id/my_wife"app:touchAnchorSide="top"app:dragDirection="dragUp" /><!-- 使动画响应点击事件--><OnClick app:targetId="@+id/my_wife" app:clickAction="toggle" /></Transition><!--    动画开始快照--><ConstraintSet android:id="@+id/start"><Constraintandroid:id="@+id/my_wife"android:layout_width="60dp"android:layout_height="60dp"app:layout_constraintStart_toStartOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintBottom_toBottomOf="parent"/><Constraintandroid:id="@+id/my_wife_left"android:layout_width="60dp"android:layout_height="60dp"android:alpha="0.0"app:layout_constraintStart_toStartOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintBottom_toBottomOf="parent"/><Constraintandroid:id="@+id/my_wife_right"android:layout_width="60dp"android:layout_height="60dp"android:alpha="0.0"app:layout_constraintStart_toStartOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintBottom_toBottomOf="parent"/></ConstraintSet><!--    动画结束快照--><ConstraintSet android:id="@+id/end"><Constraintandroid:id="@+id/my_wife_left"android:layout_width="100dp"android:layout_height="100dp"android:alpha="1.0"app:layout_constraintHorizontal_chainStyle="packed"app:layout_constraintStart_toStartOf="parent"app:layout_constraintEnd_toStartOf="@id/my_wife"app:layout_constraintTop_toTopOf="@id/my_wife"app:layout_constraintBottom_toBottomOf="@id/my_wife"/><Constraintandroid:id="@+id/my_wife"android:layout_width="150dp"android:layout_height="150dp"android:layout_marginStart="5dp"android:layout_marginEnd="5dp"app:layout_constraintStart_toEndOf="@id/my_wife_left"app:layout_constraintEnd_toStartOf="@id/my_wife_right"app:layout_constraintTop_toTopOf="parent"/><Constraintandroid:id="@+id/my_wife_right"android:layout_width="100dp"android:layout_height="100dp"android:alpha="1.0"app:layout_constraintStart_toEndOf="@id/my_wife"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintTop_toTopOf="@id/my_wife"app:layout_constraintBottom_toBottomOf="@id/my_wife"/></ConstraintSet>
</MotionScene>

经过上面简单的几步动画就已经完成啦,是不是2分钟内就搞定了。

其中, <Transition>里的<OnClick>标签响应用户的点击动作,例如此例中我们点击一下中间的view,动画就开始了。

<OnClick app:targetId="@+id/my_wife" app:clickAction="toggle" />

扩展

上面只是可以让你快速上手,里面还有很多高级特性需要你继续探索,例如在Transition的 KeyFrameSet 里面还包括
<KeyCycle><KeyAttribute><KeyTimeCycle><KeyTrigger> 等对动画精细控制的标签

下面是一些很好的资源,可以帮助你更加详细的理解这个库

本文源码:AndroidDevMemo

官方示例:ConstraintLayoutExamples
Medium博客: Introduction to MotionLayout

总结

IT 技术更新换代实在是太快了,而且对于应用层会越变越简单,所以奉劝各位可爱的程序员们在习得日常求生技能后,最好还是多关注一下计算机科学基础。例如计算机系统、数据结构、算法、数据库、网络、编译原理、设计模式等

总的来说,照目前的情况来看,未来的社会会更加数字化、智能化,所以程序员会大有可为,加油。

这篇关于秒懂Android开发之MotionLayout简单上手的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/485890

相关文章

利用Python编写一个简单的聊天机器人

《利用Python编写一个简单的聊天机器人》这篇文章主要为大家详细介绍了如何利用Python编写一个简单的聊天机器人,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 使用 python 编写一个简单的聊天机器人可以从最基础的逻辑开始,然后逐步加入更复杂的功能。这里我们将先实现一个简单的

基于Python开发电脑定时关机工具

《基于Python开发电脑定时关机工具》这篇文章主要为大家详细介绍了如何基于Python开发一个电脑定时关机工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 简介2. 运行效果3. 相关源码1. 简介这个程序就像一个“忠实的管家”,帮你按时关掉电脑,而且全程不需要你多做

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

使用IntelliJ IDEA创建简单的Java Web项目完整步骤

《使用IntelliJIDEA创建简单的JavaWeb项目完整步骤》:本文主要介绍如何使用IntelliJIDEA创建一个简单的JavaWeb项目,实现登录、注册和查看用户列表功能,使用Se... 目录前置准备项目功能实现步骤1. 创建项目2. 配置 Tomcat3. 项目文件结构4. 创建数据库和表5.

使用PyQt5编写一个简单的取色器

《使用PyQt5编写一个简单的取色器》:本文主要介绍PyQt5搭建的一个取色器,一共写了两款应用,一款使用快捷键捕获鼠标附近图像的RGB和16进制颜色编码,一款跟随鼠标刷新图像的RGB和16... 目录取色器1取色器2PyQt5搭建的一个取色器,一共写了两款应用,一款使用快捷键捕获鼠标附近图像的RGB和16

四种简单方法 轻松进入电脑主板 BIOS 或 UEFI 固件设置

《四种简单方法轻松进入电脑主板BIOS或UEFI固件设置》设置BIOS/UEFI是计算机维护和管理中的一项重要任务,它允许用户配置计算机的启动选项、硬件设置和其他关键参数,该怎么进入呢?下面... 随着计算机技术的发展,大多数主流 PC 和笔记本已经从传统 BIOS 转向了 UEFI 固件。很多时候,我们也

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

MyBatis框架实现一个简单的数据查询操作

《MyBatis框架实现一个简单的数据查询操作》本文介绍了MyBatis框架下进行数据查询操作的详细步骤,括创建实体类、编写SQL标签、配置Mapper、开启驼峰命名映射以及执行SQL语句等,感兴趣的... 基于在前面几章我们已经学习了对MyBATis进行环境配置,并利用SqlSessionFactory核