转自:反魂蝶五分

https://blog.csdn.net/u014290233/article/details/94398813

在今年的Google I/O 上 Google 开发者展示了这么一段视频 What’s New in ConstraintLayout (Google I/O’19) (视频在youtube上,需要翻墙),截了其中一段做了个gif图

图中动画使用ConstraintLayout 2.0里的MotionLayout完成。

ConstraintLayout 2.0现在还是beta版,不过已经可以实行图中的动画了。

今天可以做一个简易版的动画。

本项目环境配置:

Android Studio 3.4.1

ConstraintLayout 2.0.0-beta1

新建项目,引入ConstraintLayout 库

implementation 'com.android.support.constraint:constraint-layout:2.0.0-beta1'

布局根节点使用MotionLayout替换ConstraintLayout

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.motion.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:id="@+id/activity_motion"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_marginTop="20dp"android:layout_marginBottom="20dp"app:layoutDescription="@xml/motion_scene"app:showPaths="true"tools:context=".MainActivity"><ImageViewandroid:id="@+id/main_image1"android:layout_width="60dp"android:layout_height="60dp"android:background="@color/color1"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent"tools:ignore="ContentDescription" /></android.support.constraint.motion.MotionLayout>

xml里引入motion_scene文件:

<?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"><Transitionmotion:constraintSetEnd="@id/end"motion:constraintSetStart="@id/start"motion:duration="4000"motion:motionInterpolator="easeInOut"><OnClickmotion:clickAction="toggle"motion:targetId="@id/main_image1" />............</Transition><ConstraintSet android:id="@+id/start"><Constraintandroid:id="@+id/main_image1"android:layout_width="60dp"android:layout_height="60dp"motion:drawPath="path"motion:layout_constraintBottom_toBottomOf="parent"motion:layout_constraintLeft_toLeftOf="parent"motion:layout_constraintRight_toRightOf="parent"motion:layout_constraintTop_toTopOf="parent"motion:pathMotionArc="startVertical" /></ConstraintSet><ConstraintSet android:id="@+id/end"><Constraintandroid:id="@+id/main_image1"android:layout_width="60dp"android:layout_height="60dp"motion:layout_constraintBottom_toBottomOf="parent"motion:layout_constraintLeft_toLeftOf="parent"motion:layout_constraintRight_toRightOf="parent" /></ConstraintSet></MotionScene>

我们先从最简单的入手,定义一个ImageView,两个ConstraintSet 分别定义开始位置和结束位置,然后在Transition处引入:

motion:duration 定义动画时长

motion:motionInterpolator定义缓动动画 (这里推荐一个网站 缓动函数速查表)

http://www.xuanfengge.com/easeing/easeing/

<OnClickmotion:clickAction="toggle"motion:targetId="@id/main_image1" />

这段代码 表示监听main_image1的点击事件,并在开始位置和结束位置之间切换状态

为了使图片旋转一周,我们需要定义5个关键点

先添加第一个关键点

<KeyFrameSet><KeyPositionmotion:framePosition="20"motion:keyPositionType="parentRelative"motion:motionTarget="@id/main_image1"motion:pathMotionArc="flip"motion:percentX="0.25"motion:percentY="0.65" /></KeyFrameSet>

motion:motionTarget表示关键点应用的控件

motion:framePosition表示这个点处于动画进行到20%时

motion:keyPositionType表示使用的坐标系,有三种选择

  1. parentRelative

  2. deltaRelative

  3. pathRelative

motion:percentX motion:percentX 关键点的(x,y)坐标

三种坐标系的区别

parentRelative

这个我使用后发现与引用的博客里不一样,这个是与Android坐标系一致,以父容器左上角为坐标原点,向右为x轴正方向,向下为y轴正方向。

deltaRelative

以控件开始位置和结束位置定义坐标系,开始位置为坐标原点,水平方向为X轴,垂直方向为Y轴。

pathRelative

以起始位置为坐标原点,起始位置到结束位置的path为X轴,垂直方向为Y轴。

motion:pathMotionArc 表示两点之间的path形状,默认是none(线性) ,flip表示翻转当前弧形方向

startHorizontal

startVertical

第一个关键点定义完成后运行如图

如此这样,定义完其他的关键点:

