ConstraintLayout ve RelativeLayout arasındaki farklar


219

Ben arasındaki fark hakkında karıştı ConstraintLayoutve RelativeLayout. Birisi bana aralarındaki kesin farklılıkları söyleyebilir mi?


9
ConstraintLayout temel olarak yeni programcılar için tasarlanmıştır , böylece XML yoluyla elle düzen oluşturmak yerine Görsel Düzenleyici'yi kullanarak düzeni kolayca tasarlayabilirler.
CopsOnRoad

1
@Jack kesinlikle aynı zamanda tecrübeli uzman geliştiriciler için daha derin bir amacı var
Moses Aprico

@MosesAprico haklısın, buna sahip. Ama tecrübeli uzman Devs zaten diğer yollardan çok (onlar zaten gibi biliyorum düşünüyorum RealtiveLayout, LinearLayout, GridLayoutistedikleri görünüm hiyerarşisi almak vb.)
CopsOnRoad

5
@CopsOnRoad Aslında yanılıyorsunuz. Apple, 5 yıldan fazla bir süredir kısıtlama düzenleri yapıyor. Herhangi bir boyuta duyarlı tasarım alırsınız ve bir ton karmaşık düzen yazmak zorunda kalmazsınız. Birden çok görünümü bağlamaya başladığınızda, tamamen duyarlı tasarım oluşturmak için yalnızca 3 temel kontrole ihtiyacınız vardır.
Nick Turner

Yanıtlar:


145

Amacı, ConstraintLayoutiç içe yerleştirmekten kaçınmak için her görünüme bazı kurallar uygulayarak mizanpajlarınızın görünüm hiyerarşisini optimize etmek ve düzleştirmektir.

Kurallar size hatırlatır RelativeLayout, örneğin başka bir görünümün solunu soluna ayarlamak.

app:layout_constraintBottom_toBottomOf="@+id/view1"

Bunun aksine RelativeLayout, bir görünümü tutamaçlara göre (daire ile işaretli)% 0 ve% 100 yatay ve dikey ofset açısından konumlandırmak için kullanılan değer ConstraintLayoutsunar bias. Bu yüzdeler (ve kesirler), görünümün farklı ekran yoğunlukları ve boyutları arasında kesintisiz konumlandırılmasını sağlar.

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

Taban çizgisi tutamacı (köşeleri yuvarlatılmış uzun boru, daire tutamacının altında) görünümün içeriğini başka bir görünüm referansıyla hizalamak için kullanılır.

Kare tutamaçlar (görünümün her köşesinde) görünümü dps olarak yeniden boyutlandırmak için kullanılır.

resim açıklamasını buraya girin

Bu tamamen fikir temelli ve benim izlenimim ConstraintLayout


9
RelativeLayout'u kullanarak hala düzleştirme düzeni oluşturabiliriz, bu yüzden ConstraintLayout'un RelativeLayout'un yapamayacağı yerlere baktığı durumlarda kafam karıştı mı?

7
RelativeLayout, çifte vergilendirmeden muzdarip iki geçişli bir düzendir. En az iki kez ölçmesi / yerleşmesi gerekir. ConstraintLayout bu performans cezasına maruz kalmaz.
Christopher Perry

5
@Hiçbir şey, yine de RelativeLayout kullanarak düzleştirme düzeni oluşturabiliriz. Ancak burada belirtilen herkese ek olarak, ConstraintLayout, negatif kenar boşlukları ve boyut alt görünümlerini önceden tanımlanmış oranda kullanmanıza olanak tanır . Sonuncusu, Materyal tasarımına
Eugene Brusov

4
Bir LinearLayout veya başka bir RelativeLayout'u iç içe yerleştirmediğiniz sürece RelativeLayout'ta imkansız olan bazı düzenler vardır. Örneğin: 3
Görünümden

