ความแตกต่างระหว่าง ConstraintLayout และ RelativeLayout


219

ฉันกำลังสับสนเกี่ยวกับความแตกต่างระหว่างและConstraintLayout RelativeLayoutใครช่วยกรุณาบอกความแตกต่างที่แน่นอนระหว่างพวกเขา?


9
ConstraintLayout ได้รับการออกแบบมาเป็นหลักสำหรับโปรแกรมเมอร์ใหม่เพื่อให้พวกเขาสามารถออกแบบเลย์เอาต์ได้อย่างง่ายดายโดยใช้ Visual Editor แทนการสร้างเลย์เอาต์ด้วยมือผ่าน XML
CopsOnRoad

1
@ แจ็คแน่นอนว่ามันยังมีจุดประสงค์ที่มากขึ้นสำหรับผู้พัฒนามืออาชีพที่มีประสบการณ์
Moses Aprico

@MosesAprico คุณพูดถูก แต่ผมคิดว่า devs ผู้เชี่ยวชาญเก๋าแล้วมีจำนวนมากของวิธีการอื่น ๆ (พวกเขารู้อยู่แล้วว่าชอบRealtiveLayout, LinearLayout, GridLayoutฯลฯ ) ที่จะได้รับลำดับชั้นมุมมองที่พวกเขาต้องการ
CopsOnRoad

5
@CopsOnRoad ที่จริงคุณผิด Apple ได้ทำเลย์เอาท์ จำกัด มานานกว่า 5 ปี คุณได้รับการออกแบบที่ตอบสนองทุกขนาดและไม่ต้องเขียนเค้าโครงที่ซับซ้อนมากมาย เมื่อคุณเริ่มผูกหลายมุมมองคุณจะต้องมี 3 ตัวควบคุมพื้นฐานเพื่อสร้างการตอบสนองที่สมบูรณ์
Nick Turner

คำตอบ:


145

ความตั้งใจที่ConstraintLayoutจะเพิ่มประสิทธิภาพและลดลำดับชั้นมุมมองของเลย์เอาต์ของคุณโดยใช้กฎบางอย่างกับแต่ละมุมมองเพื่อหลีกเลี่ยงการซ้อน

กฎเตือนคุณRelativeLayoutเช่นการตั้งค่าด้านซ้ายไปทางซ้ายของมุมมองอื่น ๆ

app:layout_constraintBottom_toBottomOf="@+id/view1"

ซึ่งแตกต่างจากRelativeLayout, ConstraintLayoutข้อเสนอbiasค่าที่จะใช้ในการวางตำแหน่งของมุมมองในแง่ของ 0% และ 100% แนวนอนและแนวชดเชยเทียบกับที่จับได้ (มีเครื่องหมายวงกลม) ร้อยละเหล่านี้ (และเศษส่วน) นำเสนอการจัดตำแหน่งมุมมองที่ไร้รอยต่อในความหนาแน่นและขนาดของหน้าจอที่แตกต่างกัน

app:layout_constraintHorizontal_bias="0.33" <!-- from 0.0 to 1.0 -->
app:layout_constraintVertical_bias="0.53" <!-- from 0.0 to 1.0 -->

จุดจับพื้นฐาน (ท่อยาวที่มีมุมโค้งมนด้านล่างจุดจับวงกลม) ใช้เพื่อจัดเรียงเนื้อหาของมุมมองด้วยการอ้างอิงมุมมองอื่น

ที่จับสี่เหลี่ยม (ที่มุมของแต่ละมุมมอง) ถูกใช้เพื่อปรับขนาดมุมมองเป็น dps

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

นี่คือความคิดเห็นทั้งหมดและความประทับใจของฉัน ConstraintLayout


9
เรายังสามารถสร้างเลย์เอาต์แบบเรียบได้โดยใช้ RelativeLayout นั่นเป็นสาเหตุที่ฉันสับสนที่ ConstraintLayout ดูแลที่ RelativeLayout ไม่ได้

