วิธีการทำให้ ConstraintLayout ใช้งานได้กับค่าเปอร์เซ็นต์?


207

ด้วยการแสดงตัวอย่าง 1 จากสตูดิโอของ Android 2.2 Google ConstraintLayoutเปิดตัวรูปแบบใหม่ในห้องสมุดสนับสนุน: ด้วย ConstraintLayout มันง่ายกว่าที่จะใช้เครื่องมือออกแบบใน Android Studio แต่ฉันไม่พบวิธีการใช้ขนาดสัมพัทธ์ (เปอร์เซ็นต์หรือ 'น้ำหนัก' เหมือนใน LinearLayout) มีวิธีในการกำหนดข้อ จำกัด ตามเปอร์เซ็นต์หรือไม่? เช่นทำให้มุมมองใช้ 40% ของหน้าจอสร้างระยะขอบ 20% ระหว่างมุมมองตั้งค่าความกว้างของมุมมองเป็น 50% ของความกว้างของมุมมองอื่น


3
เพิ่มการรองรับเปอร์เซ็นต์สำหรับความกว้างหรือความสูงในversion 1.1ConstraintLayout ดู"เปอร์เซ็นของมิติ"บนdeveloper.android.com/reference/android/support/constraint/ ......หรือคำตอบที่ใหม่กว่า
Sunadorer

คำตอบ:


225

ขณะนี้คุณสามารถทำได้หลายวิธี

หนึ่งคือการสร้างแนวทาง (คลิกขวาที่พื้นที่การออกแบบจากนั้นคลิกเพิ่มแนวทางแนวตั้ง / แนวนอน) จากนั้นคุณสามารถคลิก "ส่วนหัว" ของคำแนะนำเพื่อเปลี่ยนการวางตำแหน่งให้เป็นเปอร์เซ็นต์ สุดท้ายคุณสามารถ จำกัด มุมมองให้เป็นแนวทาง

อีกวิธีหนึ่งคือการวางตำแหน่งมุมมองโดยใช้อคติ (เปอร์เซ็นต์) แล้วจึงยึดมุมมองอื่นกับมุมมองนั้น

ที่กล่าวมาเราได้คิดเกี่ยวกับวิธีนำเสนอมิติข้อมูลตามเปอร์เซ็นต์ ฉันไม่สามารถทำสัญญาได้ แต่มันเป็นสิ่งที่เราต้องการเพิ่ม


1
โหวตลง 0 ฉันขอติดตามได้ไหม ฉันพยายามตั้งค่า ImageView ให้มีความกว้าง 60% แต่ยังคงอัตราส่วนไว้ที่ 16: 9 ฉันต้องการแก้ไขความกว้าง แต่ความสูงของ ImageView นั้นเป็นแบบไดนามิก เป็นไปได้ไหมกับข้อ จำกัด เลย์เอาต์? ฉันกำลังดิ้นรนเพื่อให้มันทำงาน - ฉันสิ้นสุดด้วยค่าความกว้าง / ความสูงคงที่ที่ 0 ยกเว้นว่าฉันระบุขนาดฮาร์ดโค้ด
MattWilliams89

3
@ MattWilliams89 มีพารามิเตอร์ที่เรียกว่า layout_constraintDimensionRatio ฉันคิดว่ามันอาจจะมีประโยชน์ในกรณีของคุณเขียน "16: 9" ที่นั่น ฉันไม่ประสบความสำเร็จในการพยายามสร้างเลย์เอาต์ของคุณด้วยแม้ว่าภาพจะมีขนาดใหญ่มาก
Yury Fedorov

1
@RomainGuy คุณจะเปลี่ยนตำแหน่งเป็นเปอร์เซ็นต์ในส่วนหัวของ guidlines ได้อย่างไร ฉันพยายามคลิกขวาแล้วไม่มีอะไรปรากฏขึ้น
Edijae Crusar