@ Gak2 İç içe yerleştirilmiş bir düzen olmadan örneğinizde imkansız hiçbir şey göremiyorum. Belki benden daha fazla "yığın" ile başka bir şey demek istiyorsun. Sadece "layout_alignEnd", "layout_below", "layout _..." kullanıyorum ve onunla her türlü yığını oluşturabilirim ...
İnanılmaz Ocak

81

Göreceli Düzen ve Kısıt Düzeni eşdeğeri özellikleri

Göreceli Düzen ve Kısıt Düzeni eşdeğeri özellikleri

(1) Göreceli Düzen:

android:layout_centerInParent="true"    

(1) Kısıt Düzeni eşdeğeri:

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) Göreceli Düzen:

android:layout_centerHorizontal="true"

(2) Kısıt Düzeni eşdeğeri:

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

(3) Göreceli Düzen:

android:layout_centerVertical="true"    

(3) Kısıt Düzeni eşdeğeri:

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

(4) Göreceli Düzen:

android:layout_alignParentLeft="true"   

(4) Kısıt Düzeni eşdeğeri:

app:layout_constraintLeft_toLeftOf="parent"

(5) Göreceli Düzen:

android:layout_alignParentStart="true"

(5) Kısıt Düzeni eşdeğeri:

app:layout_constraintStart_toStartOf="parent"

(6) Göreceli Düzen:

android:layout_alignParentRight="true"

(6) Kısıt Düzeni eşdeğeri:

app:layout_constraintRight_toRightOf="parent"

(7) Göreceli Düzen:

android:layout_alignParentEnd="true"    

(7) Kısıt Düzeni eşdeğeri:

app:layout_constraintEnd_toEndOf="parent"

(8) Göreceli Düzen:

android:layout_alignParentTop="true"

(8) Kısıt Düzeni eşdeğeri:

app:layout_constraintTop_toTopOf="parent"

(9) Göreceli Düzen:

android:layout_alignParentBottom="true" 

(9) Kısıt Düzeni eşdeğeri:

app:layout_constraintBottom_toBottomOf="parent"

(10) Göreceli Düzen:

android:layout_alignStart="@id/view"

(10) Kısıt Düzeni eşdeğeri:

app:layout_constraintStart_toStartOf="@id/view"

(11) Göreceli Düzen:

android:layout_alignLeft="@id/view" 

(11) Kısıt Düzeni eşdeğeri:

app:layout_constraintLeft_toLeftOf="@id/view"

(12) Göreceli Düzen:

android:layout_alignEnd="@id/view"  

(12) Kısıt Düzeni eşdeğeri:

app:layout_constraintEnd_toEndOf="@id/view"

(13) Göreceli Düzen:

android:layout_alignRight="@id/view"

(13) Kısıt Düzeni eşdeğeri:

app:layout_constraintRight_toRightOf="@id/view"

(14) Göreceli Düzen:

android:layout_alignTop="@id/view"  

(14) Kısıt Düzeni eşdeğeri:

app:layout_constraintTop_toTopOf="@id/view"

(15) Göreceli Düzen:

android:layout_alignBaseline="@id/view" 

(15) Kısıt Düzeni eşdeğeri:

app:layout_constraintBaseline_toBaselineOf="@id/view"

(16) Göreceli Düzen:

android:layout_alignBottom="@id/view"

(16) Kısıt Düzeni eşdeğeri:

app:layout_constraintBottom_toBottomOf="@id/view"

(17) Göreceli Düzen:

android:layout_toStartOf="@id/view"

(17) Kısıt Düzeni eşdeğeri:

app:layout_constraintEnd_toStartOf="@id/view"

(18) Göreceli Düzen:

android:layout_toLeftOf="@id/view"  

(18) Kısıt Düzeni eşdeğeri:

app:layout_constraintRight_toLeftOf="@id/view"

(19) Göreceli Düzen:

android:layout_toEndOf="@id/view"

(19) Kısıt Düzeni eşdeğeri:

app:layout_constraintStart_toEndOf="@id/view"