7
RelativeLayout เป็นรูปแบบสองรอบที่ทุกข์ทรมานจากการเก็บภาษีซ้ำซ้อน จะต้องวัด / จัดวางอย่างน้อยสองครั้ง ข้อ จำกัด เค้าโครงไม่ได้รับโทษประสิทธิภาพนี้
Christopher Perry

5
@ ไม่มีอะไรเลยเรายังสามารถสร้างเลย์เอาต์ได้โดยใช้ RelativeLayout แต่นอกเหนือจากการที่ทุกคนกล่าวถึงที่นี่ ConstraintLayout ช่วยให้คุณใช้อัตรากำไรขั้นต้นในทางลบและsubviews ขนาดในอัตราส่วนที่กำหนดไว้ล่วงหน้า สุดท้ายคือวิธีที่มีประสิทธิภาพที่สุดในการรักษาอัตราส่วน 16: 9 สำหรับ ImageView ของคุณใน CardView ตามการออกแบบวัสดุ
Eugene Brusov

4
มีเลย์เอาต์บางอย่างที่เป็นไปไม่ได้ใน RelativeLayout เว้นแต่ว่าคุณซ้อน LinearLayout หรือ RelativeLayout อื่น ตัวอย่างเช่น: การจัดกึ่งกลาง "สแต็ก" ของ 3 การเข้าชมในแนวตั้งสัมพันธ์กับมุมมองอื่น
Gak2

@ Gak2 ฉันไม่เห็นอะไรที่เป็นไปไม่ได้ในตัวอย่างของคุณหากไม่มีเลย์เอาต์ซ้อนกัน บางทีคุณอาจหมายถึงอย่างอื่นด้วย "กองซ้อน" มากกว่าที่ฉันทำ ฉันเพียงแค่ใช้ "layout_alignEnd", "layout_below", "รูปแบบ _..." และสามารถสร้างชนิดของสแต็คใด ๆ กับมัน ...
เหลือเชื่อ ม.ค.

81

รูปแบบที่สัมพันธ์กันและคุณสมบัติที่เทียบเท่าของเค้าร่างข้อ จำกัด

รูปแบบที่สัมพันธ์กันและคุณสมบัติที่เทียบเท่าของเค้าร่างข้อ จำกัด

(1) เค้าโครงญาติ:

android:layout_centerInParent="true"    

(1) โครงร่างข้อ จำกัด เทียบเท่า:

app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"

(2) เค้าโครงญาติ:

android:layout_centerHorizontal="true"

(2) โครงร่างข้อ จำกัด เทียบเท่า:

app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintEnd_toEndOf="parent"

(3) เค้าโครงญาติ:

android:layout_centerVertical="true"    

(3) รูปแบบข้อ จำกัด ที่เทียบเท่า:

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

(4) เค้าโครงญาติ:

android:layout_alignParentLeft="true"   

(4) โครงร่างข้อ จำกัด เทียบเท่า:

app:layout_constraintLeft_toLeftOf="parent"

(5) เค้าโครงญาติ:

android:layout_alignParentStart="true"

(5) รูปแบบข้อ จำกัด ที่เทียบเท่า:

app:layout_constraintStart_toStartOf="parent"

(6) เค้าโครงญาติ:

android:layout_alignParentRight="true"

(6) รูปแบบข้อ จำกัด ที่เทียบเท่า:

app:layout_constraintRight_toRightOf="parent"

(7) เค้าโครงญาติ:

android:layout_alignParentEnd="true"    

(7) รูปแบบข้อ จำกัด ที่เทียบเท่า:

app:layout_constraintEnd_toEndOf="parent"

(8) เค้าโครงญาติ:

android:layout_alignParentTop="true"

(8) รูปแบบข้อ จำกัด ที่เทียบเท่า:

app:layout_constraintTop_toTopOf="parent"

(9) เค้าโครงญาติ:

android:layout_alignParentBottom="true" 

(9) รูปแบบข้อ จำกัด ที่เทียบเท่า:

app:layout_constraintBottom_toBottomOf="parent"

(10) เค้าโครงญาติ:

android:layout_alignStart="@id/view"

(10) รูปแบบข้อ จำกัด ที่เทียบเท่า:

