diff --git a/.gitignore b/.gitignore
index 682cdc4..01d9632 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,3 +12,4 @@
/captures
.externalNativeBuild
.idea/
+/17_constraintlayout/images
\ No newline at end of file
diff --git a/17_constraintlayout/.gitignore b/17_constraintlayout/.gitignore
new file mode 100644
index 0000000..796b96d
--- /dev/null
+++ b/17_constraintlayout/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/17_constraintlayout/build.gradle b/17_constraintlayout/build.gradle
new file mode 100644
index 0000000..06b0431
--- /dev/null
+++ b/17_constraintlayout/build.gradle
@@ -0,0 +1,37 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+
+android {
+ compileSdkVersion 28
+
+
+ defaultConfig {
+ applicationId "com.hencoder.a19_constraintlayout"
+ minSdkVersion 18
+ targetSdkVersion 28
+ versionCode 1
+ versionName "1.0"
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+
+}
+
+dependencies {
+ implementation fileTree(dir: 'libs', include: ['*.jar'])
+ implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
+ implementation 'androidx.appcompat:appcompat:1.0.2'
+ implementation 'androidx.core:core-ktx:1.0.1'
+ implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha5'
+ testImplementation 'junit:junit:4.12'
+ androidTestImplementation 'androidx.test.ext:junit:1.1.0'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
+}
diff --git a/17_constraintlayout/proguard-rules.pro b/17_constraintlayout/proguard-rules.pro
new file mode 100644
index 0000000..f1b4245
--- /dev/null
+++ b/17_constraintlayout/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
diff --git a/17_constraintlayout/src/androidTest/java/com/hencoder/a19_constraintlayout/ExampleInstrumentedTest.kt b/17_constraintlayout/src/androidTest/java/com/hencoder/a19_constraintlayout/ExampleInstrumentedTest.kt
new file mode 100644
index 0000000..8c65672
--- /dev/null
+++ b/17_constraintlayout/src/androidTest/java/com/hencoder/a19_constraintlayout/ExampleInstrumentedTest.kt
@@ -0,0 +1,24 @@
+package com.hencoder.a19_constraintlayout
+
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.ext.junit.runners.AndroidJUnit4
+
+import org.junit.Test
+import org.junit.runner.RunWith
+
+import org.junit.Assert.*
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+@RunWith(AndroidJUnit4::class)
+class ExampleInstrumentedTest {
+ @Test
+ fun useAppContext() {
+ // Context of the app under test.
+ val appContext = InstrumentationRegistry.getInstrumentation().targetContext
+ assertEquals("com.hencoder.a19_constraintlayout", appContext.packageName)
+ }
+}
diff --git a/17_constraintlayout/src/main/AndroidManifest.xml b/17_constraintlayout/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..e92ef6b
--- /dev/null
+++ b/17_constraintlayout/src/main/AndroidManifest.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/17_constraintlayout/src/main/java/com/hencoder/a19_constraintlayout/CircularPositioning.kt b/17_constraintlayout/src/main/java/com/hencoder/a19_constraintlayout/CircularPositioning.kt
new file mode 100644
index 0000000..d1e0789
--- /dev/null
+++ b/17_constraintlayout/src/main/java/com/hencoder/a19_constraintlayout/CircularPositioning.kt
@@ -0,0 +1,49 @@
+package com.hencoder.a19_constraintlayout
+
+import android.animation.ValueAnimator
+import android.animation.ValueAnimator.INFINITE
+import androidx.appcompat.app.AppCompatActivity
+import android.os.Bundle
+import android.view.View
+import android.view.animation.LinearInterpolator
+import androidx.constraintlayout.widget.ConstraintLayout
+
+class CircularPositioning : AppCompatActivity() {
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_circular_positioning)
+
+ val earth = findViewById(R.id.earth)
+ val moon = findViewById(R.id.moon)
+ val sun = findViewById(R.id.sun)
+
+ val earthAnimator = ValueAnimator.ofFloat(0f, 1f).apply {
+ duration = 10000L
+ repeatCount = INFINITE
+ interpolator = LinearInterpolator()
+ }
+
+ val moonAnimator = ValueAnimator.ofFloat(0f, 1f).apply {
+ duration = 2000L
+ repeatCount = INFINITE
+ interpolator = LinearInterpolator()
+ }
+
+ earthAnimator.addUpdateListener {
+ val params = earth.layoutParams as ConstraintLayout.LayoutParams
+ params.circleAngle = 45 + it.animatedFraction * 360
+ moon.requestLayout()
+ }
+ moonAnimator.addUpdateListener {
+ val params = moon.layoutParams as ConstraintLayout.LayoutParams
+ params.circleAngle = 270 + it.animatedFraction * 360
+ moon.requestLayout()
+ }
+
+ sun.setOnClickListener {
+ earthAnimator.start()
+ moonAnimator.start()
+ }
+ }
+}
diff --git a/17_constraintlayout/src/main/java/com/hencoder/a19_constraintlayout/CircularReveal.kt b/17_constraintlayout/src/main/java/com/hencoder/a19_constraintlayout/CircularReveal.kt
new file mode 100644
index 0000000..3944642
--- /dev/null
+++ b/17_constraintlayout/src/main/java/com/hencoder/a19_constraintlayout/CircularReveal.kt
@@ -0,0 +1,12 @@
+package com.hencoder.a19_constraintlayout
+
+import androidx.appcompat.app.AppCompatActivity
+import android.os.Bundle
+
+class CircularReveal : AppCompatActivity() {
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_circular_reveal)
+ }
+}
diff --git a/17_constraintlayout/src/main/java/com/hencoder/a19_constraintlayout/CircularRevealHelper.kt b/17_constraintlayout/src/main/java/com/hencoder/a19_constraintlayout/CircularRevealHelper.kt
new file mode 100644
index 0000000..5cb0eac
--- /dev/null
+++ b/17_constraintlayout/src/main/java/com/hencoder/a19_constraintlayout/CircularRevealHelper.kt
@@ -0,0 +1,27 @@
+package com.hencoder.a19_constraintlayout
+
+import android.content.Context
+import android.os.Build
+import android.util.AttributeSet
+import android.view.View
+import android.view.ViewAnimationUtils
+import androidx.constraintlayout.widget.ConstraintHelper
+import androidx.constraintlayout.widget.ConstraintLayout
+
+class CircularRevealHelper(context: Context, attrs: AttributeSet) :
+ ConstraintHelper(context, attrs) {
+
+ override fun updatePostLayout(container: ConstraintLayout?) {
+ super.updatePostLayout(container)
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) return
+
+ for (referencedId in referencedIds) {
+ val view = container!!.getViewById(referencedId)
+ val radius = Math.hypot(view.width.toDouble(), view.height.toDouble()).toInt()
+
+ ViewAnimationUtils.createCircularReveal(view, 0, 0, 0f, radius.toFloat())
+ .setDuration(2000L)
+ .start()
+ }
+ }
+}
diff --git a/17_constraintlayout/src/main/java/com/hencoder/a19_constraintlayout/ConstraintLayoutSample.kt b/17_constraintlayout/src/main/java/com/hencoder/a19_constraintlayout/ConstraintLayoutSample.kt
new file mode 100644
index 0000000..13b4ed4
--- /dev/null
+++ b/17_constraintlayout/src/main/java/com/hencoder/a19_constraintlayout/ConstraintLayoutSample.kt
@@ -0,0 +1,12 @@
+package com.hencoder.a19_constraintlayout
+
+import androidx.appcompat.app.AppCompatActivity
+import android.os.Bundle
+
+class ConstraintLayoutSample : AppCompatActivity() {
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_constraint_layout_sample)
+ }
+}
diff --git a/17_constraintlayout/src/main/java/com/hencoder/a19_constraintlayout/ConstraintSetActivity.kt b/17_constraintlayout/src/main/java/com/hencoder/a19_constraintlayout/ConstraintSetActivity.kt
new file mode 100644
index 0000000..05eec6f
--- /dev/null
+++ b/17_constraintlayout/src/main/java/com/hencoder/a19_constraintlayout/ConstraintSetActivity.kt
@@ -0,0 +1,27 @@
+package com.hencoder.a19_constraintlayout
+
+import androidx.appcompat.app.AppCompatActivity
+import android.os.Bundle
+import android.transition.TransitionManager
+import android.view.View
+import androidx.constraintlayout.widget.ConstraintLayout
+import androidx.constraintlayout.widget.ConstraintSet
+
+class ConstraintSetActivity : AppCompatActivity() {
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_constraint_start)
+ }
+
+
+ fun onClick(view: View) {
+ val constraintLayout = view as ConstraintLayout
+ TransitionManager.beginDelayedTransition(constraintLayout)
+
+ val constraintSet = ConstraintSet().apply {
+ clone(this@ConstraintSetActivity, R.layout.activity_constraint_end)
+ }
+ constraintSet.applyTo(constraintLayout)
+ }
+}
diff --git a/17_constraintlayout/src/main/java/com/hencoder/a19_constraintlayout/DimensionRatio.kt b/17_constraintlayout/src/main/java/com/hencoder/a19_constraintlayout/DimensionRatio.kt
new file mode 100644
index 0000000..2b83b8e
--- /dev/null
+++ b/17_constraintlayout/src/main/java/com/hencoder/a19_constraintlayout/DimensionRatio.kt
@@ -0,0 +1,12 @@
+package com.hencoder.a19_constraintlayout
+
+import androidx.appcompat.app.AppCompatActivity
+import android.os.Bundle
+
+class DimensionRatio : AppCompatActivity() {
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_dimension_ratio)
+ }
+}
diff --git a/17_constraintlayout/src/main/java/com/hencoder/a19_constraintlayout/FlowActivity.kt b/17_constraintlayout/src/main/java/com/hencoder/a19_constraintlayout/FlowActivity.kt
new file mode 100644
index 0000000..53e7fd4
--- /dev/null
+++ b/17_constraintlayout/src/main/java/com/hencoder/a19_constraintlayout/FlowActivity.kt
@@ -0,0 +1,16 @@
+package com.hencoder.a19_constraintlayout
+
+import androidx.appcompat.app.AppCompatActivity
+import android.os.Bundle
+import android.view.View
+import androidx.constraintlayout.helper.widget.Flow
+import androidx.constraintlayout.helper.widget.Flow.VERTICAL
+import androidx.constraintlayout.helper.widget.Flow.WRAP_NONE
+
+class FlowActivity : AppCompatActivity() {
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_flow)
+ }
+}
diff --git a/17_constraintlayout/src/main/java/com/hencoder/a19_constraintlayout/GuideLineActivity.kt b/17_constraintlayout/src/main/java/com/hencoder/a19_constraintlayout/GuideLineActivity.kt
new file mode 100644
index 0000000..12b0452
--- /dev/null
+++ b/17_constraintlayout/src/main/java/com/hencoder/a19_constraintlayout/GuideLineActivity.kt
@@ -0,0 +1,12 @@
+package com.hencoder.a19_constraintlayout
+
+import androidx.appcompat.app.AppCompatActivity
+import android.os.Bundle
+
+class GuideLineActivity : AppCompatActivity() {
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_guide_line)
+ }
+}
diff --git a/17_constraintlayout/src/main/java/com/hencoder/a19_constraintlayout/Linear.kt b/17_constraintlayout/src/main/java/com/hencoder/a19_constraintlayout/Linear.kt
new file mode 100644
index 0000000..8d418fe
--- /dev/null
+++ b/17_constraintlayout/src/main/java/com/hencoder/a19_constraintlayout/Linear.kt
@@ -0,0 +1,35 @@
+package com.hencoder.a19_constraintlayout
+
+import android.content.Context
+import android.util.AttributeSet
+
+import androidx.constraintlayout.widget.ConstraintLayout
+import androidx.constraintlayout.widget.ConstraintSet
+import androidx.constraintlayout.widget.VirtualLayout
+
+
+class Linear(context: Context, attrs: AttributeSet) : VirtualLayout(context, attrs) {
+
+ private val constraintSet: ConstraintSet by lazy {
+ ConstraintSet().apply {
+ isForceId = false
+ }
+ }
+
+ override fun updatePreLayout(container: ConstraintLayout) {
+ super.updatePreLayout(container)
+ constraintSet.clone(container)
+
+ val viewIds = referencedIds
+ for (i in 1 until mCount) {
+
+ val current = viewIds[i]
+ val before = viewIds[i - 1]
+
+ constraintSet.connect(current, ConstraintSet.START, before, ConstraintSet.START)
+ constraintSet.connect(current, ConstraintSet.TOP, before, ConstraintSet.BOTTOM)
+
+ constraintSet.applyTo(container)
+ }
+ }
+}
diff --git a/17_constraintlayout/src/main/java/com/hencoder/a19_constraintlayout/LinearActivity.kt b/17_constraintlayout/src/main/java/com/hencoder/a19_constraintlayout/LinearActivity.kt
new file mode 100644
index 0000000..edd86e7
--- /dev/null
+++ b/17_constraintlayout/src/main/java/com/hencoder/a19_constraintlayout/LinearActivity.kt
@@ -0,0 +1,12 @@
+package com.hencoder.a19_constraintlayout
+
+import androidx.appcompat.app.AppCompatActivity
+import android.os.Bundle
+
+class LinearActivity : AppCompatActivity() {
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_linear)
+ }
+}
diff --git a/17_constraintlayout/src/main/java/com/hencoder/a19_constraintlayout/MainActivity.kt b/17_constraintlayout/src/main/java/com/hencoder/a19_constraintlayout/MainActivity.kt
new file mode 100644
index 0000000..5fd0c56
--- /dev/null
+++ b/17_constraintlayout/src/main/java/com/hencoder/a19_constraintlayout/MainActivity.kt
@@ -0,0 +1,49 @@
+package com.hencoder.a19_constraintlayout
+
+import android.content.Intent
+import androidx.appcompat.app.AppCompatActivity
+import android.os.Bundle
+import android.transition.TransitionManager
+import android.view.View
+import android.view.ViewGroup
+import android.widget.Button
+import androidx.constraintlayout.widget.ConstraintLayout
+import androidx.constraintlayout.widget.ConstraintSet
+import android.content.pm.ActivityInfo
+import android.content.pm.PackageManager
+import android.content.pm.PackageInfo
+import android.widget.LinearLayout
+import androidx.core.content.ContextCompat.startActivity
+
+
+class MainActivity : AppCompatActivity() {
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_main)
+
+ val linearLayout = findViewById(R.id.root)
+
+ packageManager.getPackageInfo(
+ packageName, PackageManager.GET_ACTIVITIES).activities.forEach { activity ->
+ if (activity.name == this::class.java.name) {
+ return@forEach
+ }
+
+ if (activity.name == ConstraintLayoutSample::class.java.name) {
+ return@forEach
+ }
+
+ val clazz = Class.forName(activity.name)
+
+ val button = Button(this).apply {
+ isAllCaps = false
+ text = clazz.simpleName
+ setOnClickListener {
+ startActivity(Intent(this@MainActivity, clazz))
+ }
+ }
+ linearLayout.addView(button)
+ }
+ }
+}
diff --git a/17_constraintlayout/src/main/java/com/hencoder/a19_constraintlayout/PlaceHolder.kt b/17_constraintlayout/src/main/java/com/hencoder/a19_constraintlayout/PlaceHolder.kt
new file mode 100644
index 0000000..2c68ac5
--- /dev/null
+++ b/17_constraintlayout/src/main/java/com/hencoder/a19_constraintlayout/PlaceHolder.kt
@@ -0,0 +1,23 @@
+package com.hencoder.a19_constraintlayout
+
+import androidx.appcompat.app.AppCompatActivity
+import android.os.Bundle
+import android.transition.TransitionManager
+import android.view.View
+import android.view.ViewGroup
+import androidx.constraintlayout.widget.Placeholder
+
+class PlaceHolder : AppCompatActivity() {
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_place_holder)
+ }
+
+ fun onClick(view: View) {
+
+ TransitionManager.beginDelayedTransition(view.parent as ViewGroup)
+
+ findViewById(R.id.placeholder).setContentId(view.id)
+ }
+}
diff --git a/17_constraintlayout/src/main/res/drawable-v24/ic_launcher_foreground.xml b/17_constraintlayout/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..ec20a5e
--- /dev/null
+++ b/17_constraintlayout/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/17_constraintlayout/src/main/res/drawable/earth.png b/17_constraintlayout/src/main/res/drawable/earth.png
new file mode 100644
index 0000000..200a5f5
Binary files /dev/null and b/17_constraintlayout/src/main/res/drawable/earth.png differ
diff --git a/17_constraintlayout/src/main/res/drawable/ic_favorite_black_24dp.xml b/17_constraintlayout/src/main/res/drawable/ic_favorite_black_24dp.xml
new file mode 100755
index 0000000..7ba6d70
--- /dev/null
+++ b/17_constraintlayout/src/main/res/drawable/ic_favorite_black_24dp.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/17_constraintlayout/src/main/res/drawable/ic_launcher_background.xml b/17_constraintlayout/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..0d025f9
--- /dev/null
+++ b/17_constraintlayout/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/17_constraintlayout/src/main/res/drawable/ic_mail_black_24dp.xml b/17_constraintlayout/src/main/res/drawable/ic_mail_black_24dp.xml
new file mode 100755
index 0000000..3ac8d83
--- /dev/null
+++ b/17_constraintlayout/src/main/res/drawable/ic_mail_black_24dp.xml
@@ -0,0 +1,4 @@
+
+
+
diff --git a/17_constraintlayout/src/main/res/drawable/ic_play_circle_filled_black_24dp.xml b/17_constraintlayout/src/main/res/drawable/ic_play_circle_filled_black_24dp.xml
new file mode 100755
index 0000000..82c0de4
--- /dev/null
+++ b/17_constraintlayout/src/main/res/drawable/ic_play_circle_filled_black_24dp.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/17_constraintlayout/src/main/res/drawable/ic_save_black_24dp.xml b/17_constraintlayout/src/main/res/drawable/ic_save_black_24dp.xml
new file mode 100755
index 0000000..931e1a9
--- /dev/null
+++ b/17_constraintlayout/src/main/res/drawable/ic_save_black_24dp.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/17_constraintlayout/src/main/res/drawable/moon.png b/17_constraintlayout/src/main/res/drawable/moon.png
new file mode 100644
index 0000000..b465372
Binary files /dev/null and b/17_constraintlayout/src/main/res/drawable/moon.png differ
diff --git a/17_constraintlayout/src/main/res/drawable/qq.png b/17_constraintlayout/src/main/res/drawable/qq.png
new file mode 100644
index 0000000..26a087c
Binary files /dev/null and b/17_constraintlayout/src/main/res/drawable/qq.png differ
diff --git a/17_constraintlayout/src/main/res/drawable/qzone.png b/17_constraintlayout/src/main/res/drawable/qzone.png
new file mode 100644
index 0000000..75dca94
Binary files /dev/null and b/17_constraintlayout/src/main/res/drawable/qzone.png differ
diff --git a/17_constraintlayout/src/main/res/drawable/sun.png b/17_constraintlayout/src/main/res/drawable/sun.png
new file mode 100644
index 0000000..1c4425b
Binary files /dev/null and b/17_constraintlayout/src/main/res/drawable/sun.png differ
diff --git a/17_constraintlayout/src/main/res/drawable/twitter.png b/17_constraintlayout/src/main/res/drawable/twitter.png
new file mode 100644
index 0000000..47c5956
Binary files /dev/null and b/17_constraintlayout/src/main/res/drawable/twitter.png differ
diff --git a/17_constraintlayout/src/main/res/drawable/wechat.png b/17_constraintlayout/src/main/res/drawable/wechat.png
new file mode 100644
index 0000000..7385b85
Binary files /dev/null and b/17_constraintlayout/src/main/res/drawable/wechat.png differ
diff --git a/17_constraintlayout/src/main/res/drawable/wechat_friend.png b/17_constraintlayout/src/main/res/drawable/wechat_friend.png
new file mode 100644
index 0000000..84f14a9
Binary files /dev/null and b/17_constraintlayout/src/main/res/drawable/wechat_friend.png differ
diff --git a/17_constraintlayout/src/main/res/drawable/weibo.png b/17_constraintlayout/src/main/res/drawable/weibo.png
new file mode 100644
index 0000000..996e8cb
Binary files /dev/null and b/17_constraintlayout/src/main/res/drawable/weibo.png differ
diff --git a/17_constraintlayout/src/main/res/layout/activity_circular_positioning.xml b/17_constraintlayout/src/main/res/layout/activity_circular_positioning.xml
new file mode 100644
index 0000000..a140e7b
--- /dev/null
+++ b/17_constraintlayout/src/main/res/layout/activity_circular_positioning.xml
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/17_constraintlayout/src/main/res/layout/activity_circular_reveal.xml b/17_constraintlayout/src/main/res/layout/activity_circular_reveal.xml
new file mode 100644
index 0000000..9a78a50
--- /dev/null
+++ b/17_constraintlayout/src/main/res/layout/activity_circular_reveal.xml
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/17_constraintlayout/src/main/res/layout/activity_constraint_end.xml b/17_constraintlayout/src/main/res/layout/activity_constraint_end.xml
new file mode 100644
index 0000000..a001e84
--- /dev/null
+++ b/17_constraintlayout/src/main/res/layout/activity_constraint_end.xml
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/17_constraintlayout/src/main/res/layout/activity_constraint_layout_sample.xml b/17_constraintlayout/src/main/res/layout/activity_constraint_layout_sample.xml
new file mode 100644
index 0000000..d791d7a
--- /dev/null
+++ b/17_constraintlayout/src/main/res/layout/activity_constraint_layout_sample.xml
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/17_constraintlayout/src/main/res/layout/activity_constraint_start.xml b/17_constraintlayout/src/main/res/layout/activity_constraint_start.xml
new file mode 100644
index 0000000..c3f7b64
--- /dev/null
+++ b/17_constraintlayout/src/main/res/layout/activity_constraint_start.xml
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/17_constraintlayout/src/main/res/layout/activity_dimension_ratio.xml b/17_constraintlayout/src/main/res/layout/activity_dimension_ratio.xml
new file mode 100644
index 0000000..da2f70f
--- /dev/null
+++ b/17_constraintlayout/src/main/res/layout/activity_dimension_ratio.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/17_constraintlayout/src/main/res/layout/activity_flow.xml b/17_constraintlayout/src/main/res/layout/activity_flow.xml
new file mode 100644
index 0000000..e8ae52e
--- /dev/null
+++ b/17_constraintlayout/src/main/res/layout/activity_flow.xml
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/17_constraintlayout/src/main/res/layout/activity_guide_line.xml b/17_constraintlayout/src/main/res/layout/activity_guide_line.xml
new file mode 100644
index 0000000..36f3886
--- /dev/null
+++ b/17_constraintlayout/src/main/res/layout/activity_guide_line.xml
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/17_constraintlayout/src/main/res/layout/activity_linear.xml b/17_constraintlayout/src/main/res/layout/activity_linear.xml
new file mode 100644
index 0000000..ba969c5
--- /dev/null
+++ b/17_constraintlayout/src/main/res/layout/activity_linear.xml
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/17_constraintlayout/src/main/res/layout/activity_main.xml b/17_constraintlayout/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..195d2c2
--- /dev/null
+++ b/17_constraintlayout/src/main/res/layout/activity_main.xml
@@ -0,0 +1,11 @@
+
+
+
+
\ No newline at end of file
diff --git a/17_constraintlayout/src/main/res/layout/activity_place_holder.xml b/17_constraintlayout/src/main/res/layout/activity_place_holder.xml
new file mode 100644
index 0000000..0abe8dd
--- /dev/null
+++ b/17_constraintlayout/src/main/res/layout/activity_place_holder.xml
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/17_constraintlayout/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/17_constraintlayout/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/17_constraintlayout/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/17_constraintlayout/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/17_constraintlayout/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/17_constraintlayout/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/17_constraintlayout/src/main/res/mipmap-hdpi/ic_launcher.png b/17_constraintlayout/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..898f3ed
Binary files /dev/null and b/17_constraintlayout/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/17_constraintlayout/src/main/res/mipmap-hdpi/ic_launcher_round.png b/17_constraintlayout/src/main/res/mipmap-hdpi/ic_launcher_round.png
new file mode 100644
index 0000000..dffca36
Binary files /dev/null and b/17_constraintlayout/src/main/res/mipmap-hdpi/ic_launcher_round.png differ
diff --git a/17_constraintlayout/src/main/res/mipmap-mdpi/ic_launcher.png b/17_constraintlayout/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..64ba76f
Binary files /dev/null and b/17_constraintlayout/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/17_constraintlayout/src/main/res/mipmap-mdpi/ic_launcher_round.png b/17_constraintlayout/src/main/res/mipmap-mdpi/ic_launcher_round.png
new file mode 100644
index 0000000..dae5e08
Binary files /dev/null and b/17_constraintlayout/src/main/res/mipmap-mdpi/ic_launcher_round.png differ
diff --git a/17_constraintlayout/src/main/res/mipmap-xhdpi/ic_launcher.png b/17_constraintlayout/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..e5ed465
Binary files /dev/null and b/17_constraintlayout/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/17_constraintlayout/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/17_constraintlayout/src/main/res/mipmap-xhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..14ed0af
Binary files /dev/null and b/17_constraintlayout/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ
diff --git a/17_constraintlayout/src/main/res/mipmap-xxhdpi/ic_launcher.png b/17_constraintlayout/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..b0907ca
Binary files /dev/null and b/17_constraintlayout/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/17_constraintlayout/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/17_constraintlayout/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..d8ae031
Binary files /dev/null and b/17_constraintlayout/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ
diff --git a/17_constraintlayout/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/17_constraintlayout/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000..2c18de9
Binary files /dev/null and b/17_constraintlayout/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/17_constraintlayout/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/17_constraintlayout/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..beed3cd
Binary files /dev/null and b/17_constraintlayout/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ
diff --git a/17_constraintlayout/src/main/res/values/attrs.xml b/17_constraintlayout/src/main/res/values/attrs.xml
new file mode 100644
index 0000000..514af56
--- /dev/null
+++ b/17_constraintlayout/src/main/res/values/attrs.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/17_constraintlayout/src/main/res/values/colors.xml b/17_constraintlayout/src/main/res/values/colors.xml
new file mode 100644
index 0000000..69b2233
--- /dev/null
+++ b/17_constraintlayout/src/main/res/values/colors.xml
@@ -0,0 +1,6 @@
+
+
+ #008577
+ #00574B
+ #D81B60
+
diff --git a/17_constraintlayout/src/main/res/values/strings.xml b/17_constraintlayout/src/main/res/values/strings.xml
new file mode 100644
index 0000000..3b8529f
--- /dev/null
+++ b/17_constraintlayout/src/main/res/values/strings.xml
@@ -0,0 +1,3 @@
+
+ 19_constraintlayout
+
diff --git a/17_constraintlayout/src/main/res/values/styles.xml b/17_constraintlayout/src/main/res/values/styles.xml
new file mode 100644
index 0000000..5885930
--- /dev/null
+++ b/17_constraintlayout/src/main/res/values/styles.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
diff --git a/17_constraintlayout/src/test/java/com/hencoder/a19_constraintlayout/ExampleUnitTest.kt b/17_constraintlayout/src/test/java/com/hencoder/a19_constraintlayout/ExampleUnitTest.kt
new file mode 100644
index 0000000..9254831
--- /dev/null
+++ b/17_constraintlayout/src/test/java/com/hencoder/a19_constraintlayout/ExampleUnitTest.kt
@@ -0,0 +1,17 @@
+package com.hencoder.a19_constraintlayout
+
+import org.junit.Test
+
+import org.junit.Assert.*
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+class ExampleUnitTest {
+ @Test
+ fun addition_isCorrect() {
+ assertEquals(4, 2 + 2)
+ }
+}
diff --git a/settings.gradle b/settings.gradle
index 0b9f00d..725a620 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1 +1,11 @@
-include ':07_kotlin_lesson', ':07_kotlin_app', ':07_kotlin_base', ':09_drawing', ':10_text_and_transformation', ':11_animation', ':12_bitmap_drawable', ':13_layout', ':14_touch', ':15_scalableimageview'
+include ':07_kotlin_lesson',
+ ':07_kotlin_app',
+ ':07_kotlin_base',
+ ':09_drawing',
+ ':10_text_and_transformation',
+ ':11_animation',
+ ':12_bitmap_drawable',
+ ':13_layout',
+ ':14_touch',
+ ':15_scalableimageview',
+ ':17_constraintlayout'