ConstraintLayoutとRelativeLayoutの違い


219

私はとの違いについて混乱していますConstraintLayoutRelativeLayout。誰か私にそれらの正確な違いを教えてもらえますか?


9
ConstraintLayoutは主に新しいプログラマー向けに設計されているため、XMLを介して手作業でレイアウトを構築する代わりに、ビジュアルエディターを使用してレイアウトを簡単に設計できます。
CopsOnRoad 2017年

1
@ジャックは間違いなく、ベテランエキスパートの開発者にも深い目的があります
モーゼスアプリコ2017

@MosesAprico正解です。しかし、熟練した専門家の開発者にRealtiveLayoutLinearLayout、必要なGridLayoutビュー階層を取得するための方法がすでに他にもたくさんあると思います(彼らはすでに、などを知っています)。
CopsOnRoad 2017

5
@CopsOnRoad実はあなたは間違っています。Appleは5年以上にわたって制約レイアウトを行ってきました。あらゆるサイズのレスポンシブデザインが得られ、大量の複雑なレイアウトを記述する必要はありません。複数のビューのバインドを開始する場合、完全にレスポンシブなデザインを作成するために必要なのは3つの基本的なコントロールだけです。
Nick Turner

回答:


145

ConstraintLayout目的は、ネストを回避するために各ビューにいくつかのルールを適用して、レイアウトのビュー階層を最適化およびフラット化することです。

ルールはを思い出させます。RelativeLayoutたとえば、他のビューの左側を左側に設定します。

app:layout_constraintBottom_toBottomOf="@+id/view1"

とは異なりRelativeLayout、ハンドルを基準とした水平および垂直オフセット0%および100%でビューを配置するために使用される値をConstraintLayout提供しbiasます(円でマークされています)。これらのパーセンテージ(および分数)は、さまざまな画面密度およびサイズにわたるビューのシームレスな配置を提供します。

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を使用してフラット化されたレイアウトを作成することはできます。そのため、RelativeLayoutができない場所でConstraintLayoutが処理するところが混乱しています。

7
RelativeLayoutは2パスレイアウトで、二重課税の影響を受けます。少なくとも2回測定/レイアウトする必要があります。ConstraintLayoutは、このパフォーマンスのペナルティを被ることはありません。
クリストファーペリー

5
@Nothingはい、RelativeLayoutを使用してフラット化レイアウトを作成できます。ただし、ここで説明したすべての人に加えて、ConstraintLayoutを使用すると、負のマージンサイズのサブビューを事前定義された比率で使用できます。最後の1つは、マテリアルデザイン
Eugene Brusov

4
LinearLayoutまたは別のRelativeLayoutをネストしない限り、RelativeLayoutでは不可能なレイアウトがいくつかあります。例:3つのビューの「スタック」を別のビューに対して垂直に
中央揃え

@ Gak2ネストされたレイアウトがないと、例では不可能なことは何もありません。多分あなたは私よりも「スタック」で何か他のものを意味します。「layout_alignEnd」、「layout_below」、「layout _...」を使用するだけで、あらゆる種類のスタックを構築できます...
驚くべきJan

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
Constraint Layoutsの学習を開始するすべての人がこれを確認する必要があります。ありがとう。
grantespo

1
これは有用な情報ですが、単なるドキュメントダンプであり、それらの違いを説明することはありません。
YetAnotherRandomUser

1
いいえ、ドキュメントを確認する時間がありません。これは確かに役立ちます。そして、単純な言語で書かれています。賛成票。
CodeToLife

46

@davidpbr ConstraintLayoutパフォーマンスによって報告されまし

類似の7子レイアウトを2つ作成しました。それぞれに親ConstraintLayoutとがありRelativeLayoutます。Android Studioのメソッドトレースツールに基づいてConstraintLayout、onMeasureでより多くの時間を費やし、で追加の作業を実行しているようonFinishInflateです。

使用するライブラリ(support-v4appcompat-v7…):

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

再現されたデバイス/ Androidバージョン:Samsung Galaxy S6(SM-G920A。申し訳ありませんが、Nexus ATMはありません)。Android 5.0.2

クイックメソッドトレース比較:

1

Githubリポジトリのサンプル:https : //github.com/OnlyInAmerica/ConstraintLayoutPerf


同じ問題から:私は今のところこれを閉じます-alpha 4/5はかなりのパフォーマンス改善をもたらしました。おそらくもっと改善することができるでしょうが、それは1.0以降の投稿を待つかもしれません。
Oleksandr

この優れた比較を作成するために使用したツールについて説明していただけますか?
Nativ 2017年

2
@Nativ Monotirs-> CPU-> Time tracker icon
Andrey T

