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是用來幫助開發(fā)者管理運(yùn)動(dòng)和組件動(dòng)畫的

  • MotionLayout是ConstraintLayout的子類

  • MotionLayout是ConstraintLayout 2.0庫中提供的新類,也可作為支持庫使用牙捉,并且向后兼容到API 14始腾。

  • MotionLayout是為了彌合了布局過渡和復(fù)雜運(yùn)動(dòng)處理之間的鴻溝,在屬性動(dòng)畫框架,TransitionManager和CoordinatorLayout之間提供了多種功能唠叛。

  • MotionLayout是完全聲明式,我們可以用xml描述出任何復(fù)雜的效果

  • MotionLayout不支持嵌套子布局或者activity transition(如果您就有這樣的需求沮稚,那還是乖乖的用TransitionManager吧)

  • 最后艺沼,官方建議不要把MotionLayout僅僅當(dāng)做一個(gè)動(dòng)效庫來使用,它應(yīng)該用于幫助用戶了解您的應(yīng)用程序在做什么蕴掏,并表達(dá)品牌的個(gè)性和風(fēng)格障般。

    參見Understanding motion

When to use it?

當(dāng)我們學(xué)習(xí)一個(gè)新的東西的時(shí)候盛杰,“什么時(shí)候(情況下)使用它挽荡?”是一個(gè)很重要的問題。如果這個(gè)問題沒想清楚即供,可能會(huì)引發(fā)一些不良的效果定拟。

那么,什么時(shí)候去用MotionLayout呢逗嫡?

Use MotionLayout when animating UI elements the user will interact with

當(dāng)用戶需要與有動(dòng)效的UI元素交互時(shí)請(qǐng)使用MotionLayout

言外之意:

  1. 現(xiàn)有實(shí)現(xiàn)動(dòng)效的方式就可以簡單實(shí)現(xiàn)的就別折騰了办素,比如用以下方式
  1. 一些界面加載完就直接執(zhí)行的復(fù)雜動(dòng)畫,直接用Gif或者視頻搞定的也不需要
  2. 總結(jié)一下祸穷,別為了用MotionLayout而強(qiáng)行使用

Getting started

在開始使用MotionLayout之前我們需要準(zhǔn)備以下幾步性穿。

1. Android Studio 4.0

MotionLayout編輯器僅支持4.0之上版本

image

2. 導(dǎo)入依賴

在您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. 創(chuàng)建布局文件

創(chuàng)建完fragment_explore_motion_layout_part1.xml布局文件后需曾,在Design模式下,右鍵點(diǎn)擊布局或者Component Tree祈远,選擇菜單中的Convert to MotionLayout選項(xiàng)即可一步將布局轉(zhuǎn)換為MotionLayout呆万。

image

我們?cè)賮砜匆幌略摬季值膞ml代碼

image

為了使布局信息與運(yùn)動(dòng)描述分開,每個(gè)MotionLayout都會(huì)使用app:layoutDescription引用一個(gè)單獨(dú)的MotionScene文件车份,這個(gè)文件放在res/xml文件夾谋减。

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

image

