โครงร่างข้อ จำกัด แนวตั้งตรงกลาง


95

จะจัดแนววัตถุในแนวตั้งและจัดกึ่งกลางในรูปแบบข้อ จำกัด ได้อย่างไร? เป็นไปได้ที่จะจัดแนวในแนวตั้งหรือแนวนอน แต่ฉันไม่พบวิธีที่จะจัดกึ่งกลางในเวลาเดียวกันนอกเหนือจากการ จำกัด มุมมองระหว่างเส้นตารางสองเส้น

ศูนย์จัดแนวแนวตั้ง: ป้อนคำอธิบายภาพที่นี่

ดูเหมือนว่าการจัดกึ่งกลางจะเป็นปัญหาใหญ่กับการจัดวางข้อ จำกัด ซึ่งบังคับให้ฉันต้องกลับไปใช้เลย์เอาต์แบบสัมพัทธ์สำหรับ "centerInParent", "centerVertical" และ "centerHorizontal"

ฉันต้องการสร้างเลย์เอาต์ในกล่องสีแดงโดยใช้เลย์เอาต์ข้อ จำกัด : ป้อนคำอธิบายภาพที่นี่

น่าเสียดายที่วิธีเดียวที่ฉันพบโดยไม่ใช้เส้นตารางสองเส้นคือ Relative และ LinearLayouts แบบซ้อนกัน (ซึ่ง Constraint Layout ควรจะแก้สถานการณ์ที่แน่นอนนี้!)

เค้าโครงโดยใช้เลย์เอาต์แบบสัมพัทธ์และเชิงเส้น:

<RelativeLayout
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginTop="12dp"
    app:layout_constraintTop_toBottomOf="@id/user_points"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent">

    <LinearLayout
        android:id="@+id/stat_1_layout"
        android:layout_width="60dp"
        android:layout_height="wrap_content"
        android:layout_marginLeft="12dp"
        android:layout_marginRight="12dp"
        android:layout_centerVertical="true"
        android:layout_toLeftOf="@+id/divider_1"
        android:orientation="vertical">

        <TextView
            android:id="@+id/stat_1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:gravity="center_horizontal"
            android:text="10"
            android:textSize="16dp"
            android:textColor="@color/textSecondaryDark"
            android:maxLines="1"/>

        <TextView
            android:id="@+id/stat_detail_1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:gravity="center"
            android:text="Streak"
            android:textSize="8sp"
            android:textColor="@color/textSecondary"
            android:maxLines="1"/>
    </LinearLayout>

    <View
        android:id="@+id/divider_1"
        android:layout_width="1dp"
        android:layout_height="38dp"
        android:layout_toLeftOf="@+id/stat_2_layout"
        android:background="@drawable/linedivider"/>

    <LinearLayout
        android:id="@+id/stat_2_layout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="18dp"
        android:layout_marginRight="18dp"
        android:layout_centerInParent="true"
        android:orientation="vertical">

        <TextView
            android:id="@+id/stat_2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:gravity="center_horizontal"
            android:text="243"
            android:textSize="16dp"
            android:textColor="@color/textSecondaryDark"
            android:maxLines="1"/>

        <TextView
            android:id="@+id/stat_detail_2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:gravity="center"
            android:text="Calories Burned"
            android:textSize="8sp"
            android:textColor="@color/textSecondary"
            android:maxLines="1"/>
    </LinearLayout>

    <View
        android:id="@+id/divider_2"
        android:layout_width="1dp"
        android:layout_height="38dp"
        android:layout_toRightOf="@+id/stat_2_layout"
        android:background="@drawable/linedivider"/>

    <LinearLayout
        android:id="@+id/stat_3_layout"
        android:layout_width="60dp"
        android:layout_height="wrap_content"
        android:layout_marginLeft="12dp"
        android:layout_marginRight="12dp"
        android:layout_toRightOf="@+id/divider_2"
        android:layout_centerVertical="true"
        android:orientation="vertical">

        <TextView
            android:id="@+id/stat_3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:gravity="center_horizontal"
            android:text="3200"
            android:textSize="16dp"
            android:textColor="@color/textSecondaryDark"
            android:maxLines="1"/>

        <TextView
            android:id="@+id/stat_detail_3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:gravity="center"
            android:text="Steps"
            android:textSize="8sp"
            android:textColor="@color/textSecondary"
            android:maxLines="1"/>
    </LinearLayout>