(20) Göreceli Düzen:

android:layout_toRightOf="@id/view"

(20) Kısıt Düzeni eşdeğeri:

app:layout_constraintLeft_toRightOf="@id/view"

(21) Göreceli Düzen:

android:layout_above="@id/view" 

(21) Kısıt Düzeni eşdeğeri:

app:layout_constraintBottom_toTopOf="@id/view"

(22) Göreceli Düzen:

android:layout_below="@id/view" 

(22) Kısıt Düzeni eşdeğeri:

app:layout_constraintTop_toBottomOf="@id/view"


2
Görüntü yerine metin olarak gönderebilir misiniz? Böylece hem benim hem de gelecekte başkaları için çok faydalı olacak.
Yeni Geliştirici

3
Kısıt Düzenlerini öğrenmeye başlayan herkesin bunu görmesi gerekir. Teşekkürler.
grantespo

1
Bu yararlı bir bilgidir, ancak sadece bir doküman dökümüdür ve aralarındaki farkı açıklamak için hiçbir şey yapmaz.
YetAnotherRandomUser

1
Hayır, dokümanlara bakmak için zamanım yok, bu kesinlikle faydalı. Ve basit bir dilde yazılmış. Upvoting.
CodeToLife

46

@Davidpbr ConstraintLayout performansı tarafından rapor edildi

Her biri bir ebeveyn ConstraintLayoutve bir olmak üzere iki benzer 7 çocuk düzenini yaptım RelativeLayout. Android Studio yöntem izleme aracına dayanarak, ConstraintLayoutonMeasure'da daha fazla zaman harcıyor ve ek çalışmalar gerçekleştiriyor onFinishInflate.

Kullanılan kitaplık ( support-v4, appcompat-v7…):

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

Üretilen cihazlar / Android versiyonları: Samsung Galaxy S6 (SM-G920A. Üzgünüm, Nexus atm yok). Android 5.0.2

Hızlı yöntem izleme karşılaştırması:

1

Örnek Github repo: https://github.com/OnlyInAmerica/ConstraintLayoutPerf


Aynı sorundan: Şimdilik bunu kapatacağım - alpha 4/5 performansta biraz iyileşme getirdi. Muhtemelen daha fazla geliştirebiliriz, ancak bu 1.0 sonrası bekleyebilir.
Oleksandr

Bu harika karşılaştırmayı oluşturmak için hangi aracı kullandığınızı açıklayabilir misiniz?
Nativ

2
@Nativ Monotirs-> CPU-> Zaman izleyici simgesi
Andrey T

18
Kısıtlama düzeniyle aynı kodu çalıştırın ve profilli: Android 6.0.1 ile Nexus 5'de 1.0.1, burada sonuçlar: Göreceli düzen - init üzerinde 2ms Ölçü 30ms + 16ms = 62ms Layouyt 7ms = 9ms toplam 54 ms Kısıt Düzeni - init 7ms Kısıtlama Düzeni, düzen parametreleri oluşturur + görünüm ekle ~ 7 * 2ms = 14ms Açık Ölçü 60ms + 52ms ~ 112ms Düzende 8ms toplam ~ 141ms Göreceli düzenin ilk başlatılması, Kısıtlamadan neredeyse üç kat daha hızlıdır.
Andrey T

2
İç içe görünüm hiyerarşisinin azaltılabilmesi için Sınır Düzeni tanıtılır. Bu nedenle, Daha az hiyerarşi, görünüm ağacında yukarıdan aşağıya doğru hareket etmek için daha az zaman demektir. Peki, Kısıtlama düzeninde gerekli olmayabilecek iç içe görünüm hiyerarşisi oluşturmanın ve iç içe geçmiş yapı ile sonuçlanma şansınızın daha yüksek olduğu Göreli Düzen ile karşılaştırılmasının anlamı nedir?
kod yazarı

27