18
Android 6.0.1を搭載したNexus 5でconstraint-layout:1.0.1を使用して同じコードを実行し、プロファイリングします。結果は次のとおりです。相対レイアウト-測定30ms + 16msで2ms = Layouyt 7msで62ms = 9ms合計54ms 7ms制約レイアウトレイアウトパラメータの生成+ビューの追加〜7 * 2ms = 14ms測定時60ms + 52ms〜112msレイアウト時8ms合計〜141ms相対レイアウトの最初の初期化は、制約よりも約3倍高速です。
Andrey T

2
ネストされたビュー階層を減らすことができるように、制約レイアウトが導入されました。したがって、階層が少ないほど、ビューツリーを上から下に移動する時間が短くなります。それで、制約レイアウトでは必要ないかもしれないネストされたビュー階層を作成し、それをネストされた構造で終わる可能性が高い相対レイアウトと比較するポイントは何ですか?
codepeaker 2018

27

相違点と利点は次のとおりです。

  1. 制約レイアウトには、相対レイアウトと線形レイアウトの両方の二重の機能があります。ビューの相対位置を設定し(相対レイアウトなど)、動的UIの重みを設定します(これは線形レイアウトでのみ可能でした)。

  2. 非常に強力な用途は、チェーンを形成することによる要素のグループ化です。このようにして、ビューのグループを形成することができます。ビューのグループを形成するために、階層の別のレイヤーを追加することなく、全体として希望の方法で配置することができます。

  3. ウェイトに加えて、水平方向と垂直方向のバイアスを適用できます。これは、中心からの変位の割合にすぎません。(0.5のバイアスは中央揃えを意味します。これより少ないまたは多い値は、それぞれの方向の対応する動きを意味します)。

  4. 別の非常に重要な機能は、GONEビューを処理する機能を尊重し、提供することで、JavaコードによってビューがGONEに設定されている場合にレイアウトが壊れないようにすることです。詳細はこちら:https : //developer.android.com/reference/android/support/constraint/ConstraintLayout.html#VisibilityBehavior

  5. ブループリントとページのデザインを容易にするビジュアルエディターツールを使用して、自動制約を適用する機能を提供します。

これらすべての機能により、ビュー階層が平坦化され、パフォーマンスが向上します。また、さまざまな画面サイズや密度に簡単に適応できる、応答性の高い動的UIの作成にも役立ちます。

すぐに学ぶのに最適な場所は次のとおりです:https : //codelabs.developers.google.com/codelabs/constraint-layout/#0


6)ConstraintLayoutにより、事前定義された比率でサブビューのサイズを変更できます。medium.com/google- developers/…。たとえば、ImageViewを16:9に維持する場合に便利です。
Eugene Brusov 2017

15

大きな違いは、ConstraintLayoutはビューが消えた場合でも制約を尊重することです。したがって、チェーンがあり、ビューを途中で非表示にしたい場合でも、レイアウトが壊れることはありません。


何か例を教えてもらえますか?3つのボタンがあるとします。2番目のボタンを非表示にし、3番目のボタンを2番目のボタンにbtn2というIDでアタッチします。2番目のボタンを非表示にしてから、3番目のボタンが2番目のボタンのIDをどのように見つけることができると思いますか?

1
それは真実ではない。ボタンの可視性を「GONE」ではなく「INVISIBLE」に設定すると、制約を破ることはありません。私については、@ニコラが言った最大の違いは、より「レスポンシブ」なビューを作成するのに役立つバイアスです。
zapotec 2017

@Nothingボタンが互いに下にあるとしましょう。tButton 2を非表示にしても、xmlまたはコードの「ビューコントラクト」にまだ存在します。ConstraintLayoutはそれを尊重し、Button 3はButton 1の下にあります。RelativeLayoutでは、Button 2がなくなったため、Contraintもなくなったため、Button 3はデフォルトの位置になり、画面の左上になります。
Herrbert74

@zapotec私はあなたにとって他のものがより重要であることを尊重しますが、私にとってこれは本当に素晴らしい違いです。RelativeLayoutで私が嫌っていた唯一のものを修正します。スペースを要求するため、非表示を使用することはオプションではありません。
Herrbert74

7

@ dhaval-jivaniの回答に加えて。

プロジェクトgithubプロジェクトを最新バージョンの制約レイアウトv.1.1.0-beta3に更新しました

onCreateメソッドの時間と、CPUモニターに表示されるonCreateの開始から最後のpreformDrawメソッドの実行の終了までの時間を測定して比較しました。テストはすべてAndroid 6.0.1を搭載したSamsung S5 miniで行われました。

フレッシュスタート(アプリケーションの起動後に最初の画面が開く)

相対レイアウト

OnCreate:123ミリ秒

最後のプリフォーム描画時間-OnCreate時間:311.3ms

制約レイアウト

OnCreate:120.3ミリ秒

最終プリフォーム描画時間-OnCreate時間:310ms

それに加えて、私はこのことから性能試験をチェックしました記事ここでは、コード とループ数に100未満の制約レイアウトバリアントを膨らませる、対策の実行中に高速であり、そしてレイアウトは、相対レイアウトとバリアントことがわかりました。また、Android 4.3搭載のSamsung S3などの古いAndroidデバイスでは、違いが大きくなります。