4. MotionScene常見的標(biāo)簽及屬性

  • Transition標(biāo)簽是用來定義運(yùn)動(dòng)的具體細(xì)節(jié)的

    常用的如下

    • constraintSetStart 定義運(yùn)動(dòng)的初始狀態(tài)

      這可以是ConstraintSet的ID,也可以是布局扫沼。

      要指定ConstraintSet出爹,請(qǐng)將此屬性設(shè)置為@+id/constraintSetId庄吼。

      要指定布局,請(qǐng)?jiān)O(shè)置為@layout/layoutState严就。

    • constraintSetEnd 定義運(yùn)動(dòng)的最終狀態(tài)总寻,取值同constraintSetStart

    • duration 定義運(yùn)動(dòng)的持續(xù)時(shí)間,以毫秒為單位梢为,如不指定則使用默認(rèn)值400ms

      image
    • motionInterpolator 定義運(yùn)動(dòng)插補(bǔ)器

      • easeInOut 緩入緩出
      • easeIn 緩入
      • easeOut 緩出
      • linear 線性
      • bounce 彈跳效果
    • autoTransition 自動(dòng)過渡

      • none 不運(yùn)動(dòng)
      • jumpToStart 直接跳到開始
      • jumpToEnd 直接跳到結(jié)束
      • animateToStart 執(zhí)行動(dòng)畫到開始
      • animateToEnd 執(zhí)行動(dòng)畫到結(jié)束
  • OnSwipe 指定用戶在布局上滑動(dòng)時(shí)要執(zhí)行的操作渐行。

    • touchAnchorId 通過滑動(dòng)移動(dòng)的視圖的Id。
    • touchAnchorSide 用戶滑動(dòng)界面時(shí)MotionLayout將嘗試在touchAnchorId指定的視圖和用戶手指之間保持恒定的距離铸董。而此屬性指定的是手指和view的那一側(cè)保持恒定的距離祟印,可取值有以下幾個(gè):
      • left
      • right
      • top
      • bottom
    • dragDirection 用戶滑動(dòng)動(dòng)作的方向。如果設(shè)置了此屬性粟害,則此onSwipe僅適用于沿指定方向的滑動(dòng)旁理。可接受的值為
      • dragLeft 左滑
      • dragRight 右滑
      • dragUp 上滑
      • dragDown 下滑
  • OnClick 指定當(dāng)用戶點(diǎn)擊特定視圖時(shí)要執(zhí)行的操作我磁。單個(gè)Transition可以有多個(gè)OnClick節(jié)點(diǎn)孽文,每個(gè)OnClick指定一個(gè)不同的目標(biāo)視圖,并在點(diǎn)擊該視圖時(shí)執(zhí)行不同的操作夺艰。

    • targetId 當(dāng)用戶點(diǎn)擊targetId指定的view時(shí)將會(huì)執(zhí)行Transition

    • ClickAction 點(diǎn)擊視圖時(shí)執(zhí)行的操作芋哭。支持的值為:

      • toggle

        切換狀態(tài),如果當(dāng)前狀態(tài)是start的話郁副,執(zhí)行動(dòng)畫到end狀態(tài)减牺;若當(dāng)前狀態(tài)是end狀態(tài),則執(zhí)行動(dòng)畫到start狀態(tài)存谎。

      • transitionToStart 執(zhí)行動(dòng)畫到start狀態(tài)

      • transitionToEnd 執(zhí)行動(dòng)畫到end狀態(tài)

      • jumpToStart 直接跳轉(zhuǎn)到start狀態(tài)

      • jumpToEnd 直接跳轉(zhuǎn)到end狀態(tài)

  • KeyFrameSet

    指定運(yùn)動(dòng)序列過程中視圖的位置和屬性拔疚。默認(rèn)情況下,運(yùn)動(dòng)會(huì)從初始狀態(tài)進(jìn)行到結(jié)束狀態(tài)既荚。通過使用<KeyFrameSet>稚失,您可以構(gòu)建更復(fù)雜的動(dòng)作。 <KeyFrameSet>包含<KeyPosition>或<KeyAttribute>節(jié)點(diǎn)恰聘。這些節(jié)點(diǎn)中的每個(gè)節(jié)點(diǎn)都指定運(yùn)動(dòng)中特定點(diǎn)的目標(biāo)視圖的位置或?qū)傩浴?MotionLayout從起點(diǎn)到這些中間點(diǎn)中的每一個(gè)句各,再到最終目的地,使視圖平滑地動(dòng)畫化晴叨。

  • KeyPosition

    指定運(yùn)動(dòng)序列中特定時(shí)刻的視圖位置凿宾。此屬性用于調(diào)整運(yùn)動(dòng)的默認(rèn)路徑。

    • motionTarget

      要在運(yùn)動(dòng)過程中改變屬性的視圖的Id

    • framePosition

      指定視圖在運(yùn)動(dòng)序列中何時(shí)具有此<KeyAttribute>指定的屬性兼蕊。例如初厚,framePosition = 50則代表視圖運(yùn)動(dòng)到整個(gè)運(yùn)動(dòng)序列的50%處。

    • percentX percentY 指定視圖應(yīng)到達(dá)的位置孙技。這兩個(gè)屬性需要配合keyPositionType才能確定具體位置产禾。

    • keyPositionType

      指定如何解釋percentX和percentY值排作。

      • parentRelative

        percentX和percentY是相對(duì)于父視圖指定的。取值范圍 0~1下愈。

        image
      • deltaRelative

        相對(duì)于視圖在整個(gè)運(yùn)動(dòng)序列過程中移動(dòng)的距離纽绍,指定了percentX和percentY蕾久。 X為橫軸势似,Y為縱軸。在這兩種情況下僧著,0都是該軸視圖的起始位置履因,而1是最終位置。

        image

        Note:deltaRelative模式下盹愚,x栅迄,y坐標(biāo)范圍不是0~1。

        x<0 ----> 視圖會(huì)定位到y(tǒng)軸的左側(cè)皆怕。

        y<0 ----> 視圖會(huì)定位到x軸的下方毅舆。

        x=1.5 ---> 代表視圖定位到x軸方向start到end的橫向距離1.5倍的位置

        y=1.5 ---> 代表視圖定位到y(tǒng)軸方向start到end的垂直距離1.5倍的位置

        image
      • pathRelative

        X軸是目標(biāo)視圖在路徑范圍內(nèi)移動(dòng)的方向,0為開始位置愈腾,1為最終位置憋活。 Y軸垂直于X軸,正值位于路徑的右側(cè)虱黄,負(fù)值位于左側(cè)悦即;設(shè)置一個(gè)非零的Y百分比會(huì)導(dǎo)致視圖的路徑向X軸的左側(cè)或者右側(cè)偏轉(zhuǎn)形成弧線。因此橱乱,視圖的初始位置是(0,0)辜梳,最終位置是(1,0)。

        很多文章包括官網(wǎng)對(duì)y軸的取值都是寫的x軸的左側(cè)為正值泳叠,右側(cè)為負(fù)值作瞄,但我實(shí)際測(cè)試的結(jié)果卻是相反的。希望讀者都親自嘗試一下危纫。

        image
  • KeyAttribute

    指定運(yùn)動(dòng)序列中特定時(shí)刻的視圖屬性粉洼。您可以使用<KeyAttribute>設(shè)置視圖的任何標(biāo)準(zhǔn)屬性。

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

    為一個(gè)或多個(gè)<Transition>節(jié)點(diǎn)指定開始或結(jié)束狀態(tài)