<KeyFrameSet><KeyPositionmotion:framePosition="20"motion:keyPositionType="parentRelative"motion:motionTarget="@id/main_image1"motion:pathMotionArc="flip"motion:percentX="0.25"motion:percentY="0.65" /><KeyPositionmotion:framePosition="36"motion:keyPositionType="parentRelative"motion:motionTarget="@id/main_image1"motion:pathMotionArc="flip"motion:percentX="0"motion:percentY="0.5" /><KeyPositionmotion:framePosition="52"motion:keyPositionType="parentRelative"motion:motionTarget="@id/main_image1"motion:pathMotionArc="startHorizontal"motion:percentX="0.5"motion:percentY="0.25" /><KeyPositionmotion:framePosition="68"motion:keyPositionType="parentRelative"motion:motionTarget="@id/main_image1"motion:pathMotionArc="startVertical"motion:percentX="1"motion:percentY="0.5" /><KeyPositionmotion:framePosition="84"motion:keyPositionType="parentRelative"motion:motionTarget="@id/main_image1"motion:pathMotionArc="none"motion:percentX="0.5"motion:percentY="0.75" /></KeyFrameSet>

运行效果如下:

添加其他的ImageView,更改最后的显示位置,将ImageView1的关键点复制3份,分别设成其他的ImageView的关键点:

<ConstraintSet android:id="@+id/start"><Constraintandroid:id="@+id/main_image1"android:layout_width="60dp"android:layout_height="60dp"motion:drawPath="path"motion:layout_constraintBottom_toBottomOf="parent"motion:layout_constraintLeft_toLeftOf="parent"motion:layout_constraintRight_toRightOf="parent"motion:layout_constraintTop_toTopOf="parent"motion:pathMotionArc="startVertical" /><Constraintandroid:id="@+id/main_image2"android:layout_width="60dp"android:layout_height="60dp"motion:drawPath="path"motion:layout_constraintBottom_toBottomOf="parent"motion:layout_constraintLeft_toLeftOf="parent"motion:layout_constraintRight_toRightOf="parent"motion:layout_constraintTop_toTopOf="parent"motion:pathMotionArc="startVertical" /><Constraintandroid:id="@+id/main_image3"android:layout_width="60dp"android:layout_height="60dp"motion:drawPath="path"motion:layout_constraintBottom_toBottomOf="parent"motion:layout_constraintLeft_toLeftOf="parent"motion:layout_constraintRight_toRightOf="parent"motion:layout_constraintTop_toTopOf="parent"motion:pathMotionArc="startVertical" /><Constraintandroid:id="@+id/main_image4"android:layout_width="60dp"android:layout_height="60dp"motion:drawPath="path"motion:layout_constraintBottom_toBottomOf="parent"motion:layout_constraintLeft_toLeftOf="parent"motion:layout_constraintRight_toRightOf="parent"motion:layout_constraintTop_toTopOf="parent"motion:pathMotionArc="startVertical" /></ConstraintSet><ConstraintSet android:id="@+id/end"><Constraintandroid:id="@+id/main_image1"android:layout_width="60dp"android:layout_height="60dp"motion:layout_constraintBottom_toBottomOf="parent"motion:layout_constraintLeft_toLeftOf="parent"motion:layout_constraintRight_toLeftOf="@id/main_image2"motion:layout_constraintVertical_chainStyle="spread_inside" /><Constraintandroid:id="@+id/main_image2"android:layout_width="60dp"android:layout_height="60dp"motion:layout_constraintBottom_toBottomOf="parent"motion:layout_constraintLeft_toRightOf="@id/main_image1"motion:layout_constraintRight_toLeftOf="@id/main_image3" /><Constraintandroid:id="@+id/main_image3"android:layout_width="60dp"android:layout_height="60dp"motion:layout_constraintBottom_toBottomOf="parent"motion:layout_constraintLeft_toRightOf="@id/main_image2"motion:layout_constraintRight_toLeftOf="@id/main_image4" /><Constraintandroid:id="@+id/main_image4"android:layout_width="60dp"android:layout_height="60dp"motion:layout_constraintBottom_toBottomOf="parent"motion:layout_constraintLeft_toRightOf="@id/main_image3"motion:layout_constraintRight_toRightOf="parent" /></ConstraintSet>

效果如下:

可以看到效果和演示视频差不多了,接下来使4个ImageView依次运动

更改每个ImageView的每个motion:framePosition,使各个关键点产生距离,最终效果如下

代码已上传github github地址

https://github.com/LGD2009/MotionLayoutExample

参考文章:

  • MotionLayout 基础教程

    https://juejin.im/post/5cadc1ba6fb9a0686e40bb82

  • 「译」MotionLayout 介绍 (part II)

    https://juejin.im/post/5c1c8f74f265da61682b591c

  • Defining motion paths in MotionLayout

    https://medium.com/google-developers/defining-motion-paths-in-motionlayout-6095b874d37


   开发者全社区

