├── .gitignore ├── .idea ├── codeStyles │ └── Project.xml ├── gradle.xml ├── misc.xml ├── runConfigurations.xml ├── sonarlint │ └── issuestore │ │ ├── 5 │ │ └── 8 │ │ │ └── 5833a9704a6eb8f84e89d7ef5dbc33426702659e │ │ ├── 6 │ │ └── d │ │ │ └── 6d827b2a70043bdb1b5827d5e1a3650cc9245d4d │ │ ├── 7 │ │ └── 3 │ │ │ └── 7362b3bc0790e40e6e488d060940d8f92ae0625a │ │ ├── d │ │ └── c │ │ │ └── dcb970ace3d8ad9dddc41aae71551a4a30158a30 │ │ ├── f │ │ ├── 4 │ │ │ └── f4a01d6a4fcb971362ec00a83903fd3902f52164 │ │ └── e │ │ │ └── fea37ce5456968d3c03ca26ec49bfc46bc3eda18 │ │ └── index.pb └── vcs.xml ├── README.md ├── app ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── example │ │ └── motionlayoutexample │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── example │ │ │ └── motionlayoutexample │ │ │ ├── MainActivity.kt │ │ │ └── adapters │ │ │ └── DummyRecyclerAdapter.kt │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ ├── ic_arrow_back_24.xml │ │ ├── ic_baseline_favorite_24.xml │ │ ├── ic_baseline_menu_24.xml │ │ ├── ic_launcher_background.xml │ │ └── ic_test.jpeg │ │ ├── layout │ │ ├── dummy_list_item.xml │ │ └── sample_collapsing_animation.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── navigation │ │ └── nav_graph.xml │ │ ├── values │ │ ├── attrs.xml │ │ ├── colors.xml │ │ ├── material_design_colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ │ └── xml │ │ └── sample_collapsing_animation_scene.xml │ └── test │ └── java │ └── com │ └── example │ └── motionlayoutexample │ └── ExampleUnitTest.kt ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | /.idea/navEditor.xml 9 | /.idea/assetWizardSettings.xml 10 | .DS_Store 11 | /build 12 | /captures 13 | .externalNativeBuild 14 | .cxx 15 | 16 | # Project exclude paths 17 | /app/build/ 18 | /app/build/intermediates/javac/debug/classes/ -------------------------------------------------------------------------------- /.idea/codeStyles/Project.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 |
7 | 8 | 9 | 10 | xmlns:android 11 | 12 | ^$ 13 | 14 | 15 | 16 |
17 |
18 | 19 | 20 | 21 | xmlns:.* 22 | 23 | ^$ 24 | 25 | 26 | BY_NAME 27 | 28 |
29 |
30 | 31 | 32 | 33 | .*:id 34 | 35 | http://schemas.android.com/apk/res/android 36 | 37 | 38 | 39 |
40 |
41 | 42 | 43 | 44 | .*:name 45 | 46 | http://schemas.android.com/apk/res/android 47 | 48 | 49 | 50 |
51 |
52 | 53 | 54 | 55 | name 56 | 57 | ^$ 58 | 59 | 60 | 61 |
62 |
63 | 64 | 65 | 66 | style 67 | 68 | ^$ 69 | 70 | 71 | 72 |
73 |
74 | 75 | 76 | 77 | .* 78 | 79 | ^$ 80 | 81 | 82 | BY_NAME 83 | 84 |
85 |
86 | 87 | 88 | 89 | .* 90 | 91 | http://schemas.android.com/apk/res/android 92 | 93 | 94 | ANDROID_ATTRIBUTE_ORDER 95 | 96 |
97 |
98 | 99 | 100 | 101 | .* 102 | 103 | .* 104 | 105 | 106 | BY_NAME 107 | 108 |
109 |
110 |
111 |
112 |
113 |
-------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 20 | 21 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/5/8/5833a9704a6eb8f84e89d7ef5dbc33426702659e: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gilgoldzweig/MotionLayoutExample/09ba8a0e1b9540a86fbe6aaaa086ca4434039a46/.idea/sonarlint/issuestore/5/8/5833a9704a6eb8f84e89d7ef5dbc33426702659e -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/6/d/6d827b2a70043bdb1b5827d5e1a3650cc9245d4d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gilgoldzweig/MotionLayoutExample/09ba8a0e1b9540a86fbe6aaaa086ca4434039a46/.idea/sonarlint/issuestore/6/d/6d827b2a70043bdb1b5827d5e1a3650cc9245d4d -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/7/3/7362b3bc0790e40e6e488d060940d8f92ae0625a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gilgoldzweig/MotionLayoutExample/09ba8a0e1b9540a86fbe6aaaa086ca4434039a46/.idea/sonarlint/issuestore/7/3/7362b3bc0790e40e6e488d060940d8f92ae0625a -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/d/c/dcb970ace3d8ad9dddc41aae71551a4a30158a30: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gilgoldzweig/MotionLayoutExample/09ba8a0e1b9540a86fbe6aaaa086ca4434039a46/.idea/sonarlint/issuestore/d/c/dcb970ace3d8ad9dddc41aae71551a4a30158a30 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/f/4/f4a01d6a4fcb971362ec00a83903fd3902f52164: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gilgoldzweig/MotionLayoutExample/09ba8a0e1b9540a86fbe6aaaa086ca4434039a46/.idea/sonarlint/issuestore/f/4/f4a01d6a4fcb971362ec00a83903fd3902f52164 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/f/e/fea37ce5456968d3c03ca26ec49bfc46bc3eda18: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gilgoldzweig/MotionLayoutExample/09ba8a0e1b9540a86fbe6aaaa086ca4434039a46/.idea/sonarlint/issuestore/f/e/fea37ce5456968d3c03ca26ec49bfc46bc3eda18 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/index.pb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gilgoldzweig/MotionLayoutExample/09ba8a0e1b9540a86fbe6aaaa086ca4434039a46/.idea/sonarlint/issuestore/index.pb -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MotionLayoutExample 2 | 3 | ![androidweekly396](https://androidweekly.net/issues/issue-396/badge) 4 | 5 | 6 | This project is an implementation of [How to perfect android animations using MotionLayout](https://medium.com/@gilgoldzweig/how-to-perfect-android-animations-using-motionlayout-286cfa0f4f13) 7 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | apply plugin: 'kotlin-android' 3 | apply plugin: 'kotlin-android-extensions' 4 | 5 | android { 6 | compileSdkVersion 29 7 | buildToolsVersion "29.0.2" 8 | 9 | defaultConfig { 10 | applicationId "com.example.motionlayoutexample" 11 | minSdkVersion 21 12 | targetSdkVersion 29 13 | versionCode 1 14 | versionName "1.0" 15 | 16 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 17 | } 18 | 19 | buildTypes { 20 | release { 21 | minifyEnabled false 22 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 23 | } 24 | } 25 | 26 | } 27 | 28 | dependencies { 29 | implementation fileTree(dir: 'libs', include: ['*.jar']) 30 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 31 | implementation 'androidx.appcompat:appcompat:1.1.0' 32 | implementation 'androidx.core:core-ktx:1.1.0' 33 | implementation 'androidx.recyclerview:recyclerview:1.1.0-rc01' 34 | implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta3' 35 | implementation 'androidx.navigation:navigation-fragment-ktx:2.1.0' 36 | implementation 'androidx.fragment:fragment:1.2.0-rc02' 37 | implementation 'androidx.navigation:navigation-ui-ktx:2.1.0' 38 | testImplementation 'junit:junit:4.12' 39 | androidTestImplementation 'androidx.test.ext:junit:1.1.1' 40 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' 41 | } 42 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/example/motionlayoutexample/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package com.example.motionlayoutexample 2 | 3 | import androidx.test.platform.app.InstrumentationRegistry 4 | import androidx.test.ext.junit.runners.AndroidJUnit4 5 | 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | import org.junit.Assert.* 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * See [testing documentation](http://d.android.com/tools/testing). 15 | */ 16 | @RunWith(AndroidJUnit4::class) 17 | class ExampleInstrumentedTest { 18 | @Test 19 | fun useAppContext() { 20 | // Context of the app under test. 21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 22 | assertEquals("com.example.motionlayoutexample", appContext.packageName) 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/motionlayoutexample/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.example.motionlayoutexample 2 | 3 | import androidx.appcompat.app.AppCompatActivity 4 | import android.os.Bundle 5 | import com.example.motionlayoutexample.adapters.DummyRecyclerAdapter 6 | import kotlinx.android.synthetic.main.sample_collapsing_animation.* 7 | 8 | class MainActivity : AppCompatActivity() { 9 | 10 | val adapter = DummyRecyclerAdapter() 11 | 12 | override fun onCreate(savedInstanceState: Bundle?) { 13 | super.onCreate(savedInstanceState) 14 | setContentView(R.layout.sample_collapsing_animation) 15 | scrollable_content.adapter = adapter 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/motionlayoutexample/adapters/DummyRecyclerAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.example.motionlayoutexample.adapters 2 | 3 | import android.view.LayoutInflater 4 | import android.view.ViewGroup 5 | import androidx.constraintlayout.widget.ConstraintLayout 6 | import androidx.recyclerview.widget.RecyclerView 7 | import com.example.motionlayoutexample.R 8 | 9 | class DummyRecyclerAdapter : RecyclerView.Adapter() { 10 | 11 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DummyRecyclerAdapter.ViewHolder { 12 | return ViewHolder(LayoutInflater.from(parent.context) 13 | .inflate(R.layout.dummy_list_item, parent, false) as ConstraintLayout) 14 | } 15 | 16 | override fun getItemCount(): Int { 17 | return 100 18 | } 19 | 20 | override fun onBindViewHolder(holder: DummyRecyclerAdapter.ViewHolder, position: Int) = Unit 21 | 22 | class ViewHolder(val layout: ConstraintLayout) : RecyclerView.ViewHolder(layout) 23 | 24 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 15 | 18 | 21 | 22 | 23 | 24 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_arrow_back_24.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_favorite_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_menu_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_test.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gilgoldzweig/MotionLayoutExample/09ba8a0e1b9540a86fbe6aaaa086ca4434039a46/app/src/main/res/drawable/ic_test.jpeg -------------------------------------------------------------------------------- /app/src/main/res/layout/dummy_list_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/layout/sample_collapsing_animation.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 17 | 18 | 27 | 28 | 40 | 41 | 50 | 51 | 63 | 64 | 70 | 71 | 72 | 82 | 83 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gilgoldzweig/MotionLayoutExample/09ba8a0e1b9540a86fbe6aaaa086ca4434039a46/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gilgoldzweig/MotionLayoutExample/09ba8a0e1b9540a86fbe6aaaa086ca4434039a46/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gilgoldzweig/MotionLayoutExample/09ba8a0e1b9540a86fbe6aaaa086ca4434039a46/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gilgoldzweig/MotionLayoutExample/09ba8a0e1b9540a86fbe6aaaa086ca4434039a46/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gilgoldzweig/MotionLayoutExample/09ba8a0e1b9540a86fbe6aaaa086ca4434039a46/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gilgoldzweig/MotionLayoutExample/09ba8a0e1b9540a86fbe6aaaa086ca4434039a46/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gilgoldzweig/MotionLayoutExample/09ba8a0e1b9540a86fbe6aaaa086ca4434039a46/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gilgoldzweig/MotionLayoutExample/09ba8a0e1b9540a86fbe6aaaa086ca4434039a46/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gilgoldzweig/MotionLayoutExample/09ba8a0e1b9540a86fbe6aaaa086ca4434039a46/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gilgoldzweig/MotionLayoutExample/09ba8a0e1b9540a86fbe6aaaa086ca4434039a46/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/navigation/nav_graph.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/values/attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4dp 4 | 5 | 48dp 6 | 24dp 7 | 16dp 8 | 8dp 9 | 4dp 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #6200EE 4 | #3700B3 5 | #03DAC5 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/values/material_design_colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | #FFEBEE 9 | #FFCDD2 10 | #EF9A9A 11 | #E57373 12 | #EF5350 13 | #F44336 14 | #E53935 15 | #D32F2F 16 | #C62828 17 | #B71C1C 18 | #FF8A80 19 | #FF5252 20 | #FF1744 21 | #D50000 22 | 23 | 24 | #FCE4EC 25 | #F8BBD0 26 | #F48FB1 27 | #F06292 28 | #EC407A 29 | #E91E63 30 | #D81B60 31 | #C2185B 32 | #AD1457 33 | #880E4F 34 | #FF80AB 35 | #FF4081 36 | #F50057 37 | #C51162 38 | 39 | 40 | #F3E5F5 41 | #E1BEE7 42 | #CE93D8 43 | #BA68C8 44 | #AB47BC 45 | #9C27B0 46 | #8E24AA 47 | #7B1FA2 48 | #6A1B9A 49 | #4A148C 50 | #EA80FC 51 | #E040FB 52 | #D500F9 53 | #AA00FF 54 | 55 | 56 | #EDE7F6 57 | #D1C4E9 58 | #B39DDB 59 | #9575CD 60 | #7E57C2 61 | #673AB7 62 | #5E35B1 63 | #512DA8 64 | #4527A0 65 | #311B92 66 | #B388FF 67 | #7C4DFF 68 | #651FFF 69 | #6200EA 70 | 71 | 72 | #E8EAF6 73 | #C5CAE9 74 | #9FA8DA 75 | #7986CB 76 | #5C6BC0 77 | #3F51B5 78 | #3949AB 79 | #303F9F 80 | #283593 81 | #1A237E 82 | #8C9EFF 83 | #536DFE 84 | #3D5AFE 85 | #304FFE 86 | 87 | 88 | #E3F2FD 89 | #BBDEFB 90 | #90CAF9 91 | #64B5F6 92 | #42A5F5 93 | #2196F3 94 | #1E88E5 95 | #1976D2 96 | #1565C0 97 | #0D47A1 98 | #82B1FF 99 | #448AFF 100 | #2979FF 101 | #2962FF 102 | 103 | 104 | #E1F5FE 105 | #B3E5FC 106 | #81D4fA 107 | #4fC3F7 108 | #29B6FC 109 | #03A9F4 110 | #039BE5 111 | #0288D1 112 | #0277BD 113 | #01579B 114 | #80D8FF 115 | #40C4FF 116 | #00B0FF 117 | #0091EA 118 | 119 | 120 | #E0F7FA 121 | #B2EBF2 122 | #80DEEA 123 | #4DD0E1 124 | #26C6DA 125 | #00BCD4 126 | #00ACC1 127 | #0097A7 128 | #00838F 129 | #006064 130 | #84FFFF 131 | #18FFFF 132 | #00E5FF 133 | #00B8D4 134 | 135 | 136 | #E0F2F1 137 | #B2DFDB 138 | #80CBC4 139 | #4DB6AC 140 | #26A69A 141 | #009688 142 | #00897B 143 | #00796B 144 | #00695C 145 | #004D40 146 | #A7FFEB 147 | #64FFDA 148 | #1DE9B6 149 | #00BFA5 150 | 151 | 152 | #E8F5E9 153 | #C8E6C9 154 | #A5D6A7 155 | #81C784 156 | #66BB6A 157 | #4CAF50 158 | #43A047 159 | #388E3C 160 | #2E7D32 161 | #1B5E20 162 | #B9F6CA 163 | #69F0AE 164 | #00E676 165 | #00C853 166 | 167 | 168 | #F1F8E9 169 | #DCEDC8 170 | #C5E1A5 171 | #AED581 172 | #9CCC65 173 | #8BC34A 174 | #7CB342 175 | #689F38 176 | #558B2F 177 | #33691E 178 | #CCFF90 179 | #B2FF59 180 | #76FF03 181 | #64DD17 182 | 183 | 184 | #F9FBE7 185 | #F0F4C3 186 | #E6EE9C 187 | #DCE775 188 | #D4E157 189 | #CDDC39 190 | #C0CA33 191 | #A4B42B 192 | #9E9D24 193 | #827717 194 | #F4FF81 195 | #EEFF41 196 | #C6FF00 197 | #AEEA00 198 | 199 | 200 | #FFFDE7 201 | #FFF9C4 202 | #FFF590 203 | #FFF176 204 | #FFEE58 205 | #FFEB3B 206 | #FDD835 207 | #FBC02D 208 | #F9A825 209 | #F57F17 210 | #FFFF82 211 | #FFFF00 212 | #FFEA00 213 | #FFD600 214 | 215 | 216 | #FFF8E1 217 | #FFECB3 218 | #FFE082 219 | #FFD54F 220 | #FFCA28 221 | #FFC107 222 | #FFB300 223 | #FFA000 224 | #FF8F00 225 | #FF6F00 226 | #FFE57F 227 | #FFD740 228 | #FFC400 229 | #FFAB00 230 | 231 | 232 | #FFF3E0 233 | #FFE0B2 234 | #FFCC80 235 | #FFB74D 236 | #FFA726 237 | #FF9800 238 | #FB8C00 239 | #F57C00 240 | #EF6C00 241 | #E65100 242 | #FFD180 243 | #FFAB40 244 | #FF9100 245 | #FF6D00 246 | 247 | 248 | #FBE9A7 249 | #FFCCBC 250 | #FFAB91 251 | #FF8A65 252 | #FF7043 253 | #FF5722 254 | #F4511E 255 | #E64A19 256 | #D84315 257 | #BF360C 258 | #FF9E80 259 | #FF6E40 260 | #FF3D00 261 | #DD2600 262 | 263 | 264 | #EFEBE9 265 | #D7CCC8 266 | #BCAAA4 267 | #A1887F 268 | #8D6E63 269 | #795548 270 | #6D4C41 271 | #5D4037 272 | #4E342E 273 | #3E2723 274 | 275 | 276 | #FAFAFA 277 | #F5F5F5 278 | #EEEEEE 279 | #E0E0E0 280 | #BDBDBD 281 | #9E9E9E 282 | #757575 283 | #616161 284 | #424242 285 | #212121 286 | #000000 287 | #ffffff 288 | 289 | 290 | #ECEFF1 291 | #CFD8DC 292 | #B0BBC5 293 | #90A4AE 294 | #78909C 295 | #607D8B 296 | #546E7A 297 | #455A64 298 | #37474F 299 | #263238 300 | 301 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | MotionLayoutExample 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/xml/sample_collapsing_animation_scene.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 9 | 16 | 17 | 18 | 19 | 29 | 30 | 38 | 39 | 40 | 43 | 44 | 45 | 46 | 49 | 50 | 51 | 52 | 53 | 64 | 65 | 72 | 73 | 78 | 79 | 80 | 83 | 84 | 85 | 86 | 89 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /app/src/test/java/com/example/motionlayoutexample/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | package com.example.motionlayoutexample 2 | 3 | import org.junit.Test 4 | 5 | import org.junit.Assert.* 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * See [testing documentation](http://d.android.com/tools/testing). 11 | */ 12 | class ExampleUnitTest { 13 | @Test 14 | fun addition_isCorrect() { 15 | assertEquals(4, 2 + 2) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | ext.kotlin_version = '1.3.60-eap-25' 5 | repositories { 6 | google() 7 | jcenter() 8 | maven { url 'https://dl.bintray.com/kotlin/kotlin-eap' } 9 | } 10 | dependencies { 11 | classpath 'com.android.tools.build:gradle:4.0.0-alpha04' 12 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 13 | 14 | // NOTE: Do not place your application dependencies here; they belong 15 | // in the individual module build.gradle files 16 | } 17 | } 18 | 19 | allprojects { 20 | repositories { 21 | google() 22 | jcenter() 23 | maven { url 'https://dl.bintray.com/kotlin/kotlin-eap' } 24 | } 25 | } 26 | 27 | task clean(type: Delete) { 28 | delete rootProject.buildDir 29 | } 30 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | # IDE (e.g. Android Studio) users: 3 | # Gradle settings configured through the IDE *will override* 4 | # any settings specified in this file. 5 | # For more details on how to configure your build environment visit 6 | # http://www.gradle.org/docs/current/userguide/build_environment.html 7 | # Specifies the JVM arguments used for the daemon process. 8 | # The setting is particularly useful for tweaking memory settings. 9 | org.gradle.jvmargs=-Xmx1536m 10 | # When configured, Gradle will run in incubating parallel mode. 11 | # This option should only be used with decoupled projects. More details, visit 12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 13 | # org.gradle.parallel=true 14 | # AndroidX package structure to make it clearer which packages are bundled with the 15 | # Android operating system, and which are packaged with your app's APK 16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn 17 | android.useAndroidX=true 18 | # Automatically convert third-party libraries to use AndroidX 19 | android.enableJetifier=true 20 | # Kotlin code style for this project: "official" or "obsolete": 21 | kotlin.code.style=official 22 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gilgoldzweig/MotionLayoutExample/09ba8a0e1b9540a86fbe6aaaa086ca4434039a46/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Nov 22 12:19:19 IST 2019 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.0-rc-1-all.zip 7 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Attempt to set APP_HOME 10 | # Resolve links: $0 may be a link 11 | PRG="$0" 12 | # Need this for relative symlinks. 13 | while [ -h "$PRG" ] ; do 14 | ls=`ls -ld "$PRG"` 15 | link=`expr "$ls" : '.*-> \(.*\)$'` 16 | if expr "$link" : '/.*' > /dev/null; then 17 | PRG="$link" 18 | else 19 | PRG=`dirname "$PRG"`"/$link" 20 | fi 21 | done 22 | SAVED="`pwd`" 23 | cd "`dirname \"$PRG\"`/" >/dev/null 24 | APP_HOME="`pwd -P`" 25 | cd "$SAVED" >/dev/null 26 | 27 | APP_NAME="Gradle" 28 | APP_BASE_NAME=`basename "$0"` 29 | 30 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 31 | DEFAULT_JVM_OPTS="" 32 | 33 | # Use the maximum available, or set MAX_FD != -1 to use that value. 34 | MAX_FD="maximum" 35 | 36 | warn () { 37 | echo "$*" 38 | } 39 | 40 | die () { 41 | echo 42 | echo "$*" 43 | echo 44 | exit 1 45 | } 46 | 47 | # OS specific support (must be 'true' or 'false'). 48 | cygwin=false 49 | msys=false 50 | darwin=false 51 | nonstop=false 52 | case "`uname`" in 53 | CYGWIN* ) 54 | cygwin=true 55 | ;; 56 | Darwin* ) 57 | darwin=true 58 | ;; 59 | MINGW* ) 60 | msys=true 61 | ;; 62 | NONSTOP* ) 63 | nonstop=true 64 | ;; 65 | esac 66 | 67 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 68 | 69 | # Determine the Java command to use to start the JVM. 70 | if [ -n "$JAVA_HOME" ] ; then 71 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 72 | # IBM's JDK on AIX uses strange locations for the executables 73 | JAVACMD="$JAVA_HOME/jre/sh/java" 74 | else 75 | JAVACMD="$JAVA_HOME/bin/java" 76 | fi 77 | if [ ! -x "$JAVACMD" ] ; then 78 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 79 | 80 | Please set the JAVA_HOME variable in your environment to match the 81 | location of your Java installation." 82 | fi 83 | else 84 | JAVACMD="java" 85 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 86 | 87 | Please set the JAVA_HOME variable in your environment to match the 88 | location of your Java installation." 89 | fi 90 | 91 | # Increase the maximum file descriptors if we can. 92 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 93 | MAX_FD_LIMIT=`ulimit -H -n` 94 | if [ $? -eq 0 ] ; then 95 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 96 | MAX_FD="$MAX_FD_LIMIT" 97 | fi 98 | ulimit -n $MAX_FD 99 | if [ $? -ne 0 ] ; then 100 | warn "Could not set maximum file descriptor limit: $MAX_FD" 101 | fi 102 | else 103 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 104 | fi 105 | fi 106 | 107 | # For Darwin, add options to specify how the application appears in the dock 108 | if $darwin; then 109 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 110 | fi 111 | 112 | # For Cygwin, switch paths to Windows format before running java 113 | if $cygwin ; then 114 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 115 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 116 | JAVACMD=`cygpath --unix "$JAVACMD"` 117 | 118 | # We build the pattern for arguments to be converted via cygpath 119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 120 | SEP="" 121 | for dir in $ROOTDIRSRAW ; do 122 | ROOTDIRS="$ROOTDIRS$SEP$dir" 123 | SEP="|" 124 | done 125 | OURCYGPATTERN="(^($ROOTDIRS))" 126 | # Add a user-defined pattern to the cygpath arguments 127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 129 | fi 130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 131 | i=0 132 | for arg in "$@" ; do 133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 135 | 136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 138 | else 139 | eval `echo args$i`="\"$arg\"" 140 | fi 141 | i=$((i+1)) 142 | done 143 | case $i in 144 | (0) set -- ;; 145 | (1) set -- "$args0" ;; 146 | (2) set -- "$args0" "$args1" ;; 147 | (3) set -- "$args0" "$args1" "$args2" ;; 148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 154 | esac 155 | fi 156 | 157 | # Escape application args 158 | save () { 159 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 160 | echo " " 161 | } 162 | APP_ARGS=$(save "$@") 163 | 164 | # Collect all arguments for the java command, following the shell quoting and substitution rules 165 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 166 | 167 | # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong 168 | if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then 169 | cd "$(dirname "$0")" 170 | fi 171 | 172 | exec "$JAVACMD" "$@" 173 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | set DIRNAME=%~dp0 12 | if "%DIRNAME%" == "" set DIRNAME=. 13 | set APP_BASE_NAME=%~n0 14 | set APP_HOME=%DIRNAME% 15 | 16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 17 | set DEFAULT_JVM_OPTS= 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windows variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | 53 | :win9xME_args 54 | @rem Slurp the command line arguments. 55 | set CMD_LINE_ARGS= 56 | set _SKIP=2 57 | 58 | :win9xME_args_slurp 59 | if "x%~1" == "x" goto execute 60 | 61 | set CMD_LINE_ARGS=%* 62 | 63 | :execute 64 | @rem Setup the command line 65 | 66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 67 | 68 | @rem Execute Gradle 69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 70 | 71 | :end 72 | @rem End local scope for the variables with windows NT shell 73 | if "%ERRORLEVEL%"=="0" goto mainEnd 74 | 75 | :fail 76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 77 | rem the _cmd.exe /c_ return code! 78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 79 | exit /b 1 80 | 81 | :mainEnd 82 | if "%OS%"=="Windows_NT" endlocal 83 | 84 | :omega 85 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name='MotionLayoutExample' 2 | include ':app' 3 | --------------------------------------------------------------------------------