ภาพรวม
ConstraintLayout เป็น Layout Manager รุ่นใหม่ (API 9+) ที่ออกแบบมาเพื่อ **ลด View Hierarchy** (ลด Nested Layouts) และ **เพิ่มประสิทธิภาพ** แทน RelativeLayout และ LinearLayout ที่ซ้อนกันหลายชั้น ทำงานแบบ **Constraint-based** (อิงตามข้อจำกัด/ความสัมพันธ์ระหว่าง View)
คุณสมบัติหลัก (Key Features)
1. Flat Hierarchy (โครงสร้างแบน)
วาง View ทั้งหมดใน ConstraintLayout เดียว ไม่ต้องซ้อน LinearLayout/RelativeLayout หลายชั้น → ลดการ Measure/Layout pass → **เร็วกว่า**
2. Constraint Types (ประเภทของ Constraint)
| ประเภท | คำอธิบาย | XML Attribute |
|---|---|---|
| Relative Positioning | วางเทียบกับ View อื่น หรือ Parent | layout_constraintTop_toBottomOf, layout_constraintStart_toEndOf, ฯลฯ |
| Margins | ระยะห่างจากขอบ (dp) | layout_marginStart, Top, End, Bottom |
| Bias | การกระจายพื้นที่ว่าง (0.0 - 1.0) | layout_constraintHorizontal_bias, Vertical_bias |
| Chains | กลุ่ม View ที่เชื่อมต่อกัน แบ่งพื้นที่ | layout_constraintHorizontal_chainStyle (spread, spread_inside, packed) |
| Guidelines | เส้นนำทาง hidden สำหรับจัดตำแหน่ง | android:orientation, layout_constraintGuide_begin/end/percent |
| Barriers | ขอบเขตไดนามิกจากกลุ่ม View | barrierDirection, referencedIds |
| Baseline | จัดแนวข้อความ (Text Baseline) | layout_constraintBaseline_toBaselineOf |
3. View Sizing Modes (โหมดกำหนดขนาด)
| โหมด | XML | พฤติกรรม |
|---|---|---|
| Fixed | android:layout_width="100dp" | ขนาดคงที่ |
| Wrap Content | android:layout_width="wrap_content" | ขนาดตามเนื้อหา |
| Match Constraints (0dp) | android:layout_width="0dp" | ขยายเต็มพื้นที่ที่เหลือ (เหมือน match_parent แต่ใน Constraint) |
| Match Constraints + Ratio | layout_constraintDimensionRatio="16:9" | รักษาอัตราส่วนกว้าง:สูง |
| Match Constraints + min/max | layout_constraintWidth_min/max | จำกัดขนาดขั้นต่ำ/สูงสุด |
ตัวอย่าง XML แบบสมบูรณ์
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:app="https://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp">
<!-- Guideline แนวตั้ง 50% -->
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guidelineVertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.5" />
<TextView
android:id="@+id/tvTitle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="ConstraintLayout Demo"
android:textSize="24sp"
android:gravity="center"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
<Button
android:id="@+id/btnAction"
android:layout_width="0dp"
android:layout_height="48dp"
android:text="กดปุ่ม"
app:layout_constraintTop_toBottomOf="@+id/tvTitle"
app:layout_constraintStart_toStartOf="@+id/tvTitle"
app:layout_constraintEnd_toStartOf="@+id/guidelineVertical"
app:layout_constraintHorizontal_bias="0.5"
android:layout_marginTop="16dp" />
<ImageView
android:layout_width="0dp"
android:layout_height="0dp"
android:src="@drawable/ic_launcher"
app:layout_constraintTop_toBottomOf="@+id/btnAction"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintDimensionRatio="1:1"
android:layout_marginTop="16dp" />
</androidx.constraintlayout.widget.ConstraintLayout>
เครื่องมือใน Android Studio (Layout Editor)
- Design Surface: ดรากเพื่อสร้าง Constraint (วงกลมที่ขอบ View)
- Blueprint Mode: มองโครงสร้าง Constraint ชัดเจน
- Infer Constraints (ไอคอนไม้กวาด): สร้าง Constraint อัตโนมัติจากตำแหน่งปัจจุบัน
- Convert to ConstraintLayout: Right-click Layout ลงลึก → Convert
- Attributes Panel: ปรับ Margin, Bias, Dimension Ratio ได้แบบ Visual
Performance Tips
- หลีกเลี่ยง Nested ConstraintLayout (ซ้อน ConstraintLayout ใน ConstraintLayout)
- ใช้
0dp(Match Constraints) แทนmatch_parent - ใช้ Chains แทนการซ้อน LinearLayout สำหรับกระจาย View
- Guidelines/Barriers ช่วยลด Constraint ซ้ำซ้อน
- Enable
android:layout_optimizationLevel="7"(default) สำหรับการแก้ไข Constraint อัจฉริยะ
Migration จาก RelativeLayout
| RelativeLayout | ConstraintLayout |
|---|---|
| layout_below="@id/view" | layout_constraintTop_toBottomOf="@id/view" |
| layout_toRightOf="@id/view" | layout_constraintStart_toEndOf="@id/view" |
| layout_centerHorizontal="true" | layout_constraintStart_toStartOf="parent" + layout_constraintEnd_toEndOf="parent" |
| layout_alignParentBottom="true" | layout_constraintBottom_toBottomOf="parent" |
| layout_marginStart | layout_marginStart (เหมือนกัน) |
สรุป
ConstraintLayout เป็น **Layout หลักของ Android สมัยใหม่** ใช้ Constraint (ความสัมพันธ์) วาง View แบบแบน (Flat) ประสิทธิภาพสูงกว่า RelativeLayout/LinearLayout มาก รองรับฟีเจอร์ขั้นสูง: Chains, Guidelines, Barriers, Ratios, Circular Positioning ให้เรียนรู้และใช้เป็นหลักในทุกโปรเจกต์ใหม่