Ich bin verwirrt über den Unterschied zwischen ConstraintLayout
und RelativeLayout
. Könnte mir bitte jemand die genauen Unterschiede zwischen ihnen erzählen?
219
Ich bin verwirrt über den Unterschied zwischen ConstraintLayout
und RelativeLayout
. Könnte mir bitte jemand die genauen Unterschiede zwischen ihnen erzählen?
RealtiveLayout
,LinearLayout
,GridLayout
usw.) , um die Ansichtshierarchie sie wollen zu bekommen.Antworten:
Ziel
ConstraintLayout
ist es, die Ansichtshierarchie Ihrer Layouts zu optimieren und zu reduzieren, indem Sie auf jede Ansicht einige Regeln anwenden, um eine Verschachtelung zu vermeiden.Regeln erinnern Sie
RelativeLayout
beispielsweise daran, wie Sie eine andere Ansicht von links nach links setzen.Im Gegensatz zu
RelativeLayout
,ConstraintLayout
bietetbias
Wert, der einen Blick auf die Position in Bezug auf 0% verwendet wird und 100% horizontal und vertikal versetzt zu den Griffen (mit Kreis markiert). Diese Prozentsätze (und Brüche) bieten eine nahtlose Positionierung der Ansicht über verschiedene Bildschirmdichten und -größen hinweg.Der Grundliniengriff (langes Rohr mit abgerundeten Ecken unterhalb des Kreisgriffs) wird verwendet, um den Inhalt der Ansicht an einer anderen Ansichtsreferenz auszurichten.
Quadratische Ziehpunkte (an jeder Ecke der Ansicht) werden verwendet, um die Größe der Ansicht in dps zu ändern.
Dies ist völlig meinungsbasiert und mein Eindruck von
ConstraintLayout
quelle
Äquivalente Eigenschaften für relatives Layout und Einschränkungslayout
(1) Relatives Layout:
(1) Äquivalent zum Einschränkungslayout:
(2) Relatives Layout:
(2) Äquivalent zum Einschränkungslayout:
(3) Relatives Layout:
(3) Äquivalent zum Einschränkungslayout:
(4) Relatives Layout:
(4) Äquivalent zum Einschränkungslayout:
(5) Relatives Layout:
(5) Äquivalent zum Einschränkungslayout:
(6) Relatives Layout:
(6) Äquivalent zum Einschränkungslayout:
(7) Relatives Layout:
(7) Äquivalent zum Einschränkungslayout:
(8) Relatives Layout:
(8) Äquivalent zum Einschränkungslayout:
(9) Relatives Layout:
(9) Äquivalent zum Einschränkungslayout:
(10) Relatives Layout:
(10) Äquivalent zum Einschränkungslayout:
(11) Relatives Layout:
(11) Äquivalent zum Einschränkungslayout:
(12) Relatives Layout:
(12) Äquivalent zum Einschränkungslayout:
(13) Relatives Layout:
(13) Äquivalent zum Einschränkungslayout:
(14) Relatives Layout:
(14) Äquivalent zum Einschränkungslayout:
(15) Relatives Layout:
(15) Äquivalent zum Einschränkungslayout:
(16) Relatives Layout:
(16) Äquivalent zum Einschränkungslayout:
(17) Relatives Layout:
(17) Äquivalent zum Einschränkungslayout:
(18) Relatives Layout:
(18) Äquivalent zum Einschränkungslayout:
(19) Relatives Layout:
(19) Äquivalent zum Einschränkungslayout:
(20) Relatives Layout:
(20) Äquivalent zum Einschränkungslayout:
(21) Relatives Layout:
(21) Äquivalent zum Einschränkungslayout:
(22) Relatives Layout:
(22) Äquivalent zum Einschränkungslayout:
quelle
Berichtet von @davidpbr
ConstraintLayout
LeistungIch habe zwei ähnliche 7-Kinder-Layouts erstellt, jeweils eines mit einem Elternteil
ConstraintLayout
undRelativeLayout
. Basierend auf dem Android Studio-Tool zur Methodenverfolgung wird anscheinendConstraintLayout
mehr Zeit in onMeasure verbracht und zusätzliche Arbeiten in ausgeführtonFinishInflate
.Verwendete Bibliothek (
support-v4
,appcompat-v7
…):com.android.support.constraint:constraint-layout:1.0.0-alpha1
Geräte / Android-Versionen reproduziert auf: Samsung Galaxy S6 (SM-G920A. Sorry, kein Nexus atm). Android 5.0.2
Schneller Vergleich der Methodenverfolgung:
Beispiel für ein Github-Repo: https://github.com/OnlyInAmerica/ConstraintLayoutPerf
quelle
Es folgen die Unterschiede / Vorteile:
Das Einschränkungslayout bietet die doppelte Leistung sowohl des relativen Layouts als auch des linearen Layouts: Legen Sie die relativen Positionen von Ansichten (wie das relative Layout) und die Gewichte für die dynamische Benutzeroberfläche fest (was nur im linearen Layout möglich war).
Eine sehr mächtige Verwendung ist das Gruppieren von Elementen durch Bilden einer Kette. Auf diese Weise können wir eine Gruppe von Ansichten bilden, die als Ganzes auf die gewünschte Weise platziert werden können, ohne eine weitere Hierarchieebene hinzuzufügen, um eine weitere Gruppe von Ansichten zu bilden.
Zusätzlich zu den Gewichten können wir eine horizontale und vertikale Vorspannung anwenden, die nichts anderes als der Prozentsatz der Verschiebung von der Mitte ist. (Vorspannung von 0,5 bedeutet zentral ausgerichtet. Jeder Wert kleiner oder mehr bedeutet entsprechende Bewegung in die jeweilige Richtung).
Ein weiteres sehr wichtiges Merkmal ist, dass es die Funktionen zum Behandeln der GONE-Ansichten respektiert und bereitstellt, sodass Layouts nicht unterbrochen werden, wenn eine Ansicht über Java-Code auf GONE gesetzt wird. Weitere Informationen finden Sie hier: https://developer.android.com/reference/android/support/constraint/ConstraintLayout.html#VisibilityBehavior
Bietet die Möglichkeit der automatischen Anwendung von Einschränkungen mithilfe des Blue Print- und Visual Editor-Tools, mit dem das Entwerfen einer Seite vereinfacht wird.
All diese Funktionen führen zu einer Abflachung der Ansichtshierarchie, wodurch die Leistung verbessert wird und eine reaktionsschnelle und dynamische Benutzeroberfläche erstellt wird, die sich leichter an unterschiedliche Bildschirmgrößen und -dichten anpassen lässt.
Hier ist der beste Ort, um schnell zu lernen: https://codelabs.developers.google.com/codelabs/constraint-layout/#0
quelle
Ein großer Unterschied besteht darin, dass ConstraintLayout Einschränkungen berücksichtigt, auch wenn die Ansicht nicht mehr angezeigt wird. Das Layout wird also nicht beschädigt, wenn Sie eine Kette haben und eine Ansicht in der Mitte verschwinden lassen möchten.
quelle
Zusätzlich zu @ dhaval-jivani Antwort.
Ich habe das Projekt- Github- Projekt auf die neueste Version des Constraint-Layouts v.1.1.0-beta3 aktualisiert
Ich habe die Zeit der onCreate-Methode und die Zeit zwischen dem Start von onCreate und dem Ende der Ausführung der letzten preformDraw-Methode gemessen und verglichen, die im CPU-Monitor angezeigt wird. Alle Tests wurden auf Samsung S5 mini mit Android 6.0.1 durchgeführt. Hier Ergebnisse:
Neustart (erste Bildschirmöffnung nach dem Start der Anwendung)
Relatives Layout
OnCreate: 123 ms
Letzte PreformDraw-Zeit - OnCreate-Zeit: 311,3 ms
Einschränkungslayout
OnCreate: 120,3 ms
Letzte PreformDraw-Zeit - OnCreate-Zeit: 310 ms
Außerdem habe ich den Leistungstest in diesem Artikel überprüft , hier den Code, und festgestellt, dass bei Schleifenzählungen weniger als 100 Constraint-Layout-Varianten während der Ausführung von Aufblasen, Messen und Layout schneller sind als Varianten mit relativem Layout. Und auf alten Android-Geräten wie Samsung S3 mit Android 4.3 ist der Unterschied größer.
Abschließend stimme ich den Kommentaren aus dem Artikel zu :
quelle
Offiziell
ConstraintLayout
ist viel schnellerquelle
Die eigentliche Frage ist, ob es einen Grund gibt, ein anderes Layout als ein Einschränkungslayout zu verwenden. Ich glaube, die Antwort könnte nein sein.
Für diejenigen, die darauf bestehen, dass sie sich an Programmieranfänger oder dergleichen richten, sollten sie einen Grund dafür liefern, dass sie jedem anderen Layout unterlegen sind.
Constraints-Layouts sind in jeder Hinsicht besser (sie kosten etwa 150.000 in APK-Größe). Sie sind schneller, sie sind einfacher, sie sind flexibler, sie reagieren besser auf Änderungen, sie beheben die Probleme, wenn Elemente verschwinden, sie passen sich besser an radikal unterschiedliche Bildschirmtypen an und sie verwenden nicht so viele verschachtelte Schleifen gezogene Baumstruktur für alles. Sie können alles überall platzieren, in Bezug auf alles, überall.
Sie waren Mitte 2016 etwas verrückt, als der visuelle Layout-Editor einfach nicht gut genug war, aber sie sind so weit fortgeschritten, dass Sie, wenn Sie überhaupt ein Layout haben, ernsthaft darüber nachdenken sollten, sogar ein Einschränkungslayout zu verwenden wenn es das Gleiche tut wie ein
RelativeLayout
oder sogar ein einfachesLinearLayout
.FrameLayouts
eindeutig noch ihren Zweck haben. Aber ich kann derzeit nichts anderes bauen sehen. Wenn sie damit angefangen hätten, hätten sie nichts anderes hinzugefügt.quelle
Die Schlussfolgerung, die ich ziehen kann, ist
1) Wir können UI-Design erstellen, ohne den XML-Teil des Codes zu berühren. Um ehrlich zu sein, hat Google meiner Meinung nach kopiert, wie UI in iOS-Apps gestaltet ist. Es ist sinnvoll, wenn Sie mit der UI-Entwicklung in iOS vertraut sind, aber im relativen Layout Es ist schwierig, die Einschränkungen festzulegen, ohne das XML-Design zu berühren .
2) Zweitens hat es im Gegensatz zu anderen Layouts eine flache Ansichtshierarchie und damit eine bessere Leistung als das relative Layout das Sie möglicherweise aus anderen Antworten gesehen haben
3) Es gibt auch zusätzliche Dinge außer dem relativen Layout, wie z. B. die kreisförmige relative Positionierung bei der wir eine andere Ansicht relativ zu dieser in einem bestimmten Radius mit einem bestimmten Winkel können, was im relativen Layout nicht möglich ist
Ich sage es noch einmal: Das Entwerfen der Benutzeroberfläche mithilfe des Einschränkungslayouts entspricht dem Entwerfen der Benutzeroberfläche unter iOS. Wenn Sie also in Zukunft mit iOS arbeiten, werden Sie es einfacher finden, wenn Sie das Einschränkungslayout verwendet haben
quelle
Der einzige Unterschied, den ich festgestellt habe, besteht darin, dass die Abmessungen von Dingen, die in einem relativen Layout per Drag & Drop festgelegt wurden, automatisch im Verhältnis zu anderen Elementen abgeleitet werden. Wenn Sie also die App ausführen, sehen Sie, was Sie sehen. Im Einschränkungslayout können sich die Dinge jedoch verschieben, selbst wenn Sie ein Element in der Entwurfsansicht ziehen und ablegen, während Sie die App ausführen. Dies kann einfach behoben werden, indem die Einschränkungen manuell festgelegt werden. Wenn Sie riskanter vorgehen, klicken Sie mit der rechten Maustaste auf das Element in der Komponentenstruktur, wählen Sie das Untermenü für das Einschränkungslayout aus und klicken Sie dann auf "Einschränkungen ableiten". Hoffe das hilft
quelle