关注本公众号领取Android\Python\AI\Java等高级进阶资源

关注后回复“百度”、“阿里”、“腾讯”、“资源”有惊喜

ConstraintLayout 2.0 新特性 MotionLayout 制作炫酷动画相关推荐

  1. 前端:CSS3新特性transform制作雪花飘落动画

    transform: translateX(   px) translateY(   px); 定位元素位置(树木.雪人) 雪花飘落特效使用 @keyframes snowfly{ 0%{ backg ...

  2. css3制作炫酷动画相册

    1. 特别说明:本段代码未作兼容处理,仅在高版本谷歌浏览器中起作用哟: 2.这里我使用的是网络图片,想制作属于自己相册的小伙伴们,可以新建img文件夹,在css样式中,将背景土拍你路径替换为自己的图片 ...

  3. android 动画后动画效果,Android5.0之后 VectorDrawable实现超炫酷动画效果

    标签介绍: , , , 项目中还是用到了一些动画的标签,这里就不做展示了 path android:name 定义该 path 的名字,这样在其他地方可以通过名字来引用这个路径 android:pat ...

  4. android5.0新特性 clipping的用法

    android5.0新特性 clipping的用法 1.使用场景 要实现一个按钮的圆角矩形效果,很简单,做过android ui开发的同学应该都会,不就是在drawable中新建一个shape文件,类 ...

  5. JDK5.0新特性系列---目录

    JDK5.0新特性系列---目录 JDK5.0新特性系列---1.自动装箱和拆箱 JDK5.0新特性系列---2.新的for循环 JDK5.0新特性系列---3.枚举类型 JDK5.0新特性系列--- ...

  6. [转]C# 2.0新特性与C# 3.5新特性

    C# 2.0新特性与C# 3.5新特性 一.C# 2.0 新特性: 1.泛型List<MyObject> obj_list=new List(); obj_list.Add(new MyO ...

  7. Servlet 3.0 新特性概述

    Servlet 3.0 新特性概述 Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布.该版本在前一版本(Servlet 2.5)的基础上提供了若 ...

  8. Redis 6.0 新特性-多线程连环13问!

    来自:码大叔 导读:支持多线程的Redis6.0版本于2020-05-02终于发布了,为什么Redis忽然要支持多线程?如何开启多线程?开启后性能提升效果如何?线程数量该如何设置?开启多线程后会不会有 ...

  9. WCF4.0新特性体验(3):标准终结点(Standard Endpoints)

    今天在WCF4.0新特性体验第3节,我们介绍WCF4.0里的标准终结点概念,也就是Standard Endpoints. WCF4.0提供了那些标准终结点?他们有什么作用?如何使用标准终结点?如何该表 ...

最新文章

  1. 25.EXTJS 主页面的jsp
  2. 文献记录(part32)--Face spoofing detection under super-realistic 3D wax face attacks
  3. python堆排序算法_python 排序 堆排序
  4. leetcode1083. 销售分析 II(SQL)
  5. 使用 node.js 进行服务器端 JavaScript 编程
  6. UE3 中文教程主页
  7. 2022年春运火车票明起开卖
  8. Ubuntu 18.04LTS系统设置窗口打不开或者消失解决办法
  9. redis 配置文件配置
  10. HDU1427 速算24点
  11. 离散数学之数理逻辑01
  12. 抓包工具之fiddler
  13. 空间相关分析(三) 局部莫兰指数的理解与计算
  14. python怎么读取dat文件_小白也能学会系列:用python文件读写代码实例!(简单案例)...
  15. 计算机术语翻译在线,拼音翻译在线
  16. 腾讯云服务器-公网IP与域名绑定
  17. 河北工程大学计算机类专业排名,河北工程大学优势专业排名,2021年河北工程大学最好的专业排名...
  18. 王者战力查询接口,四大战区(文字版)
  19. 物联网大赛作品-老人手环介绍
  20. 计算机显卡调研,75%以上的人都想换显卡! MC调研报告告诉你吃鸡“帧”香

热门文章

  1. 用python读取身份证信息的功能分析与实现,兼述python调用dll的方法
  2. 智慧社区管理平台该如何选择?
  3. 备份恢复的种类以及完全恢复实验
  4. Pandas的常用操作(一)
  5. Linux安装库时安装源错误,linux环境下golang安装第三方库的时候出错的决办法
  6. 电磁波:频率、波长、反射波
  7. Node.js 从零开发web server博客项目--项目初始化
  8. 提高写作能力与表达能力
  9. 职称申报神器-职称小百科告诉你专业对应的评委会
  10. 怎样实现php伪静态,php如何用程序实现伪静态