關(guān)于更多的MotionScene標(biāo)簽以及它有哪些子標(biāo)簽可以查閱官方文檔MotionLayout reference

Basic motion

下面這個(gè)栗子包含一個(gè)正方形的View叶摄,可以水平滑動(dòng)属韧。

image

Layout XML

MotionLayout的motionDegbug屬性可以開啟調(diào)試模式

  • motionDegbug
    • SHOW_PATH 展示運(yùn)動(dòng)路徑
    • SHOW_PROGRESS 展示運(yùn)動(dòng)進(jìn)度
    • SHOW_ALL 展示PATH&PROGRESS
image

MotionScene XML

  • KeyPosition

    framePosition=50處向y軸方向偏移50%

  • KeyAttribute

    framePosition=50處改變視圖的如下屬性:

    • 整體縮放2倍
    • X軸旋轉(zhuǎn)-60°,y軸旋轉(zhuǎn)45°
    • 透明度變?yōu)?.3
image

Custom attribute

下面使用ImageFilterView來演示自定義屬性

image

Layout XML

image

MotionScene XML

Note:請(qǐng)注意蛤吓,指定自定義屬性時(shí)宵喂,自定義屬性必須在start和end的ConstraintSet元素中成對(duì)出現(xiàn),另外在運(yùn)動(dòng)過程中改變自定義屬性時(shí)会傲,也要保證前面的規(guī)則锅棕。

  • 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到此結(jié)束,本文主要介紹了一下MotionLayout是啥德绿?啥時(shí)候用它荷荤?基礎(chǔ)用法....

探索MotionLayout的Part2預(yù)計(jì)會(huì)實(shí)現(xiàn)一些更加復(fù)雜的效果。

關(guān)于本文頂部的效果參見MotionScene文件

Reference

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末移稳,一起剝皮案震驚了整個(gè)濱河市蕴纳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌个粱,老刑警劉巖古毛,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異都许,居然都是意外死亡稻薇,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門胶征,熙熙樓的掌柜王于貴愁眉苦臉地迎上來塞椎,“玉大人傲宜,你說我怎么就攤上這事榆综√惶洌” “怎么了念搬?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵读整,是天一觀的道長搭盾。 經(jīng)常有香客問我懊昨,道長爽蝴,這世上最難降的妖魔是什么急波? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任从铲,我火速辦了婚禮,結(jié)果婚禮上澄暮,老公的妹妹穿的比我還像新娘名段。我一直安慰自己,他們只是感情好泣懊,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布伸辟。 她就那樣靜靜地躺著,像睡著了一般馍刮。 火紅的嫁衣襯著肌膚如雪信夫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音静稻,去河邊找鬼警没。 笑死,一個(gè)胖子當(dāng)著我的面吹牛振湾,可吹牛的內(nèi)容都是我干的杀迹。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼押搪,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼树酪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起嵌言,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤嗅回,失蹤者是張志新(化名)和其女友劉穎及穗,沒想到半個(gè)月后摧茴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡埂陆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年苛白,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片焚虱。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡购裙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鹃栽,到底是詐尸還是另有隱情躏率,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布民鼓,位于F島的核電站薇芝,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏丰嘉。R本人自食惡果不足惜夯到,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望饮亏。 院中可真熱鬧耍贾,春花似錦、人聲如沸路幸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽简肴。三九已至晃听,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背杂伟。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工移层, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人赫粥。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓观话,卻偏偏與公主長得像,于是被迫代替她去往敵國和親越平。 傳聞我的和親對(duì)象是個(gè)殘疾皇子频蛔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345