</RelativeLayout>

3
ปัญหาที่แท้จริงดูเหมือนจะอยู่ตรงกลางมุมมองในแนวนอนและแนวตั้งจากนั้นจึงวางมุมมองที่สัมพันธ์กับมุมมองที่อยู่ตรงกลางนั้น เค้าโครงข้อ จำกัด ช่วยให้คุณสามารถจัดแนวมุมมองเป็นศูนย์กลาง แต่ไม่ได้ตั้งค่ามุมมองที่จัดแนวกึ่งกลางเป็นจุดยึดสำหรับมุมมองอื่น
Ray Li

1
ดูคำตอบด้านล่างเป็นไปได้ที่จะตั้งค่ามุมมองที่ตรงกลางเป็นจุดยึดสำหรับมุมมองอื่น ๆ
Eugene Brusov

หน้าต่างแสดงตัวอย่าง (สำหรับมุมมองข้อความไม่ใช่การออกแบบ) ใน Android Studio จะแสดงการเปลี่ยนแปลงที่เกิดขึ้นกับเค้าโครง xml แบบไดนามิก (สำหรับข้อมูลคงที่) ช่วยในการทดลองได้มาก
samis

คำตอบ:


100

เป็นไปได้ที่จะตั้งค่ามุมมองที่จัดแนวกึ่งกลางเป็นจุดยึดสำหรับมุมมองอื่น ๆ ในตัวอย่างด้านล่าง "@ + id / stat_2" อยู่กึ่งกลางแนวนอนในพาเรนต์และทำหน้าที่เป็นจุดยึดสำหรับมุมมองอื่น ๆ ในเลย์เอาต์นี้

<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">

    <TextView
        android:id="@+id/stat_1"
        android:layout_width="80dp"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:gravity="center"
        android:maxLines="1"
        android:text="10"
        android:textColor="#777"
        android:textSize="22sp"
        app:layout_constraintTop_toTopOf="@+id/stat_2"
        app:layout_constraintEnd_toStartOf="@+id/divider_1" />

    <TextView
        android:id="@+id/stat_detail_1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Streak"
        android:textColor="#777"
        android:textSize="12sp"
        app:layout_constraintTop_toBottomOf="@+id/stat_1"
        app:layout_constraintStart_toStartOf="@+id/stat_1"
        app:layout_constraintEnd_toEndOf="@+id/stat_1" />

    <View
        android:id="@+id/divider_1"
        android:layout_width="1dp"
        android:layout_height="0dp"
        android:layout_marginEnd="16dp"
        android:background="#ccc"
        app:layout_constraintTop_toTopOf="@+id/stat_2"
        app:layout_constraintEnd_toStartOf="@+id/stat_2"
        app:layout_constraintBottom_toBottomOf="@+id/stat_detail_2" />

    <TextView
        android:id="@+id/stat_2"
        android:layout_width="80dp"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:maxLines="1"
        android:text="243"
        android:textColor="#777"
        android:textSize="22sp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintBottom_toBottomOf="parent" />

    <TextView
        android:id="@+id/stat_detail_2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:maxLines="1"
        android:text="Calories Burned"
        android:textColor="#777"
        android:textSize="12sp"
        app:layout_constraintTop_toBottomOf="@+id/stat_2"
        app:layout_constraintStart_toStartOf="@+id/stat_2"
        app:layout_constraintEnd_toEndOf="@+id/stat_2" />

    <View
        android:id="@+id/divider_2"
        android:layout_width="1dp"
        android:layout_height="0dp"
        android:layout_marginStart="16dp"
        android:background="#ccc"
        app:layout_constraintBottom_toBottomOf="@+id/stat_detail_2"
        app:layout_constraintStart_toEndOf="@+id/stat_2"
        app:layout_constraintTop_toTopOf="@+id/stat_2" />

    <TextView
        android:id="@+id/stat_3"
        android:layout_width="80dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:gravity="center"
        android:maxLines="1"
        android:text="3200"
        android:textColor="#777"
        android:textSize="22sp"
        app:layout_constraintTop_toTopOf="@+id/stat_2"
        app:layout_constraintStart_toEndOf="@+id/divider_2" />

    <TextView
        android:id="@+id/stat_detail_3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:maxLines="1"
        android:text="Steps"
        android:textColor="#777"
        android:textSize="12sp"
        app:layout_constraintTop_toBottomOf="@+id/stat_3"
        app:layout_constraintStart_toStartOf="@+id/stat_3"
        app:layout_constraintEnd_toEndOf="@+id/stat_3" />