Farklılıklar / avantajlar şunlardır:

  1. Kısıt Düzeni, hem Göreli Yerleşimin hem de Doğrusal mizanpajın ikili gücüne sahiptir: Göreli görünüm konumlarını (Göreceli mizanpaj gibi) ayarlayın ve ayrıca dinamik UI (yalnızca Doğrusal Mizanpaj'da mümkün olan) için ağırlıklar ayarlayın.

  2. Çok güçlü bir kullanım, bir zincir oluşturarak elementlerin gruplandırılmasıdır. Bu şekilde, bir bütün olarak sadece başka bir görüş grubu oluşturmak için başka bir hiyerarşi katmanı eklemeden istenen şekilde yerleştirilebilen bir grup görünüm oluşturabiliriz.

  3. Ağırlıklara ek olarak, merkezden yer değiştirme yüzdesinden başka bir şey olmayan yatay ve dikey önyargı uygulayabiliriz. (0.5 sapması, merkezi olarak hizalanır. Daha az veya daha fazla değer, ilgili yönde karşılık gelen hareket anlamına gelir).

  4. Bir başka çok önemli özellik de, GONE görünümlerini işlemek için işlevsellik sağlaması ve böylece bazı görünümler java kodu aracılığıyla GONE olarak ayarlandığında düzenlerin bozulmamasıdır. Daha fazlasını burada bulabilirsiniz: https://developer.android.com/reference/android/support/constraint/ConstraintLayout.html#VisibilityBehavior

  5. Bir sayfa tasarlamayı kolaylaştıran Mavi baskı ve Görsel Editör aracı kullanılarak otomatik kısıtlamanın uygulanmasını sağlar.

Tüm bu özellikler, performansı artıran ve aynı zamanda farklı ekran boyutlarına ve yoğunluğuna daha kolay adapte olabilen duyarlı ve dinamik kullanıcı arayüzü oluşturmaya yardımcı olan görünüm hiyerarşisinin düzleşmesine yol açar.

Hızlı bir şekilde öğrenmek için en iyi yer: https://codelabs.developers.google.com/codelabs/constraint-layout/#0


6) ConstraintLayout, alt görüntülemeleri önceden tanımlanmış medium / google - developers/… oranlarında boyutlandırmayı mümkün kılar . Örneğin ImageView'inizi 16: 9'da tutacağınız zaman yararlı olur.
Eugene Brusov

15

Büyük bir fark, ConstraintLayout'ın görünüm gitmiş olsa bile kısıtlamalara saygı göstermesidir. Eğer bir zinciriniz varsa ve bir görünümün ortadan kaybolmasını istiyorsanız, düzeni bozmaz.


bana bir örnek verebilir misin diyelim ki 3 düğme var. 2. düğmeyi gizleyeceğim ve 3. düğme btn2 kimliğine sahip 2. düğmeye bağlandı. Diyelim ki 2. düğmeyi gizledim, 3. düğmenin 2. düğmenin kimliğini nasıl bulabileceğini?

1
Bu doğru değil. Bir Düğmenin görünürlüğünü "GONE" yerine "GÖRÜNMEZ" olarak ayarlarsanız, kısıtlamaları kırmazsınız. Bana gelince, @Nikola'nın söylediği gibi en büyük fark, daha fazla "Duyarlı" görünüm oluşturmanıza yardımcı olan önyargıdır.
zapotec

@ Hiçbir şey Düğmelerin birbirinin altında olduğunu varsayalım. TButton 2'yi gizleseniz bile, xml veya kodunuzda "görüntüleme sözleşmesi" nde hala oradadır. ConstraintLayout buna saygı gösterecek ve Düğme 3 Düğme 1'in altında olacaktır. RelativeLayout Düğmesi 2 gittiğinde, karşıtlık onunla birlikte gider, böylece Düğme 3 varsayılan konumda olur, böylece ekranın sol üst köşesinde olur.
Herrbert74