結論として、私は記事のコメントに同意します:

古いビューをリファクタリングしてRelativeLayoutまたはLinearLayoutからオンにする価値はありますか?

いつものように:状況によります🙂

現在のレイアウト階層にパフォーマンスの問題があるか、レイアウトに大幅な変更を加えたい場合を除き、私は何もリファクタリングしません。最近は測定していませんが、前回のリリースではパフォーマンスの問題は見つかりませんでした。だから安全に使っていただけると思います。しかし–私が言ったように–移行のために単に移行しないでください。それが必要であり、それから利益を得る場合にのみ、そうしてください。ただし、新しいレイアウトの場合は、ほぼ常にConstraintLayoutを使用します。以前と比べてはるかに良いです。


6

公式にConstraintLayoutは、はるかに高速です

AndroidのNリリースでは、ConstraintLayoutクラスはと同様の機能を提供しますRelativeLayoutが、大幅に低コストです。


6

本当の質問は、制約レイアウト以外のレイアウトを使用する理由はありますか?答えはノーだと思います。

初心者のプログラマーなどを対象としていると主張する人には、他のレイアウトよりも劣る理由を提供する必要があります。

制約レイアウトはあらゆる点で優れています(APKサイズは150k程度です)。それらはより速く、より簡単で、より柔軟性があり、変更に対してよりよく反応し、アイテムが消えたときの問題を修正し、根本的に異なる画面タイプによく適合し、その長いネストされたループの束を使用しませんすべてのツリー構造を引き出しました。どこでも、どこでも、どこにでも置くことができます。

ビジュアルレイアウトエディターでは不十分だった2016年半ばの時点で、それらは少し不快でしたが、レイアウトがある場合は、制約レイアウトの使用を真剣に検討する必要があるかもしれません。それがと同じことをするときRelativeLayout、または単純なことですらLinearLayoutFrameLayouts明らかにまだ目的があります。しかし、現時点では他に何かを構築することはできません。彼らがこれで始めたなら、彼らは他に何も追加しなかっただろう。


1
それをより速く証明するものはありますか?
Rajesh Nasit

1
はい。より速いです。レイアウトは、ツリーを反復するのではなく、単一のソルバーでダウンしています。ほとんどの場合、レイアウトの呼び出し時に行われるため、問題にはなりません。しかし、ビューツリーは簡単ですが、呼び出しを必要とする呼び出しを必要とするビュー内に一連のビューを作成します。理論的には優れていますが、実際には、1ビットのコードでレイアウトを実行する方が、ビューツリー全体を反復処理するよりもはるかに簡単です。これは、より多くの意見が、ここ月からベンチマークだと、より印象的になるだろう:medium.com/@krpiotrek/constraintlayout-performance-c1455c7984d7
Tatarize

私は別の質問に直面していますが、取り組んでいるアプリの既存のRelativelayoutsをすべて置き換える必要がありますか?パフォーマンスは大幅に向上しますか?
Sreekanth Karumanaghat

@SreekanthKarumanaghatは、切り替え時に元に戻すのにかかる時間を取り戻すことができないようです。私たちは、ほとんどの場合、3.5msのサイクルが3.25msに低下することを話している。それがあなたにあなたが追加の機能またはあなたが必要とする何かを与えるなら、確かに、しかし純粋に速度の理由でそうです。私たちは変換ボタンを押すことを話しているが。
Tatarize

5

私ができる結論は

1)コードのxml部分触れることなくUI設計を行うことができます。正​​直に言うと、GoogleはiOSアプリでのUIの設計方法をコピーしていると思います。 xmlデザインに触れずに制約を設定することは困難です。

2)次に、他のレイアウトとは異なり、ビューの階層フラットであるため、他の回答から見た相対レイアウトよりもパフォーマンス優れています。

3)相対的なレイアウトとは別に、たとえば、相対的なレイアウトでは実行できない特定の半径で特定の半径でこのビューを基準にして別のビューを配置できる円形の相対配置など、追加の機能もあります。

もう一度言いますが、制約レイアウトを使用したUIの設計はiOSでのUIの設計と同じであるため、将来iOSで作業する場合は、制約レイアウトを使用した方が簡単であることがわかります


1

私が指摘した唯一の違いは、ドラッグアンドドロップを介して相対レイアウトで設定されたものは、自動的に他の要素を基準とした相対的な寸法を持っているため、アプリを実行すると、表示されるものが得られるものです。ただし、制約レイアウトでは、デザインビューで要素をドラッグアンドドロップした場合でも、アプリを実行すると、状況がずれる場合があります。これは、手動で制約を設定するか、コンポーネントツリーで要素を右クリックし、制約レイアウトサブメニューを選択して[制約を推定]をクリックすることで、簡単に修正できます。お役に立てれば

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.