</android.support.constraint.ConstraintLayout>

นี่คือวิธีการทำงานบนสมาร์ทโฟนที่เล็กที่สุด (3.7 480x800 Nexus One) เทียบกับสมาร์ทโฟนที่ใหญ่ที่สุด (5.5 1440x2560 Pixel XL)

มุมมองผลลัพธ์


3
ทึ่ง! ขอขอบคุณที่สละเวลาตอบคำถามนี้ คำตอบเหล่านี้ช่วยให้ฉันเข้าใจ Constraint Layout ได้ดีขึ้นมาก เหตุผลที่ฉันทำเครื่องหมายคำตอบนี้ว่าถูกต้องเทียบกับคำตอบของเบ็นพีก็เพราะว่าคำตอบนี้ยึดรายการไปยังวัตถุตรงกลาง ด้วยวิธีแก้ปัญหานี้ตอนนี้ฉันสามารถจัดแนววัตถุตรงกลางไปยังตำแหน่งอื่น ๆ และวัตถุอื่น ๆ จะตาม
Ray Li

1
การทำงานร่วมกับ Constraint Layout ในประสบการณ์ของคุณ Eugene Brusov เป็นอย่างไร ฉันพบว่า Constraint Layout เป็นการกำหนดค่าด้วยตนเองมากกว่าการใช้ Relative Layout / Linear Layout เนื่องจากไม่มีวิธีการจัดกึ่งกลางและการกระจาย หวังว่า Google จะมาพร้อมกับเลย์เอาต์ที่ผสานเข้าด้วยกันอย่างแท้จริง Relative Layout และ Linear Layout แทนที่จะเป็นสไตล์ XCode / Web Builder WYSIWYG
Ray Li

1
@RayLi ดีฉันสนุกกับ ConstraintLayout จริงๆคุณสมบัติที่ฉันชอบคือความเป็นไปได้ที่จะแบนเลย์เอาต์และขนาดมุมมองด้วยอัตราส่วนภาพ นอกจากนี้คุณยังสามารถหาคำตอบของฉันไปที่คำถามต่างๆที่เกี่ยวข้องกับ ConstraintLayout stackoverflow.com/users/7158449/eugene-brusov โพสต์คำถามต่อไป :-)
Eugene Brusov

และคอยตอบคำถาม Mr. Constraint Layout Expert;)
Ray Li

สวัสดี @RayLi ฉันลองใช้รหัสด้านบน แต่เนื้อหาทั้งหมดจะไปที่ด้านซ้ายบน มีความคิดอย่างไรที่จะทำเช่นนั้นกับเทมเพลตของ Mr. Eugene Brusov
HiDayurie Dave

63

หากคุณมีConstraintLayoutขนาดที่บางและเด็กที่Viewมีขนาดเล็กกว่าคุณสามารถจัดกึ่งกลางได้โดยการ จำกัด ขอบทั้งสองของเด็กให้เท่ากับสองขอบเดียวกัน นั่นคือคุณสามารถเขียน:

app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"

หรือ

app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"

เนื่องจากมุมมองมีขนาดเล็กข้อ จำกัด เหล่านี้จึงเป็นไปไม่ได้ แต่ConstraintLayoutจะทำให้ดีที่สุดเท่าที่จะทำได้และข้อ จำกัด แต่ละข้อจะ "ดึง" ที่มุมมองเด็กเท่า ๆ กันจึงทำให้มันอยู่กึ่งกลาง

แนวคิดนี้ใช้ได้กับทุกมุมมองเป้าหมายไม่ใช่เฉพาะระดับบนสุด

อัปเดต

ด้านล่างนี้คือ XML ที่บรรลุ UI ที่คุณต้องการโดยไม่มีมุมมองซ้อนกันและไม่มีGuidelines (แม้ว่าแนวทางจะไม่ชั่วร้ายโดยเนื้อแท้)