21
สำหรับผู้ที่สงสัยว่าส่วนหัวของแนวทางคือวงกลมที่มีลูกศรขึ้นหรือลงหรือสัญลักษณ์เปอร์เซ็นต์ คลิกที่สลับไปมาระหว่างแอพ: layout_constraintGuide_begin, แอพ: layout_constraintGuide_end และแอพ: layout_constraintGuide_percent ใน XML ฉันพบปัญหาเล็ก ๆ (ใน ConstraintLayout เวอร์ชัน 1.0.0-alpha8 ที่ฉันต้องคลิกแนวทางวางเมาส์ของฉันแล้วลากไปที่วงกลมเพื่อสลับสิ่งเหล่านี้ในตัวแก้ไข แต่ฉันแน่ใจว่าข้อผิดพลาดนี้จะได้รับการแก้ไขในไม่ช้า .
lustig

4
คุณสามารถตั้งค่านี้ใน XML ของโครงร่างโดยใช้app:layout_constraintGuide_percentage
piratemurray

215

มันอาจมีประโยชน์ที่จะมีการอ้างอิงอย่างรวดเร็วที่นี่

ตำแหน่งของมุมมอง

ใช้แนวทางด้วยapp:layout_constraintGuide_percentเช่นนี้

<androidx.constraintlayout.widget.Guideline
    android:id="@+id/guideline"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    app:layout_constraintGuide_percent="0.5"/>

และจากนั้นคุณสามารถใช้แนวทางนี้เป็นจุดยึดสำหรับมุมมองอื่น ๆ

หรือ

ใช้อคติกับapp:layout_constraintHorizontal_biasและ / หรือapp:layout_constraintVertical_biasเพื่อปรับเปลี่ยนมุมมองตำแหน่งเมื่อมีพื้นที่ว่างให้

<Button
    ...
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintHorizontal_bias="0.25"
    ...
    />

ขนาดการดู

อีกเปอร์เซ็นต์ตามมูลค่าคือความสูงและ / หรือความกว้างขององค์ประกอบด้วยapp:layout_constraintHeight_percentและ / หรือapp:layout_constraintWidth_percent:

<Button
    ...
    android:layout_width="0dp"
    app:layout_constraintWidth_percent="0.5"
    ...
    />

3
ทำไมมันตั้งค่าความกว้างเป็น 1dp
user924

1
@ user924 มันจะทำให้รู้สึกถึงแนวทางกว้าง 0dp ฉันไม่ทราบว่าทำไมนักพัฒนาที่ใช้การตัดสินใจนี้ใน 1dp อาจเป็นเพราะ 0dp ถือเป็น "ยืด" เมื่อใช้ตุ้มน้ำหนัก
Amir Uval

3
@ user924: 0dpใช้ใน ConstraintLayout เพื่อระบุขนาดแบบไดนามิก ดูdeveloper.android.com/reference/android/support/constraint/…
serv-inc

1
@ serv-inc แต่ที่นี่1dpไม่ใช่0dp.. มันเป็นสิ่งที่ฉันกำลังพูดถึง
user924

3
@ user924: คุณต้องตั้งค่าความกว้าง 0dpสงวนไว้แล้วดังนั้น1dpดูเหมือนสมเหตุสมผล
serv-inc

109

ในฐานะของ "ConstraintLayout1.1.0-beta1" คุณสามารถใช้เปอร์เซ็นต์เพื่อกำหนดความกว้างและความสูงได้

android:layout_width="0dp"
app:layout_constraintWidth_default="percent"
app:layout_constraintWidth_percent=".4"

นี้จะกำหนดความกว้างเป็น 40% ของความกว้างของหน้าจอ การรวมกันของสิ่งนี้และแนวทางเป็นเปอร์เซ็นต์ช่วยให้คุณสร้างเค้าโครงตามเปอร์เซ็นต์ที่คุณต้องการ


6
ในโครงร่างข้อ จำกัด 1.0.2 ไม่สนับสนุนค่าเปอร์เซ็นต์สำหรับlayout_constraintWidth_default ฉันคิดว่าวิธีที่ถูกต้องคือใช้หลักเกณฑ์
vovahost

1
มันทำงานกับ Android Studio 3.0 ที่สร้างขึ้นเมื่อวันที่ 20 ตุลาคม 2017
douarbou

5
ตามที่ระบุไว้ในคำตอบนี้ถูกเพิ่มเข้ามาในversion 1.1ConstraintLayout เพิ่มเติม_default="percent"ไม่จำเป็นอีกต่อไปในรุ่นมั่นคง! ดู"
เปอร์เซ็นของส่วน

@hoford สำหรับมุมมองที่มีข้อความซึ่งจะต้องกำหนดขนาดเป็นspหน่วยขนาดตัวอักษรจะเป็นสัดส่วนอัตโนมัติกับขนาดของมุมมองได้อย่างไร (ซึ่งโดยตัวมันเองได้กำหนดสัดส่วนตามขนาดทั้งหมดของโครงร่างเช่นใน 'เปอร์เซ็นต์') ?
บลิส

77

ด้วย ConstraintLayout v1.1 รุ่นใหม่ตอนนี้คุณสามารถทำสิ่งต่อไปนี้:

<Button
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintHeight_percent="0.2"
app:layout_constraintWidth_percent="0.65" />

สิ่งนี้จะ จำกัด ปุ่มให้เป็นความสูง 20% และ 65% ของความกว้างของมุมมองพาเรนต์


1
สำหรับฉันทำงานได้เฉพาะเมื่อฉันเปลี่ยนจาก "android:" เป็น "app:" -> app: layout_constraintHeight_percent = "0.2"
Kirill Karmazin

นี่เป็นสิ่งจำเป็นสำหรับฉันเมื่อติดตามเค้าโครงของเหลวของการออกแบบวัสดุ material.io/design/layout/…

@Adam สำหรับมุมมองที่มีข้อความซึ่งจะต้องกำหนดขนาดเป็นspหน่วยขนาดของข้อความจะเป็นสัดส่วนกับขนาดของมุมมองโดยอัตโนมัติอย่างไร ?
บลิส

1
@Bliss ดูเหมือนว่านี่จะช่วยได้: developer.android.com/guide/topics/ui/look-and-feel/ ...... ฉันไม่เคยใช้มันเลย
อดัม

43

วิธีใช้คำแนะนำ

คำตอบที่ได้รับการยอมรับนั้นไม่ค่อยชัดเจนเกี่ยวกับวิธีใช้แนวทางและ "หัว" คืออะไร

ขั้นตอน

ก่อนอื่นให้เพิ่มแนวทาง

ป้อนคำอธิบายรูปภาพที่นี่

เลือก Guidline หรือเลื่อนไปเล็กน้อยเพื่อให้มองเห็นข้อ จำกัด

ป้อนคำอธิบายรูปภาพที่นี่

จากนั้นคลิกวงกลมวงกลม ("ส่วนหัว") จนกระทั่งกลายเป็นเปอร์เซ็นต์ จากนั้นคุณสามารถลากเปอร์เซ็นต์นี้ลงไป 50% หรืออะไรก็ได้ที่คุณต้องการ

ป้อนคำอธิบายรูปภาพที่นี่

หลังจากนั้นคุณสามารถ จำกัด มุมมองของคุณไปที่หลักเกณฑ์เพื่อให้เปอร์เซ็นต์ของผู้ปกครอง (ใช้match_constraintในมุมมอง)

ป้อนคำอธิบายรูปภาพที่นี่


ควรจะเห็น 'ส่วนหัว' อยู่ที่ไหน มันไม่ปรากฏในมุมมองของฉัน
Marcel50506

@ Marcel50506 ตรวจสอบให้แน่ใจว่ามุมมองออกแบบและพิมพ์เขียวกำลังแสดงอยู่ นั่นจะทำให้คุณมีโอกาสที่ดีที่สุดที่จะได้เห็นมัน หากคุณเห็นบรรทัดแนวทางให้ลองคลิกเพื่อเลือก หากคุณไม่เห็นบรรทัดให้ลองคลิกที่รายการแนวทางในเมนูทรีส่วนประกอบที่ควรอยู่ทางด้านซ้าย (สมมติว่าคุณเพิ่มแนวทางแล้ว)
Suragch

1
ฉันไม่เห็นวงกลม แต่เมื่อคลิกทางด้านซ้ายของแนวทางฉันสามารถเปลี่ยนเป็นเปอร์เซ็นต์ .. ปัญหาการแสดงผลฉันคิดว่า ขอบคุณ.
Marcel50506

นี่คือคำตอบที่ดีที่สุดเพราะมันเสนอวิธีการจัดวางที่ดีกว่า เราสามารถจัดมุมมองหลายมุมมองบนแนวทางพื้นฐานแทนการเพิ่มเปอร์เซ็นต์ในมุมมองเดียวเท่านั้น
เหงียนมินห์

33

แนวทางมีค่า - และแอป: layout_constraintGuide_percent เป็นเพื่อนที่ดี ... อย่างไรก็ตามบางครั้งเราต้องการเปอร์เซ็นต์โดยไม่มีแนวทาง ตอนนี้เป็นไปได้ที่จะใช้ตุ้มน้ำหนัก :

android:layout_width="0dp"
app:layout_constraintHorizontal_weight="1"

นี่คือตัวอย่างที่สมบูรณ์มากขึ้นที่ใช้แนวทางที่มีน้ำหนักเพิ่มเติม:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp"
    tools:context="android.itomerbu.layoutdemo.MainActivity">

    <android.support.constraint.Guideline
        android:id="@+id/guideline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.44"/>

    <Button
        android:id="@+id/btnThird"
        android:layout_width="0dp"
        app:layout_constraintHorizontal_weight="1"
        android:layout_height="wrap_content"
        android:text="@string/btnThird"
        app:layout_constraintLeft_toLeftOf="parent"
        android:layout_marginBottom="8dp"
        app:layout_constraintRight_toLeftOf="@+id/btnTwoThirds"
        app:layout_constraintBottom_toTopOf="@+id/guideline"
        android:layout_marginStart="8dp"
        android:layout_marginLeft="8dp"/>

    <Button
        android:id="@+id/btnTwoThirds"
        app:layout_constraintHorizontal_weight="2"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="@string/btnTwoThirds"
        app:layout_constraintBottom_toBottomOf="@+id/btnThird"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintLeft_toRightOf="@+id/btnThird"/>
</android.support.constraint.ConstraintLayout>

2
@Plumbus - น้ำหนักเทียบเท่ากับเปอร์เซ็นต์ (เปอร์เซ็นต์ใด ๆ ที่สามารถแปลงได้ทางคณิตศาสตร์เป็นน้ำหนักและในทางกลับกัน) โดยการเป็นจู้จี้จุกจิกเกี่ยวกับคำศัพท์คุณพลาดจุดของคำตอบ
Scott Biggs

11

ด้วย ConstraintLayout v1.1.2 มิติควรถูกตั้งค่า0dpแล้วตั้งค่าlayout_constraintWidth_percentหรือlayout_constraintHeight_percentคุณลักษณะเป็นค่าระหว่าง 0 และ 1 เช่น:

<!-- 50% width centered Button -->
<Button
    android:id="@+id/button"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintWidth_percent=".5" />

(คุณไม่จำเป็นต้องตั้งค่าapp:layout_constraintWidth_default="percent"หรือapp:layout_constraintHeight_default="percent"ใช้ ConstraintLayout 1.1.2 และเวอร์ชันต่อไปนี้)


10

เค้าโครงข้อ จำกัด การทำให้มุมมองใช้เปอร์เซ็นต์ของหน้าจอที่จำเป็นต้องใช้สองแนวทาง ในข้อ จำกัด เค้าโครง 1.1 มันถูกทำง่ายขึ้นโดยให้คุณ จำกัด มุมมองใด ๆ กับความกว้างหรือความสูงเป็นเปอร์เซ็นต์ได้อย่างง่ายดาย

ป้อนคำอธิบายรูปภาพที่นี่

มันยอดเยี่ยมใช่ไหม มุมมองทั้งหมดสนับสนุนแอตทริบิวต์ layout_constraintWidth_percent และ layout_constraintHeight_percent สิ่งเหล่านี้จะทำให้ข้อ จำกัด ได้รับการแก้ไขในอัตราร้อยละของพื้นที่ว่าง ดังนั้นการสร้างปุ่มหรือ TextView จะขยายให้เต็มร้อยละของหน้าจอสามารถทำได้ด้วย XML สองสามบรรทัด

ตัวอย่างเช่นหากคุณต้องการตั้งค่าความกว้างของปุ่มเป็น 70% ของหน้าจอคุณสามารถทำได้ดังนี้:

<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_constraintWidth_percent="0.7" />

โปรดทราบว่าคุณจะต้องใส่มิติควรใช้เป็นเปอร์เซ็นต์ถึง 0dp ตามที่เราได้ระบุ android: layout_width ถึง 0dp ด้านบน

ในทำนองเดียวกันถ้าคุณต้องการตั้งค่าความสูงของปุ่มเป็น 20% ของหน้าจอคุณสามารถทำได้ดังนี้:

<Button
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_constraintHeight_percent="0.2" />

ดู! เราได้ระบุ android: layout_height เป็น 0dp ในขณะนี้เพราะเราต้องการให้ปุ่มใช้ความสูงเป็นเปอร์เซ็นต์


8

ลองรหัสนี้ คุณสามารถเปลี่ยนเปอร์เซ็นต์ความสูงและความกว้างได้ด้วยแอพ: layout_constraintHeight_percent และแอพ: layout_constraintWidth_percent

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="#FF00FF"
        android:orientation="vertical"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintHeight_percent=".6"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintWidth_percent=".4"></LinearLayout>

</android.support.constraint.ConstraintLayout>

Gradle:

dependencies {
...
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
}

ป้อนคำอธิบายรูปภาพที่นี่


7

คุณสามารถใช้งานapp:layout_constraintVertical_weightได้เหมือนlayout_weightในlinearlayout

<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">

<Button
    android:id="@+id/button4"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:text="Button"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toLeftOf="@+id/button5"
    app:layout_constraintVertical_weight="1"/>

<Button
    android:id="@+id/button5"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:text="Button"
    app:layout_constraintLeft_toRightOf="@+id/button4"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintVertical_weight="1"/>
</android.support.constraint.ConstraintLayout>

หมายเหตุ: app:layout_constraintVertical_weight( app:layout_constraintHorizontal_weight) จะทำงานร่วมกับandroid:layout_width="0dp"(android:layout_height="0dp"


5

สำหรับบางคนที่อาจพบว่ามีประโยชน์คุณสามารถใช้layout_constraintDimensionRatioมุมมองลูกใดก็ได้ภายใน a ConstraintLayoutและเราสามารถกำหนดอัตราส่วนความสูงหรือความกว้างของมิติอื่น ๆ (อย่างน้อยหนึ่งต้องเป็น 0dp ทั้งความกว้างหรือความสูง)

 <ImageView
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:src="@drawable/top_image"
        app:layout_constraintDimensionRatio="16:9"        
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"/>

ในกรณีนี้อัตราส่วนภาพคือ 16: 9 app:layout_constraintDimensionRatio="16:9" คุณสามารถค้นหาข้อมูลเพิ่มเติมได้ที่นี่


3

ฉันรู้ว่านี่ไม่ใช่สิ่งที่ OP ต้องการ แต่เดิมช่วยฉันได้มากในสถานการณ์นี้เมื่อฉันมีคำถามที่คล้ายกัน .. การเพิ่มสิ่งนี้สำหรับผู้ที่ต้องการเปลี่ยนขนาดหน้าต่างเลย์เอาต์ (ซึ่งฉันใช้เป็นประจำ) ผ่านรหัส . เพิ่มสิ่งนี้ไปยัง onCreate ของคุณในกิจกรรมของคำถาม (เปลี่ยนเป็น 80%)

DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);

int width = dm.widthPixels;
int height = dm.heightPixels;

getWindow().setLayout((int)(width * 0.8), (int)(height * 0.8));

2

เพียงแค่แทนที่ในแท็กแนวทางของคุณ

app:layout_constraintGuide_begin="291dp"

กับ

app:layout_constraintGuide_percent="0.7"

ที่ 0.7 หมายถึง 70%

นอกจากนี้หากคุณพยายามลากแนวทางค่าที่ลากจะปรากฏขึ้นใน% อายุ


2

การใช้หลักเกณฑ์คุณสามารถเปลี่ยนตำแหน่งเป็นเปอร์เซ็นต์ได้

<android.support.constraint.Guideline
android:id="@+id/guideline"
android:layout_width="1dp"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.5"/>

คุณสามารถใช้วิธีนี้

android:layout_width="0dp"
app:layout_constraintWidth_default="percent"
app:layout_constraintWidth_percent="0.4"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.