目錄
Android之MotionLayout(一),MotionLayout的基本使用
Android之MotionLayout(二),MotionScene的標簽屬性說明
Android之MotionLayout(三),用 MotionLayout 來做過渡動畫,如何使用ConstraintSet
Android之MotionLayout(四),用 MotionLayout實現(xiàn)向上拉的折疊效果
Android之MotionLayout(五),如何使用 MotionLayout的自定義屬性
Android之MotionLayout(六),如果使用Keyframes實現(xiàn)實現(xiàn)YouTube切換效果
上一章中我們簡單創(chuàng)建了一個使用了MotionLayout,而這一遍是對MotionScene的屬性標簽的一些說明
MotionScene的子元素屬性標簽
<?xml version="1.0" encoding="utf-8"?>
<MotionScene xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<Transition
app:constraintSetStart="@layout/activity_main_scene1"
app:constraintSetEnd="@layout/activity_main_scene2"
app:duration="1000">
<OnClick
app:clickAction="toggle"
app:targetId="@id/image" />
</Transition>
</MotionScene>
-
<Transition> 包含運動的基本定義。
- motion:constraintSetStart 和 motion:constraintSetEnd 指的是運動的端點。這些端點在 MotionScene 后面的 <ConstraintSet> 元素中定義。
- motion:duration 指定完成運動所需的毫秒數(shù)
<OnClick> 點擊觸發(fā)運動
-
<OnSwipe> 拖拽來控制運動。
motion:touchAnchorId 可以滑動并拖動的視圖。
motion:touchAnchorSide 表示我們從右側(cè)拖動視圖。
motion:dragDirection 表示拖動的進度方向。例如,motion:dragDirection="dragRight" 表示當(dāng)您向右拖動時,進度會增加。
<ConstraintSet>
<Transition>
-
app:targetId:【id 值】設(shè)置用來觸發(fā)過渡的那個 View 的 Id(例如:@id/image 或 @+id/image)。
提示:app:targetId 的值的前綴既可以是 @+id/ 也可以是 @id/,兩者都可以。官方示例中使用的是 @+id/。不過,使用 @id/ 前綴似乎更加符合語義,因為 @+id/ 前綴在布局中常用來創(chuàng)建一個新的 Id,而 @id/ 前綴則常用來引用其他的 Id 值。為了突出這里引用的是其他的 Id 而不是新建了一個 Id,使用 @id/ 前綴要更加符合語義。
-
app:clickAction:設(shè)置點擊時執(zhí)行的動作。該屬性共有以下 5 個可選的值:
toggle:在 Start 場景和 End 場景之間循環(huán)的切換。
transitionToEnd:過渡到 End 場景。
transitionToStart:過渡到 Start 場景。
jumpToEnd:跳到 End 場景(不執(zhí)行過渡動畫)。
jumpToStart:跳到 Start 場景(不執(zhí)行過渡動畫)。
<OnSwipe>
-
app:touchAnchorId:【id 值】設(shè)置拖動操作要關(guān)聯(lián)到的對象,讓觸摸操作看起來像是在拖動這個對象的由 app:touchAnchorSide 屬性指定的那個邊。 -
app:touchAnchorSide:設(shè)置觸摸操作將會拖動對象的哪一邊,共有以下 4 個可選值:
top
left
right
bottom
-
app:dragDirection:設(shè)置拖動的方向(注意,只有設(shè)置了 app:touchAnchorId 屬性后該屬性才有效)。共有以下 4 個可選值:
dragUp:手指從下往上拖動(↑)。
dragDown:手指從上往下拖動(↓)。
dragLeft:手指從右往左拖動(←)。
dragRight:手指從左往右拖動(→)。
-
app:maxVelocity:【浮點值】設(shè)置動畫在拖動時的最大速度(單位:像素每秒 px/s)。 -
app:maxAcceleration:【浮點值】設(shè)置動畫在拖動時的最大加速度(單位:像素每二次方秒 px/s^2)。
注意:可以同時設(shè)置 <OnClick> 與 <OnSwipe> ,或者都不設(shè)置,而是使用代碼來觸發(fā)過渡。
還可以在 <Transition> 元素中設(shè)置多個 <OnClick>,每個 <OnClick> 都可以關(guān)聯(lián)到一個不同的控件上。雖然 <Transition> 元素中也可以設(shè)置多個 <OnSwipe>,但是后面的 <OnSwipe> 會替換掉前面的 <OnSwipe>,最終使用的是最后一個 <OnSwipe>。
<ConstraintSet>
子元素定義一個場景約束集,并在 <ConstraintSet> 元素中使用 <Constraint> 元素定義單個 View 的屬性約束。
-
android:id:設(shè)置當(dāng)前約束集的 id。這個 id 值可被 <Transition> 元素的 app:constraintSetStart 或者 app:constraintSetEnd 引用。
<Constraint> 元素屬性說明:
android:id:當(dāng)前約束關(guān)聯(lián)到的那個 View 的 id。
app:transitionEasing:定義動畫到此點時使用的緩動曲線,該值可以是一個字符串(例如 "curve(1.0,0,0,1.0)")還可以是以下幾個枚舉值之一:
standard:標準
accelerate:加速
decelerate:減速
linear:線性
app:transitionPathRotate:【浮點值】相對于所采用的路徑旋轉(zhuǎn)對象(弧形路徑/關(guān)鍵幀 相關(guān))。
app:drawPath:繪制過渡動畫路徑(調(diào)試用,關(guān)鍵幀相關(guān))??梢允且韵聨讉€枚舉值之一:
none
path
pathRelative
deltaRelative
asConfigured
rectangles
app:progress:【浮點值】在關(guān)聯(lián)的 View 上調(diào)用 setProgress(float) 方法(用于與嵌套的 ConstraintLayout 交互)
<Constraint> 元素用來定義單個 View 的屬性約束
<Constraint> 元素用來定義單個 View 的屬性約束,它支持對 View 的所有 ConstraintLayout 屬性定義約束,以及對 View 的下面這些標準屬性定義約束:
android:visibility
android:alpha
android:elevation
android:rotation
android:rotationX
android:rotationY
android:scaleX
android:scaleY
android:translationX
android:translationY
android:translationZ
當(dāng) View 的標準屬性或者 ConstraintLayout 屬性發(fā)生改變時,MotionLayout 會自動應(yīng)用過渡動畫,下一節(jié)我們會講一下如果使用ConstraintSet來做一個過渡動畫