<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="wrap_content"
    android:background="#eee">

    <TextView
        android:id="@+id/title1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginBottom="12dp"
        android:gravity="center"
        android:textColor="#777"
        android:textSize="22sp"
        android:text="10"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toLeftOf="@+id/divider1"
        app:layout_constraintBottom_toBottomOf="parent"/>

    <TextView
        android:id="@+id/label1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:textColor="#777"
        android:textSize="12sp"
        android:text="Streak"
        app:layout_constraintTop_toBottomOf="@+id/title1"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toLeftOf="@+id/divider1"/>

    <View
        android:id="@+id/divider1"
        android:layout_width="1dp"
        android:layout_height="55dp"
        android:layout_marginTop="12dp"
        android:layout_marginBottom="12dp"
        android:background="#ccc"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintLeft_toRightOf="@+id/title1"
        app:layout_constraintRight_toLeftOf="@+id/title2"
        app:layout_constraintBottom_toBottomOf="parent"/>

    <TextView
        android:id="@+id/title2"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginBottom="12dp"
        android:gravity="center"
        android:textColor="#777"
        android:textSize="22sp"
        android:text="243"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintLeft_toRightOf="@+id/divider1"
        app:layout_constraintRight_toLeftOf="@+id/divider2"
        app:layout_constraintBottom_toBottomOf="parent"/>

    <TextView
        android:id="@+id/label2"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:textColor="#777"
        android:textSize="12sp"
        android:text="Calories Burned"
        app:layout_constraintTop_toBottomOf="@+id/title2"
        app:layout_constraintLeft_toRightOf="@+id/divider1"
        app:layout_constraintRight_toLeftOf="@+id/divider2"/>

    <View
        android:id="@+id/divider2"
        android:layout_width="1dp"
        android:layout_height="55dp"
        android:layout_marginTop="12dp"
        android:layout_marginBottom="12dp"
        android:background="#ccc"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintLeft_toRightOf="@+id/title2"
        app:layout_constraintRight_toLeftOf="@+id/title3"
        app:layout_constraintBottom_toBottomOf="parent"/>

    <TextView
        android:id="@+id/title3"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginBottom="12dp"
        android:gravity="center"
        android:textColor="#777"
        android:textSize="22sp"
        android:text="3200"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintLeft_toRightOf="@+id/divider2"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"/>

    <TextView
        android:id="@+id/label3"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:textColor="#777"
        android:textSize="12sp"
        android:text="Steps"
        app:layout_constraintTop_toBottomOf="@+id/title3"
        app:layout_constraintLeft_toRightOf="@+id/divider2"
        app:layout_constraintRight_toRightOf="parent"/>

</android.support.constraint.ConstraintLayout>

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


นั่นหมายความว่าทั้งหมดที่ฉันต้องทำเพื่อจัดแนวรายการตรงกลางในแนวตั้งคือสร้างรายการมุมมองที่มีความสูงคงที่และ จำกัด รายการลูกไว้ข้างใน! แต่เมื่อใช้วิธีนี้ฉันจะไม่สามารถจัดตำแหน่งของกล่องกลางในแนวนอนและกำหนดตำแหน่งของกล่องด้านซ้ายและด้านขวาให้สัมพันธ์กับกล่องกลางได้ หากมีเพียงฟังก์ชัน "ศูนย์กลาง" ในรูปแบบข้อ จำกัด !
Ray Li

คุณสามารถจัดกึ่งกลางกล่องกลางในแนวนอนโดยใช้วิธีการด้านบนจากนั้นตั้งค่าอีกสองกล่องให้ตรงกับขอบหลักและขอบของกล่องกลาง
Ben P.

@RayLi ฉันได้อัปเดตคำตอบของฉันด้วยรูปแบบที่ฉันเชื่อว่าบรรลุสิ่งที่คุณต้องการ
Ben P.

1
+1 นี่เป็นเรื่องง่ายและมีประสิทธิภาพ มันรู้สึกแฮ็คนิดหน่อยขอให้ constraintLayout มีฟังก์ชัน 'center'
Aswin G

20

อาจเป็นเพราะฉันไม่เข้าใจปัญหาอย่างเต็มที่ แต่การจัดมุมมองทั้งหมดไว้ตรงกลางใน ConstraintLayout ดูเหมือนง่ายมาก นี่คือสิ่งที่ฉันใช้:

<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="wrap_content"
android:layout_gravity="center">

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

สองบรรทัดสุดท้ายได้เคล็ดลับ!


และตอนนี้ถ้าเราต้องการมีมุมมองอื่น ๆ ที่ไม่อยู่ตรงกลางหน้าจอจะทำอย่างไร
K Pradeep Kumar Reddy