app:layout_constraintStart_toStartOf="@id/view"

(11) เค้าโครงญาติ:

android:layout_alignLeft="@id/view" 

(11) รูปแบบข้อ จำกัด ที่เทียบเท่า:

app:layout_constraintLeft_toLeftOf="@id/view"

(12) เค้าโครงญาติ:

android:layout_alignEnd="@id/view"  

(12) รูปแบบข้อ จำกัด ที่เทียบเท่า:

app:layout_constraintEnd_toEndOf="@id/view"

(13) เค้าโครงญาติ:

android:layout_alignRight="@id/view"

(13) รูปแบบข้อ จำกัด ที่เทียบเท่า:

app:layout_constraintRight_toRightOf="@id/view"

(14) เค้าโครงญาติ:

android:layout_alignTop="@id/view"  

(14) รูปแบบข้อ จำกัด ที่เทียบเท่า:

app:layout_constraintTop_toTopOf="@id/view"

(15) เค้าโครงญาติ:

android:layout_alignBaseline="@id/view" 

(15) รูปแบบข้อ จำกัด ที่เทียบเท่า:

app:layout_constraintBaseline_toBaselineOf="@id/view"

(16) เค้าโครงญาติ:

android:layout_alignBottom="@id/view"

(16) รูปแบบข้อ จำกัด ที่เทียบเท่า:

app:layout_constraintBottom_toBottomOf="@id/view"

(17) เค้าโครงญาติ:

android:layout_toStartOf="@id/view"

(17) รูปแบบข้อ จำกัด ที่เทียบเท่า:

app:layout_constraintEnd_toStartOf="@id/view"

(18) เค้าโครงญาติ:

android:layout_toLeftOf="@id/view"  

(18) โครงร่างข้อ จำกัด เทียบเท่า:

app:layout_constraintRight_toLeftOf="@id/view"

(19) เค้าโครงญาติ:

android:layout_toEndOf="@id/view"

(19) โครงร่างข้อ จำกัด เทียบเท่า:

app:layout_constraintStart_toEndOf="@id/view"

(20) เค้าโครงญาติ:

android:layout_toRightOf="@id/view"

(20) รูปแบบข้อ จำกัด ที่เทียบเท่า:

app:layout_constraintLeft_toRightOf="@id/view"

(21) เค้าโครงญาติ:

android:layout_above="@id/view" 

(21) รูปแบบข้อ จำกัด ที่เทียบเท่า:

app:layout_constraintBottom_toTopOf="@id/view"

(22) เค้าโครงญาติ:

android:layout_below="@id/view" 

(22) รูปแบบข้อ จำกัด ที่เทียบเท่า:

app:layout_constraintTop_toBottomOf="@id/view"


2
คุณสามารถโพสต์เป็นข้อความแทนที่จะเป็นรูปภาพได้หรือไม่? มันจะมีประโยชน์มากสำหรับฉันและคนอื่น ๆ ในอนาคต
นักพัฒนาใหม่

3
ทุกคนเริ่มเรียนรู้ข้อ จำกัด เลย์เอาต์ต้องเห็นสิ่งนี้ ขอบคุณ
grantespo

1
นี่เป็นข้อมูลที่เป็นประโยชน์ แต่เป็นเพียงเอกสารคู่มือและไม่ได้ทำอะไรเลยเพื่ออธิบายความแตกต่างระหว่างสิ่งเหล่านั้น
YetAnotherRandomUser

1
ไม่ฉันไม่มีเวลาดูเอกสารนี่มีประโยชน์แน่นอน และเขียนเป็นภาษาง่าย ๆ Upvoting
CodeToLife

46

รายงานโดย@davidpbr ConstraintLayoutประสิทธิภาพ

ผมทำสองรูปแบบที่คล้ายกัน 7 ลูกหนึ่งแต่ละคนมีผู้ปกครองและConstraintLayout RelativeLayoutขึ้นอยู่กับเครื่องมือติดตามวิธี Android Studio จะConstraintLayoutใช้เวลาใน onMeasure มากขึ้นและทำงานเพิ่มเติมonFinishInflateได้

