ฉันกำลังสับสนเกี่ยวกับความแตกต่างระหว่างและConstraintLayout
RelativeLayout
ใครช่วยกรุณาบอกความแตกต่างที่แน่นอนระหว่างพวกเขา?
RealtiveLayout
, LinearLayout
, GridLayout
ฯลฯ ) ที่จะได้รับลำดับชั้นมุมมองที่พวกเขาต้องการ
ฉันกำลังสับสนเกี่ยวกับความแตกต่างระหว่างและConstraintLayout
RelativeLayout
ใครช่วยกรุณาบอกความแตกต่างที่แน่นอนระหว่างพวกเขา?
RealtiveLayout
, LinearLayout
, GridLayout
ฯลฯ ) ที่จะได้รับลำดับชั้นมุมมองที่พวกเขาต้องการ
คำตอบ:
ความตั้งใจที่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
รูปแบบที่สัมพันธ์กันและคุณสมบัติที่เทียบเท่าของเค้าร่างข้อ จำกัด
(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"
รายงานโดย@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
การเปรียบเทียบการติดตามเมธอดด่วน:
ตัวอย่าง repo Github: https://github.com/OnlyInAmerica/ConstraintLayoutPerf
ต่อไปนี้เป็นข้อแตกต่าง / ข้อดี:
โครงร่างข้อ จำกัด มีอำนาจสองเท่าของทั้งเค้าโครงสัมพันธ์และเค้าโครงเชิงเส้น: กำหนดตำแหน่งสัมพัทธ์ของมุมมอง (เช่นเค้าโครงญาติ) และตั้งค่าน้ำหนักสำหรับ UI แบบไดนามิก (ซึ่งเป็นไปได้เฉพาะใน Linear Layout)
การใช้งานที่ทรงพลังมากคือการจัดกลุ่มองค์ประกอบโดยสร้างห่วงโซ่ วิธีนี้เราสามารถสร้างกลุ่มของมุมมองที่สามารถวางทั้งหมดในลักษณะที่ต้องการโดยไม่ต้องเพิ่มเลเยอร์ของลำดับชั้นอีกเพียงเพื่อสร้างกลุ่มของมุมมองอื่น
นอกเหนือจากน้ำหนักแล้วเรายังสามารถใช้อคติในแนวนอนและแนวตั้งซึ่งไม่ได้เป็นอะไรนอกจากเปอร์เซ็นต์ของการกระจัดจากศูนย์กลาง (อคติจาก 0.5 หมายถึงการจัดตำแหน่งส่วนกลางค่าใด ๆ ที่น้อยกว่าหรือมากกว่าหมายถึงการเคลื่อนไหวที่สอดคล้องกันในทิศทางที่เกี่ยวข้อง)
คุณสมบัติที่สำคัญอีกอย่างหนึ่งก็คือมันเคารพและให้ฟังก์ชันการทำงานในการจัดการมุมมอง GONE เพื่อให้เค้าโครงไม่แตกถ้ามุมมองบางชุดถูกตั้งค่าเป็น GONE ผ่านโค้ดจาวา ดูข้อมูลเพิ่มเติมได้ที่นี่: https://developer.android.com/reference/android/support/constraint/ConstraintLayout.html#VisibilityBehavior
ให้พลังของข้อ จำกัด โดยอัตโนมัติโดยใช้เครื่องมือ Blue print และ Visual Editor ซึ่งทำให้การออกแบบหน้าง่ายขึ้น
คุณสมบัติทั้งหมดเหล่านี้นำไปสู่ความเรียบของลำดับชั้นการดูซึ่งปรับปรุงประสิทธิภาพและช่วยในการสร้าง UI แบบตอบสนองและแบบไดนามิกซึ่งสามารถปรับให้เข้ากับขนาดและความหนาแน่นของหน้าจอที่แตกต่างกันได้ง่ายขึ้น
ที่นี่เป็นสถานที่ที่ดีที่สุดในการเรียนรู้อย่างรวดเร็ว: https://codelabs.developers.google.com/codelabs/constraint-layout/#0
ข้อแตกต่างที่สำคัญคือ ConstraintLayout เคารพข้อ จำกัด แม้ว่ามุมมองจะหายไป ดังนั้นมันจะไม่ทำลายเลย์เอาต์ถ้าคุณมีเชนและคุณต้องการทำให้มุมมองหายไปตรงกลาง
นอกจากคำตอบ @ 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 มันดีกว่ามากเมื่อเทียบกับสิ่งที่เรามีมาก่อน
อย่างเป็นทางการConstraintLayout
เป็นได้เร็วขึ้นมาก
ในรุ่น N ของ Android
ConstraintLayout
คลาสมีฟังก์ชันการทำงานที่คล้ายกันRelativeLayout
แต่มีต้นทุนที่ต่ำกว่ามาก
คำถามจริงที่ถามคือมีเหตุผลที่จะใช้รูปแบบอื่นนอกเหนือจากรูปแบบข้อ จำกัด หรือไม่ ฉันเชื่อว่าคำตอบอาจจะไม่
สำหรับผู้ที่ยืนยันว่าพวกเขามุ่งเป้าไปที่โปรแกรมเมอร์มือใหม่หรือชอบพวกเขาควรให้เหตุผลบางอย่างสำหรับพวกเขาที่จะด้อยกว่ารูปแบบอื่น ๆ
รูปแบบข้อ จำกัด ดีกว่าในทุก ๆ ด้าน (มีราคา 150k ในขนาด APK) พวกมันเร็วกว่าง่ายกว่าพวกมันยืดหยุ่นกว่าพวกมันตอบสนองต่อการเปลี่ยนแปลงได้ดีกว่าพวกเขาแก้ไขปัญหาเมื่อไอเทมหายไปพวกมันเข้ากันได้ดีกับประเภทหน้าจอที่ต่างกันอย่างมากและพวกเขาไม่ได้ใช้วนซ้อนกัน ดึงโครงสร้างต้นไม้ออกมาสำหรับทุกสิ่ง คุณสามารถใส่อะไรก็ได้ที่เกี่ยวกับอะไรก็ได้
พวกเขากลับสับสนเล็กน้อยในกลางปี 2559 ซึ่งตัวแก้ไขเลย์เอาท์แบบวิชวลนั้นไม่ดีพอ แต่พวกเขามาถึงจุดที่หากคุณมีเลย์เอาต์เลยคุณอาจต้องการพิจารณาใช้รูปแบบข้อ จำกัด อย่างจริงจังแม้กระทั่ง เมื่อมันจะเป็นสิ่งเดียวกันเป็นหรือแม้กระทั่งการที่เรียบง่ายRelativeLayout
ชัดเจนยังคงมีวัตถุประสงค์ของพวกเขา แต่ฉันไม่เห็นการสร้างสิ่งอื่นในตอนนี้ หากพวกเขาเริ่มต้นด้วยสิ่งนี้พวกเขาจะไม่ได้เพิ่มอะไรอีกLinearLayout
FrameLayouts
บทสรุปที่ฉันสามารถทำได้คือ
1) เราสามารถออกแบบ UI ได้โดยไม่ต้องแตะส่วน xmlเพื่อความซื่อสัตย์ฉันรู้สึกว่าGoogle ได้คัดลอกว่า UI ได้รับการออกแบบในแอป iOSมันจะสมเหตุสมผลถ้าคุณคุ้นเคยกับการพัฒนา UI ใน iOS แต่ในรูปแบบสัมพัทธ์ ยากที่จะตั้งข้อ จำกัด โดยไม่ต้องสัมผัสการออกแบบของ
2) ประการที่สองมีลำดับชั้นมุมมองแบบแบนซึ่งแตกต่างจากเค้าโครงอื่น ๆ ดังนั้นจึงมีประสิทธิภาพที่ดีกว่าเค้าโครงที่สัมพันธ์กันซึ่งคุณอาจเห็นจากคำตอบอื่น ๆ
3) นอกจากนี้ยังมีสิ่งพิเศษนอกเหนือจากเค้าโครงแบบสัมพันธ์เช่นการวางตำแหน่งแบบสัมพันธ์แบบวงกลมซึ่งเราสามารถวางตำแหน่งมุมมองอื่นที่สัมพันธ์กับมุมมองนี้ในรัศมีที่แน่นอนด้วยมุมที่ไม่สามารถทำในรูปแบบที่สัมพันธ์กัน
ฉันกำลังพูดอีกครั้งการออกแบบ UI โดยใช้รูปแบบข้อ จำกัด เหมือนกับการออกแบบ UI ใน iOS ดังนั้นในอนาคตถ้าคุณทำงานบน iOS คุณจะพบว่าง่ายขึ้นถ้าคุณใช้เค้าโครงข้อ จำกัด
ความแตกต่างเพียงอย่างเดียวที่ฉันสังเกตเห็นคือสิ่งต่าง ๆ ที่ตั้งอยู่ในเลย์เอาต์แบบสัมพัทธ์ผ่านการลากและวางโดยอัตโนมัติจะมีมิติข้อมูลที่สัมพันธ์กับองค์ประกอบอื่น ๆ ที่อนุมานดังนั้นเมื่อคุณเรียกใช้แอปสิ่งที่คุณเห็นคือสิ่งที่คุณได้รับ อย่างไรก็ตามในโครงร่างข้อ จำกัด แม้ว่าคุณจะลากและวางองค์ประกอบในมุมมองออกแบบเมื่อคุณเรียกใช้สิ่งต่าง ๆ ของแอปอาจถูกเลื่อนไปมา สิ่งนี้สามารถแก้ไขได้อย่างง่ายดายโดยการตั้งค่าข้อ จำกัด ด้วยตนเองหรือหากมีความเสี่ยงมากขึ้นในการคลิกขวาที่องค์ประกอบในโครงสร้างส่วนประกอบเลือกเมนูย่อยโครงร่างข้อ จำกัด แล้วคลิก 'สรุปข้อ จำกัด ' หวังว่านี่จะช่วยได้