19
 <TextView
        android:id="@+id/tvName"
        style="@style/textViewBoldLarge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:text="Welcome"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"/>

12

คุณสามารถจัดสิ่งต่างๆให้เป็นศูนย์กลางได้อย่างง่ายดายด้วยการสร้างห่วงโซ่ ทำงานได้ทั้งแนวตั้งและแนวนอน

ลิงก์ไปยังเอกสารอย่างเป็นทางการเกี่ยวกับโซ่

แก้ไขเพื่อตอบความคิดเห็น :

<?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"
>
    <TextView
        android:id="@+id/first_score"
        android:layout_width="60dp"
        android:layout_height="wrap_content"
        android:text="10"
        app:layout_constraintEnd_toStartOf="@+id/second_score"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@+id/second_score"
        app:layout_constraintBottom_toTopOf="@+id/subtitle"
        app:layout_constraintHorizontal_chainStyle="spread"
        app:layout_constraintVertical_chainStyle="packed"
        android:gravity="center"
        />
    <TextView
        android:id="@+id/subtitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Subtitle"
        app:layout_constraintTop_toBottomOf="@+id/first_score"
        app:layout_constraintBottom_toBottomOf="@+id/second_score"
        app:layout_constraintStart_toStartOf="@id/first_score"
        app:layout_constraintEnd_toEndOf="@id/first_score"
        />
    <TextView
        android:id="@+id/second_score"
        android:layout_width="60dp"
        android:layout_height="120sp"
        android:text="243"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/thrid_score"
        app:layout_constraintStart_toEndOf="@id/first_score"
        app:layout_constraintTop_toTopOf="parent"
        android:gravity="center"
        />
    <TextView
        android:id="@+id/thrid_score"
        android:layout_width="60dp"
        android:layout_height="wrap_content"
        android:text="3200"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@id/second_score"
        app:layout_constraintTop_toTopOf="@id/second_score"
        app:layout_constraintBottom_toBottomOf="@id/second_score"
        android:gravity="center"
        />
</android.support.constraint.ConstraintLayout>

รหัสนี้ให้ผลลัพธ์นี้

คุณมีโซ่แนวนอน: first_score <=> second_score <=> third_score. second_scoreอยู่กึ่งกลางในแนวตั้ง คะแนนอื่น ๆ จะอยู่กึ่งกลางในแนวตั้งตามนั้น

คุณสามารถสร้างห่วงโซ่แนวตั้งfirst_score <=> subtitleและจัดให้อยู่กึ่งกลางได้อย่างแน่นอนsecond_score


ฉันลองใช้วิธีโซ่แล้วไม่ได้ผล โซ่ "ควบคุมโดยแอตทริบิวต์ที่กำหนดไว้ในองค์ประกอบแรกของโซ่ (" ส่วนหัว "ของโซ่)" สามารถตั้งค่าหัวโซ่เป็น "วิดเจ็ตซ้ายสุดสำหรับโซ่แนวนอนและวิดเจ็ตบนสุดสำหรับโซ่แนวตั้ง" คุณไม่สามารถตั้งค่ารายการตรงกลางเป็นหัวโซ่ซึ่งป้องกันไม่ให้จัดกึ่งกลางในแนวตั้งและแนวนอนในเวลาเดียวกัน
Ray Li

1
@RayLi ฉันแก้ไขคำตอบของฉันเพื่อแสดงให้คุณเห็นว่าฉันคิดอะไรอยู่
Kélian

ขอบคุณสำหรับการอัปเดตคำตอบและแสดงสิ่งที่คุณคิด เทคนิคนี้จะมีประโยชน์มาก!
Ray Li

5

ปุ่มสองปุ่มหนึ่งอยู่ตรงกลางด้านล่างทางด้านซ้าย

แสดงแบบกราฟิก

การจัดศูนย์กลางบนพาเรนต์ทำได้โดยการ จำกัด ทั้งสองด้านไว้ที่พาเรนต์ คุณสามารถ จำกัด วัตถุเพิ่มเติมจากวัตถุที่อยู่ตรงกลางได้

บันทึก. ลูกศรแต่ละลูกแทนแอตทริบิวต์ "app: layout_constraintXXX_toYYY =" (6 ในภาพ)


1

