MotionLayout入门

image

What is MotionLayout?

MotionLayout is a layout type that helps you manage motion and widget animation in your app. MotionLayout is a subclass of ConstraintLayout and builds upon its rich layout capabilities. As part of the ConstraintLayout library, MotionLayout is available as a support library and is backwards-compatible to API level 14.

MotionLayout bridges the gap between layout transitions and complex motion handling, offering a mix of features between the property animation framework, TransitionManager, and CoordinatorLayout.

引用自官方文档:Manage motion and widget animation with MotionLayout

通过阅读官方文档我们可以得知MotionLayout的一些信息:

  • MotionLayout是用来帮助开发者管理运动和组件动画的

  • MotionLayout是ConstraintLayout的子类

  • MotionLayout是ConstraintLayout 2.0库中提供的新类,也可作为支持库使用,并且向后兼容到API 14。

  • MotionLayout是为了弥合了布局过渡和复杂运动处理之间的鸿沟,在属性动画框架,TransitionManager和CoordinatorLayout之间提供了多种功能。

  • MotionLayout是完全声明式,我们可以用xml描述出任何复杂的效果

  • MotionLayout不支持嵌套子布局或者activity transition(如果您就有这样的需求,那还是乖乖的用TransitionManager吧)

  • 最后,官方建议不要把MotionLayout仅仅当做一个动效库来使用,它应该用于帮助用户了解您的应用程序在做什么,并表达品牌的个性和风格。

    参见Understanding motion

When to use it?

当我们学习一个新的东西的时候,“什么时候(情况下)使用它?”是一个很重要的问题。如果这个问题没想清楚,可能会引发一些不良的效果。

那么,什么时候去用MotionLayout呢?

Use MotionLayout when animating UI elements the user will interact with

当用户需要与有动效的UI元素交互时请使用MotionLayout

言外之意:

  1. 现有实现动效的方式就可以简单实现的就别折腾了,比如用以下方式
  1. 一些界面加载完就直接执行的复杂动画,直接用Gif或者视频搞定的也不需要
  2. 总结一下,别为了用MotionLayout而强行使用

Getting started

在开始使用MotionLayout之前我们需要准备以下几步。

1. Android Studio 4.0

MotionLayout编辑器仅支持4.0之上版本

image

2. 导入依赖

在您app的build.gradle文件添加ConstraintLayout 2.0的依赖。

  1. 如果你使用的是AndroidX

  2. dependencies {
        implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta3'
    }
    
  3. 如果你还没有迁移到AndroidX,则需要使用support 库

    dependencies {
        implementation 'com.android.support.constraint:constraint-layout:2.0.0-beta3'
    } 
    

3. 创建布局文件

创建完fragment_explore_motion_layout_part1.xml布局文件后,在Design模式下,右键点击布局或者Component Tree,选择菜单中的Convert to MotionLayout选项即可一步将布局转换为MotionLayout

image

我们再来看一下该布局的xml代码

image

为了使布局信息与运动描述分开,每个MotionLayout都会使用app:layoutDescription引用一个单独的MotionScene文件,这个文件放在res/xml文件夹。

下面来看一下生成的MotionScene文件:res/xml/fragment_explore_motion_layout_part1_scene.xml

image