@zapotec Diğer şeylerin sizin için daha önemli olduğuna saygı duyuyorum, ama benim için bu gerçekten harika bir fark. RelativeLayout'ta nefret ettiğim tek şeyi düzeltir. Görünmez kullanmak bir seçenek değildir, çünkü alanı talep edecektir.
Herrbert74

7

@ Dhaval-jivani yanıtı yanı sıra.

Proje github projesini kısıtlama düzeni v.1.1.0-beta3'ün en son sürümüne güncelledim

OnCreate yönteminin süresini ve onCreate başlangıcı ile CPU monitöründe görünen son preformDraw yönteminin yürütülmesi arasında geçen süreyi ölçtüm ve karşılaştırdım. Tüm testler Android 6.0.1 ile Samsung S5 mini'de yapıldı. İşte sonuçlar:

Yeni başlangıç ​​(uygulama başlatıldıktan sonra ilk ekran açılması)

Göreceli Düzen

OnCreate: 123 ms

Son preformDraw time - OnCreate süresi: 311.3 ms

Kısıt Düzeni

OnCreate: 120.3 ms

Son preformDraw time - OnCreate süresi: 310ms

Bunun yanı sıra, bu makaleden performans testini kontrol ettim , burada kod ve 100'den az kısıtlama düzeni varyantının sayım, şişirme, ölçü ve mizanpaj ile ilgili değişkenlerin yürütülmesi sırasında göreceli mizanpaj ile daha hızlı olduğunu gördüm . Ve Android 4.3 yüklü Samsung S3 gibi eski Android cihazlarda fark daha büyük.

Sonuç olarak, makalenin yorumlarına katılıyorum :

Eski görünümleri yeniden düzenlemeye değer mi, RelativeLayout veya LinearLayout'tan geçiş yapar mı?

Her zaman olduğu gibi: 🙂

Geçerli düzen hiyerarşinizle ilgili bir performans sorununuz yoksa veya düzende yine de önemli değişiklikler yapmak istemiyorsanız hiçbir şeyi yeniden düzenlemezdim. Son zamanlarda ölçmemiş olmama rağmen, son sürümlerde herhangi bir performans sorunu bulamadım. Bu yüzden kullanmak için güvenli olmanız gerektiğini düşünüyorum. ama - dediğim gibi - sadece göç uğruna göç etmeyin. Sadece bunu yapmak için bir ihtiyaç ve fayda varsa yapın. Yeni düzenler için neredeyse ConstraintLayout kullanıyorum. Daha öncekilere kıyasla çok daha iyi.


6

Resmi olarak ConstraintLayoutise çok daha hızlı

Android'in N sürümünde, ConstraintLayoutsınıf benzer işlevsellik sağlar RelativeLayout, ancak önemli ölçüde daha düşük bir maliyetle.


6

Sorulması gereken asıl soru, bir kısıt düzeni dışında herhangi bir düzen kullanmak için herhangi bir neden var mı? Cevabın hayır olabileceğine inanıyorum.

Acemi programcılara veya benzerlerine yönelik olduklarında ısrar edenlere, diğer düzenlerden daha düşük olmaları için bir neden sunmalıdırlar.

Kısıtlama düzenleri her şekilde daha iyidir (APK boyutunda 150k gibi maliyeti vardır.). Daha hızlılar, daha kolaylar, daha esnekler, değişikliklere daha iyi tepki veriyorlar, öğeler kaybolduğunda sorunları çözüyorlar, radikal olarak farklı ekran türlerine daha iyi uyuyorlar ve bu kadar uzun süre iç içe bir döngü kullanmıyorlar her şey için ağaç yapısı çıkardı. İstediğiniz yere, istediğiniz yere, istediğiniz yere koyabilirsiniz.