ฉันยังมีข้อกำหนดบางอย่างที่คล้ายกับมัน ฉันต้องการให้คอนเทนเนอร์อยู่ตรงกลางของหน้าจอและภายในคอนเทนเนอร์มีมุมมองมากมาย ต่อไปนี้คือโค้ดเลย์เอาต์ xml ที่นี่ฉันใช้เลย์เอาต์ข้อ จำกัด ที่ซ้อนกันเพื่อสร้างคอนเทนเนอร์ตรงกลางหน้าจอ

    <androidx.constraintlayout.widget.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:background="@drawable/gradient_background"
tools:context=".activities.AppInfoActivity">

<ImageView
    android:id="@+id/ivClose"
    android:layout_width="30dp"
    android:layout_height="30dp"
    android:layout_marginStart="20dp"
    android:layout_marginTop="20dp"
    android:src="@drawable/ic_round_close_24"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="300dp"
    android:layout_height="300dp"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintVertical_bias="0.5">

    <ImageView
        android:id="@+id/ivAppIcon"
        android:layout_width="100dp"
        android:layout_height="100dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:srcCompat="@drawable/dead" />

    <TextView
        android:id="@+id/tvAppName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Birds Shooter Plane"
        android:textAlignment="center"
        android:textSize="30sp"
        android:textStyle="bold"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/ivAppIcon" />

    <TextView
        android:id="@+id/tvAppVersion"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Version : 1.0"
        android:textAlignment="center"
        android:textSize="12sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/tvAppName" />

    <TextView
        android:id="@+id/tvDevelopedBy"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="25dp"
        android:text="Developed by"
        android:textAlignment="center"
        android:textSize="12sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/tvAppVersion" />

    <TextView
        android:id="@+id/tvDevelopedName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:text="K Pradeep Kumar Reddy"
        android:textAlignment="center"
        android:textSize="14sp"
        android:textStyle="bold"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/tvDevelopedBy" />

    <TextView
        android:id="@+id/tvContact"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:text="Contact : kpradeepkumarreddy@gmail.com"
        android:textAlignment="center"
        android:textSize="12sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/tvDevelopedName" />

    <TextView
        android:id="@+id/tvCheckForUpdate"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="25dp"
        android:text="@string/check_for_update"
        android:textAlignment="center"
        android:textSize="14sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/tvContact" />
</androidx.constraintlayout.widget.ConstraintLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

นี่คือภาพหน้าจอของเค้าโครง ป้อนคำอธิบายภาพที่นี่

วิธีแก้ปัญหาอื่นคือการลบเค้าโครงข้อ จำกัด ที่ซ้อนกันและเพิ่มแอตทริบิวต์ constraint_vertical_bias = 0.5 ให้กับองค์ประกอบด้านบนที่อยู่ตรงกลางของเค้าโครง ฉันคิดว่าสิ่งนี้เรียกว่าเป็นการเชื่อมโยงมุมมอง

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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:background="@drawable/gradient_background"
tools:context=".activities.AppInfoActivity">

<ImageView
android:id="@+id/ivClose"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_marginStart="20dp"
android:layout_marginTop="20dp"
android:src="@drawable/ic_round_close_24"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<ImageView
android:id="@+id/ivAppIcon"
android:layout_width="100dp"
android:layout_height="100dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.5"
app:srcCompat="@drawable/dead" />

<TextView
android:id="@+id/tvAppName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/app_display_name"
android:textAlignment="center"
android:textSize="30sp"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/ivAppIcon" />

<TextView
android:id="@+id/tvAppVersion"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/version"
android:textAlignment="center"
android:textSize="12sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tvAppName" />

<TextView
android:id="@+id/tvDevelopedBy"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="25dp"
android:text="@string/developed_by"
android:textAlignment="center"
android:textSize="12sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tvAppVersion" />

<TextView
android:id="@+id/tvDevelopedName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:text="@string/developer_name"
android:textAlignment="center"
android:textSize="14sp"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tvDevelopedBy" />

<TextView
android:id="@+id/tvContact"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:text="@string/developer_email"
android:textAlignment="center"
android:textSize="12sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tvDevelopedName" />
<TextView
android:id="@+id/tvCheckForUpdate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="25dp"
android:text="@string/check_for_update"
android:textAlignment="center"
android:textSize="14sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tvContact" />
</androidx.constraintlayout.widget.ConstraintLayout>

นี่คือภาพหน้าจอของเค้าโครง ป้อนคำอธิบายภาพที่นี่

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