ห้องสมุดที่ใช้ ( support-v4, appcompat-v7…):

com.android.support.constraint:constraint-layout:1.0.0-alpha1

รุ่นอุปกรณ์ / Android สร้างซ้ำเมื่อ: Samsung Galaxy S6 (SM-G920A. ขออภัยไม่มี Nexus atm) Android 5.0.2

การเปรียบเทียบการติดตามเมธอดด่วน:

1

ตัวอย่าง repo Github: https://github.com/OnlyInAmerica/ConstraintLayoutPerf


จากปัญหาเดียวกัน: ตอนนี้ฉันจะปิดตัวนี้แล้ว - อัลฟา 4/5 นำมาปรับปรุงประสิทธิภาพบ้างเล็กน้อย เราอาจจะสามารถปรับปรุงได้มากขึ้น แต่นั่นอาจจะรอการโพสต์ 1.0
Oleksandr

คุณช่วยอธิบายเกี่ยวกับเครื่องมือที่คุณใช้เพื่อสร้างการเปรียบเทียบที่ยอดเยี่ยมนี้ได้ไหม?
Nativ

2
@Nativ Monotirs-> CPU-> ไอคอนตัวติดตามเวลา
Andrey T

18
เรียกใช้และทำโปรไฟล์แบบเดียวกันกับข้อ จำกัด เลย์เอาต์: 1.0.1 บน Nexus 5 พร้อม Android 6.0.1 ที่นี่ผลลัพธ์: รูปแบบสัมพัทธ์ - เริ่มต้น 2 มิลลิวินาทีในการวัด 30ms + 16ms = 62ms บน Layouyt 7ms = 9ms ทั้งหมด 54 ms เลย์เอาต์ข้อ จำกัด 7ms สร้าง params เลย์เอาต์ + เพิ่มมุมมอง ~ 7 * 2ms = 14ms ในการวัด 60ms + 52ms ~ 112ms บนเลย์เอาต์ 8ms รวม ~ 141ms การเริ่มต้นครั้งแรกของโครงร่างแบบสัมพันธ์เกือบเร็วกว่าข้อ จำกัด สามเท่า
Andrey T

2
มีการแนะนำเค้าโครงข้อ จำกัด เพื่อลดลำดับชั้นมุมมองซ้อน ดังนั้นลำดับชั้นที่น้อยลงหมายถึงเวลาที่น้อยลงในการข้ามจากบนลงล่างในแผนผังมุมมอง ดังนั้นอะไรคือจุดที่ทำให้ลำดับชั้นมุมมองแบบซ้อนที่อาจไม่จำเป็นในโครงร่างข้อ จำกัด และเปรียบเทียบกับเค้าโครงแบบสัมพันธ์ที่คุณมีโอกาสมากขึ้นที่จะจบลงด้วยโครงสร้างแบบซ้อน
codepeaker

27

ต่อไปนี้เป็นข้อแตกต่าง / ข้อดี:

  1. โครงร่างข้อ จำกัด มีอำนาจสองเท่าของทั้งเค้าโครงสัมพันธ์และเค้าโครงเชิงเส้น: กำหนดตำแหน่งสัมพัทธ์ของมุมมอง (เช่นเค้าโครงญาติ) และตั้งค่าน้ำหนักสำหรับ UI แบบไดนามิก (ซึ่งเป็นไปได้เฉพาะใน Linear Layout)

  2. การใช้งานที่ทรงพลังมากคือการจัดกลุ่มองค์ประกอบโดยสร้างห่วงโซ่ วิธีนี้เราสามารถสร้างกลุ่มของมุมมองที่สามารถวางทั้งหมดในลักษณะที่ต้องการโดยไม่ต้องเพิ่มเลเยอร์ของลำดับชั้นอีกเพียงเพื่อสร้างกลุ่มของมุมมองอื่น

  3. นอกเหนือจากน้ำหนักแล้วเรายังสามารถใช้อคติในแนวนอนและแนวตั้งซึ่งไม่ได้เป็นอะไรนอกจากเปอร์เซ็นต์ของการกระจัดจากศูนย์กลาง (อคติจาก 0.5 หมายถึงการจัดตำแหน่งส่วนกลางค่าใด ๆ ที่น้อยกว่าหรือมากกว่าหมายถึงการเคลื่อนไหวที่สอดคล้องกันในทิศทางที่เกี่ยวข้อง)

  4. คุณสมบัติที่สำคัญอีกอย่างหนึ่งก็คือมันเคารพและให้ฟังก์ชันการทำงานในการจัดการมุมมอง GONE เพื่อให้เค้าโครงไม่แตกถ้ามุมมองบางชุดถูกตั้งค่าเป็น GONE ผ่านโค้ดจาวา ดูข้อมูลเพิ่มเติมได้ที่นี่: https://developer.android.com/reference/android/support/constraint/ConstraintLayout.html#VisibilityBehavior

  5. ให้พลังของข้อ จำกัด โดยอัตโนมัติโดยใช้เครื่องมือ Blue print และ Visual Editor ซึ่งทำให้การออกแบบหน้าง่ายขึ้น