Görsel düzen editörünün yeterince iyi olmadığı 2016'nın ortalarında biraz vidalıydılar, ancak bir düzeniniz varsa, bir kısıtlama düzeni kullanmayı ciddi olarak düşünmek isteyebileceğiniz noktaya kadar. bir şeyle aynı şeyi RelativeLayout, hatta basit bir şeyi yaptığında LinearLayout. FrameLayoutsaçıkça hala amaçları var. Ancak, bu noktada başka bir şey inşa etmeyi göremiyorum. Bununla başlasalardı, başka bir şey eklemezlerdi.


1
Daha hızlı bir kanıtı var mı?
Rajesh Nasit

1
Evet. O daha hızlı. Düzen, bir ağaçta yineleme yapmak yerine tek bir çözücüde. Çoğu şey için önemli değildir, çünkü düzen çağrısında yapılır. Ancak, görünüm ağacı şey kolayken, görünümler içinde arama gerektiren aramalar gerektiren bir grup görünüm oluşturur. Teorik olarak daha güzel olsa da, uygulamada düzeni bir kod bitinde gerçekleştirmek, tüm görünüm ağacında yinelemekten çok daha kolaydır. Daha fazla görüntülemeyle daha etkileyici olurdu, ancak Mayıs ayından
Tatarize

Başka bir soru ile karşılaşıyorum, üzerinde çalıştığım app mevcut tüm Relativelayouts değiştirmek gerekir? Performansı önemli ölçüde artıracak mı?
Sreekanth Karumanaghat

@SreekanthKarumana, geçişin sizi kurtaracağı zamanda bunları değiştirmek için gereken zamanı asla geri getirmeyeceğiniz gibi görünüyor. Çoğu durumda 3.5ms'lik döngülerden 3.25ms'ye düşüyoruz. Size ekstra bir özellik veya ihtiyacınız olan bir şey verirse, o zaman emin olun, ancak sadece hız gerekçesiyle nah. Gerçi bir dönüştür düğmesine basmaktan bahsediyoruz.
Tatarize

5

Yapabileceğim Sonuç

1) Kodun xml kısmına dokunmadan UI tasarımı yapabiliriz , dürüst olmak gerekirse, google'ın UI'nin iOS uygulamalarında nasıl tasarlandığını kopyaladığını hissediyorum , iOS'ta UI geliştirmeye aşina olmanız mantıklı olacaktır, ancak göreceli düzende xml tasarımına dokunmadan kısıtlamaları ayarlamak zor .

2) İkincisi, diğer düzenlerden farklı olarak düz görünüm hiyerarşisine sahiptir , bu nedenle diğer cevaplardan görmüş olabileceğiniz göreceli düzenden daha iyi performans gösterir

3) Ayrıca , göreceli düzende yapamayan belirli bir açıyla belirli bir yarıçapta buna göre başka bir görünüm yerleştirebileceğimiz dairesel göreli konumlandırma gibi göreceli düzenin dışında ekstra şeyler de vardır.

Tekrar söylüyorum, kısıtlama düzenini kullanarak UI tasarlamak iOS'ta UI tasarlamakla aynıdır, bu nedenle gelecekte iOS'ta çalışıyorsanız kısıtlama düzenini kullandıysanız daha kolay bulacaksınız


1

Belirttiğim tek fark, sürükle ve bırak yoluyla göreceli bir düzende ayarlanan şeylerin otomatik olarak boyutlarını çıkartılan diğer öğelere göre olmasıdır, bu yüzden uygulamayı çalıştırdığınızda gördüğünüz şey elde ettiğiniz şeydir. Ancak kısıtlama düzeninde, tasarım görünümünde bir öğeyi sürükleyip bıraksanız bile, uygulamayı çalıştırdığınızda bazı şeyler değişebilir. Bu, kısıtlamaları manuel olarak ayarlayarak veya bileşen ağacındaki öğeyi sağ tıklayıp kısıtlama düzeni alt menüsünü seçip 'kısıtlamaları çıkar' seçeneğini tıklatarak daha riskli bir hareketle düzeltilebilir. Bu yardımcı olur umarım

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.