4. MotionScene常见的标签及属性

  • Transition标签是用来定义运动的具体细节的

    常用的如下

    • constraintSetStart 定义运动的初始状态

      这可以是ConstraintSet的ID,也可以是布局。

      要指定ConstraintSet,请将此属性设置为@+id/constraintSetId

      要指定布局,请设置为@layout/layoutState

    • constraintSetEnd 定义运动的最终状态,取值同constraintSetStart

    • duration 定义运动的持续时间,以毫秒为单位,如不指定则使用默认值400ms

      image
    • motionInterpolator 定义运动插补器

      • easeInOut 缓入缓出
      • easeIn 缓入
      • easeOut 缓出
      • linear 线性
      • bounce 弹跳效果
    • autoTransition 自动过渡

      • none 不运动
      • jumpToStart 直接跳到开始
      • jumpToEnd 直接跳到结束
      • animateToStart 执行动画到开始
      • animateToEnd 执行动画到结束
  • OnSwipe 指定用户在布局上滑动时要执行的操作。

    • touchAnchorId 通过滑动移动的视图的Id。
    • touchAnchorSide 用户滑动界面时MotionLayout将尝试在touchAnchorId指定的视图和用户手指之间保持恒定的距离。而此属性指定的是手指和view的那一侧保持恒定的距离,可取值有以下几个:
      • left
      • right
      • top
      • bottom
    • dragDirection 用户滑动动作的方向。如果设置了此属性,则此onSwipe仅适用于沿指定方向的滑动。可接受的值为
      • dragLeft 左滑
      • dragRight 右滑
      • dragUp 上滑
      • dragDown 下滑
  • OnClick 指定当用户点击特定视图时要执行的操作。单个Transition可以有多个OnClick节点,每个OnClick指定一个不同的目标视图,并在点击该视图时执行不同的操作。

    • targetId 当用户点击targetId指定的view时将会执行Transition

    • ClickAction 点击视图时执行的操作。支持的值为:

      • toggle

        切换状态,如果当前状态是start的话,执行动画到end状态;若当前状态是end状态,则执行动画到start状态。

      • transitionToStart 执行动画到start状态

      • transitionToEnd 执行动画到end状态

      • jumpToStart 直接跳转到start状态

      • jumpToEnd 直接跳转到end状态

  • KeyFrameSet

    指定运动序列过程中视图的位置和属性。默认情况下,运动会从初始状态进行到结束状态。通过使用<KeyFrameSet>,您可以构建更复杂的动作。 <KeyFrameSet>包含<KeyPosition>或<KeyAttribute>节点。这些节点中的每个节点都指定运动中特定点的目标视图的位置或属性。 MotionLayout从起点到这些中间点中的每一个,再到最终目的地,使视图平滑地动画化。

  • KeyPosition

    指定运动序列中特定时刻的视图位置。此属性用于调整运动的默认路径。

    • motionTarget

      要在运动过程中改变属性的视图的Id

    • framePosition

      指定视图在运动序列中何时具有此<KeyAttribute>指定的属性。例如,framePosition = 50则代表视图运动到整个运动序列的50%处。

    • percentX percentY 指定视图应到达的位置。这两个属性需要配合keyPositionType才能确定具体位置。

    • keyPositionType

      指定如何解释percentX和percentY值。

      • parentRelative

        percentX和percentY是相对于父视图指定的。取值范围 0~1。

        image
      • deltaRelative

        相对于视图在整个运动序列过程中移动的距离,指定了percentX和percentY。 X为横轴,Y为纵轴。在这两种情况下,0都是该轴视图的起始位置,而1是最终位置。

        image

        Note:deltaRelative模式下,x,y坐标范围不是0~1。

        x<0 ----> 视图会定位到y轴的左侧。

        y<0 ----> 视图会定位到x轴的下方。

        x=1.5 ---> 代表视图定位到x轴方向start到end的横向距离1.5倍的位置

        y=1.5 ---> 代表视图定位到y轴方向start到end的垂直距离1.5倍的位置

        image
      • pathRelative

        X轴是目标视图在路径范围内移动的方向,0为开始位置,1为最终位置。 Y轴垂直于X轴,正值位于路径的右侧,负值位于左侧;设置一个非零的Y百分比会导致视图的路径向X轴的左侧或者右侧偏转形成弧线。因此,视图的初始位置是(0,0),最终位置是(1,0)。

        很多文章包括官网对y轴的取值都是写的x轴的左侧为正值,右侧为负值,但我实际测试的结果却是相反的。希望读者都亲自尝试一下。

        image
  • KeyAttribute

    指定运动序列中特定时刻的视图属性。您可以使用<KeyAttribute>设置视图的任何标准属性。

    • alpha
    • visibility
    • elevation
    • rotation, rotationX, rotationY
    • translationX, translationY, translationZ
    • scaleX, scaleY
  • ConstraintSet

    为一个或多个<Transition>节点指定开始或结束状态

关于更多的MotionScene标签以及它有哪些子标签可以查阅官方文档MotionLayout reference

Basic motion

下面这个栗子包含一个正方形的View,可以水平滑动。

image

Layout XML

MotionLayout的motionDegbug属性可以开启调试模式

  • motionDegbug
    • SHOW_PATH 展示运动路径
    • SHOW_PROGRESS 展示运动进度
    • SHOW_ALL 展示PATH&PROGRESS
image

MotionScene XML

  • KeyPosition

    framePosition=50处向y轴方向偏移50%

  • KeyAttribute

    framePosition=50处改变视图的如下属性:

    • 整体缩放2倍
    • X轴旋转-60°,y轴旋转45°
    • 透明度变为0.3
image

Custom attribute

下面使用ImageFilterView来演示自定义属性

image

Layout XML

image

MotionScene XML

Note:请注意,指定自定义属性时,自定义属性必须在start和end的ConstraintSet元素中成对出现,另外在运动过程中改变自定义属性时,也要保证前面的规则。

  • start中的初始自定义属性

    • roundPercent = 0.1 代表拥有10%的圆角

      取值范围[0~1],0代表正方形,1代表正圆。

    • crossfade = 0 展示src图片

      0=src,1=altsrc

  • end中的最终自定义属性

    • roundPercent = 1 正圆
    • crossfade = 1 展示altsrc图片

详情参见ImageFilterView

image

Summary

探索MotionLayout的Part1到此结束,本文主要介绍了一下MotionLayout是啥?啥时候用它?基础用法....

探索MotionLayout的Part2预计会实现一些更加复杂的效果。

关于本文顶部的效果参见MotionScene文件

Reference

原文链接:http://www.itzhouyang.com/post/explore_motion_layout_part1.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269