คุณสมบัติทั้งหมดเหล่านี้นำไปสู่ความเรียบของลำดับชั้นการดูซึ่งปรับปรุงประสิทธิภาพและช่วยในการสร้าง UI แบบตอบสนองและแบบไดนามิกซึ่งสามารถปรับให้เข้ากับขนาดและความหนาแน่นของหน้าจอที่แตกต่างกันได้ง่ายขึ้น

ที่นี่เป็นสถานที่ที่ดีที่สุดในการเรียนรู้อย่างรวดเร็ว: https://codelabs.developers.google.com/codelabs/constraint-layout/#0


6) ConstraintLayout ทำให้มันเป็นไปได้ที่จะ subviews ขนาดในอัตราส่วนที่กำหนดไว้ล่วงหน้าmedium.com/google-developers/... มันจะมีประโยชน์เช่นเมื่อคุณจะรักษา ImageView ของคุณไว้ใน 16: 9
Eugene Brusov

15

ข้อแตกต่างที่สำคัญคือ ConstraintLayout เคารพข้อ จำกัด แม้ว่ามุมมองจะหายไป ดังนั้นมันจะไม่ทำลายเลย์เอาต์ถ้าคุณมีเชนและคุณต้องการทำให้มุมมองหายไปตรงกลาง


คุณสามารถยกตัวอย่างให้ฉันได้ไหม สมมติว่ามี 3 ปุ่ม ฉันจะซ่อนปุ่มที่ 2 และปุ่มที่ 3 ติดกับปุ่มที่ 2 โดยใช้รหัสเป็น btn2 สมมติว่าฉันซ่อนปุ่มที่ 2 จากนั้นปุ่มที่ 3 จะหารหัสของปุ่มที่ 2 ได้อย่างไร

1
ที่ไม่เป็นความจริง. หากคุณตั้งค่าการเปิดเผยปุ่มเป็น "มองไม่เห็น" แทนที่จะเป็น "GONE" คุณจะไม่ฝ่าฝืนข้อ จำกัด สำหรับฉันความแตกต่างที่ยิ่งใหญ่ที่สุดที่ @Nikola กล่าวคือความลำเอียงที่ช่วยให้คุณสร้างมุมมอง "ตอบสนอง" ได้มากขึ้น
zapotec

@ ไม่มีอะไรเลยสมมติว่าปุ่มอยู่ใต้กัน แม้ว่าคุณจะซ่อน tButton 2 มันยังคงอยู่ใน "ดูสัญญา" ไม่ว่าจะเป็นใน xml หรือรหัสของคุณ ข้อ จำกัด เค้าโครงจะเคารพมันและปุ่ม 3 จะอยู่ภายใต้ปุ่ม 1 ในส่วนที่เกี่ยวข้องปุ่มเลย์เอาท์ 2 หายไปข้อ จำกัด นั้นจะหายไปดังนั้นปุ่ม 3 จะอยู่ในตำแหน่งเริ่มต้นดังนั้นด้านบนซ้ายของหน้าจอ
Herrbert74

@zapotec ฉันเคารพสิ่งอื่น ๆ ที่สำคัญสำหรับคุณ แต่สำหรับฉันนี่คือความแตกต่างที่ยอดเยี่ยมจริงๆ แก้ไขสิ่งเดียวที่ฉันเกลียดใน RelativeLayout การใช้ล่องหนไม่ใช่ตัวเลือกเนื่องจากมันจะอ้างสิทธิ์ในพื้นที่
Herrbert74

7

นอกจากคำตอบ @ dhaval-jivani

ฉันได้อัปเดตโครงการgithubโครงการเป็นเวอร์ชันล่าสุดของโครงร่างข้อ จำกัด v.1.1.0-beta3

ฉันวัดและเปรียบเทียบเวลาของวิธีการ onCreate และเวลาระหว่างการเริ่มต้นของ onCreate และสิ้นสุดการดำเนินการของวิธี preformDraw ครั้งล่าสุดซึ่งมองเห็นได้ในจอภาพ CPU การทดสอบทั้งหมดทำบน Samsung S5 mini พร้อม android 6.0.1 ที่นี่ผลลัพธ์:

เริ่มต้นใหม่ (การเปิดหน้าจอแรกหลังจากเปิดแอปพลิเคชัน)

เค้าโครงญาติ

OnCreate: 123ms

เวลา preformDraw ล่าสุด - เวลาสร้างเมื่อ: 311.3 มิลลิวินาที

เค้าโครงข้อ จำกัด

บนสร้าง: 120.3ms

เวลา preformDraw ล่าสุด - เวลาสร้างเมื่อ: 310ms

นอกจากนั้นผมได้ตรวจสอบการทดสอบประสิทธิภาพจากนี้บทความ , ที่นี่รหัส และพบว่าในจำนวนห่วงน้อยกว่า 100 รูปแบบข้อ จำกัด ที่แตกต่างกันได้เร็วขึ้นระหว่างการดำเนินการพองวัดและรูปแบบจากนั้นสายพันธุ์ที่มีเค้าโครงญาติ และบนอุปกรณ์ Android รุ่นเก่าเช่น Samsung S3 ที่มี Android 4.3 ความแตกต่างก็ใหญ่กว่า

โดยสรุปฉันเห็นด้วยกับความคิดเห็นจากบทความ :

การปรับโครงสร้างมุมมองเก่าเปลี่ยนจาก RelativeLayout หรือ LinearLayout เป็นมูลค่าหรือไม่

เช่นเคย: ขึ้นอยู่กับ🙂

ฉันจะไม่ปรับโครงสร้างอะไรเลยนอกจากคุณจะมีปัญหาด้านประสิทธิภาพกับลำดับชั้นการจัดวางปัจจุบันหรือคุณต้องการเปลี่ยนแปลงเค้าโครงอย่างมีนัยสำคัญ แม้ว่าฉันจะไม่ได้วัดมันเมื่อเร็ว ๆ นี้ แต่ฉันไม่พบปัญหาเรื่องประสิทธิภาพในการออกรุ่นล่าสุด ดังนั้นฉันคิดว่าคุณควรจะใช้มันอย่างปลอดภัย แต่ - อย่างที่ฉันพูดไว้ - ไม่เพียง แต่โยกย้ายเพื่อการโยกย้าย ทำเช่นนั้นหากมีความต้องการและได้รับประโยชน์จากมัน สำหรับเลย์เอาต์ใหม่ฉันเกือบจะใช้ ConstraintLayout มันดีกว่ามากเมื่อเทียบกับสิ่งที่เรามีมาก่อน



6

คำถามจริงที่ถามคือมีเหตุผลที่จะใช้รูปแบบอื่นนอกเหนือจากรูปแบบข้อ จำกัด หรือไม่ ฉันเชื่อว่าคำตอบอาจจะไม่

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

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

พวกเขากลับสับสนเล็กน้อยในกลางปี ​​2559 ซึ่งตัวแก้ไขเลย์เอาท์แบบวิชวลนั้นไม่ดีพอ แต่พวกเขามาถึงจุดที่หากคุณมีเลย์เอาต์เลยคุณอาจต้องการพิจารณาใช้รูปแบบข้อ จำกัด อย่างจริงจังแม้กระทั่ง เมื่อมันจะเป็นสิ่งเดียวกันเป็นหรือแม้กระทั่งการที่เรียบง่ายRelativeLayout ชัดเจนยังคงมีวัตถุประสงค์ของพวกเขา แต่ฉันไม่เห็นการสร้างสิ่งอื่นในตอนนี้ หากพวกเขาเริ่มต้นด้วยสิ่งนี้พวกเขาจะไม่ได้เพิ่มอะไรอีกLinearLayoutFrameLayouts


1
มีหลักฐานใดที่เร็วขึ้นหรือไม่
Rajesh Nasit

1
ใช่. มันเร็วกว่า เลย์เอาต์ลงในตัวแก้ปัญหาเดียวแทนที่จะวนซ้ำผ่านต้นไม้ สำหรับทุกสิ่งส่วนใหญ่มันจะไม่สำคัญเพราะมันทำที่การเรียกร้องให้เค้าโครง แต่สิ่งที่ดูต้นไม้ในขณะที่ง่ายสร้างมุมมองมากมายในมุมมองที่ต้องมีการโทรที่ต้องใช้สาย ในขณะที่มันใช้งานได้ดีกว่าในทางทฤษฎีในทางปฏิบัติการจัดวางเลย์เอาต์ในโค้ดหนึ่งบิตนั้นง่ายกว่าการวนซ้ำผ่านทรีวิวทั้งหมด มันจะน่าประทับใจยิ่งขึ้นด้วยมุมมองที่มากขึ้น แต่นี่เป็นเกณฑ์มาตรฐานตั้งแต่เดือนพฤษภาคม: medium.com/@krpiotrek/constraintlayout-performance-c1455c7984d7
Tatarize

ฉันกำลังเผชิญกับคำถามอื่นฉันควรแทนที่ Relativelayouts ที่มีอยู่ทั้งหมดในแอพที่ฉันกำลังทำงานอยู่หรือไม่ มันจะปรับปรุงประสิทธิภาพอย่างมากหรือไม่
Sreekanth Karumanaghat

@SananthanKarumanaghat ดูเหมือนว่าคุณจะไม่ย้อนเวลากลับไปแทนที่การเปลี่ยนเวลาจะช่วยคุณได้ เรากำลังพูดถึง 3.5ms รอบลดลงถึง 3.25ms ในกรณีส่วนใหญ่ ถ้ามันให้คุณสมบัติพิเศษหรือสิ่งที่คุณต้องการแน่นอน แต่หมดจดในพื้นที่ความเร็ว nah แม้ว่าเรากำลังพูดถึงการกดปุ่มแปลง
Tatarize

5

บทสรุปที่ฉันสามารถทำได้คือ

1) เราสามารถออกแบบ UI ได้โดยไม่ต้องแตะส่วน xmlเพื่อความซื่อสัตย์ฉันรู้สึกว่าGoogle ได้คัดลอกว่า UI ได้รับการออกแบบในแอป iOSมันจะสมเหตุสมผลถ้าคุณคุ้นเคยกับการพัฒนา UI ใน iOS แต่ในรูปแบบสัมพัทธ์ ยากที่จะตั้งข้อ จำกัด โดยไม่ต้องสัมผัสการออกแบบของ

2) ประการที่สองมีลำดับชั้นมุมมองแบบแบนซึ่งแตกต่างจากเค้าโครงอื่น ๆ ดังนั้นจึงมีประสิทธิภาพที่ดีกว่าเค้าโครงที่สัมพันธ์กันซึ่งคุณอาจเห็นจากคำตอบอื่น ๆ

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

ฉันกำลังพูดอีกครั้งการออกแบบ UI โดยใช้รูปแบบข้อ จำกัด เหมือนกับการออกแบบ UI ใน iOS ดังนั้นในอนาคตถ้าคุณทำงานบน iOS คุณจะพบว่าง่ายขึ้นถ้าคุณใช้เค้าโครงข้อ จำกัด


1

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

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