私はとの違いについて混乱していますConstraintLayout
とRelativeLayout
。誰か私にそれらの正確な違いを教えてもらえますか?
RealtiveLayout
はLinearLayout
、必要なGridLayout
ビュー階層を取得するための方法がすでに他にもたくさんあると思います(彼らはすでに、などを知っています)。
私はとの違いについて混乱していますConstraintLayout
とRelativeLayout
。誰か私にそれらの正確な違いを教えてもらえますか?
RealtiveLayout
はLinearLayout
、必要なGridLayout
ビュー階層を取得するための方法がすでに他にもたくさんあると思います(彼らはすでに、などを知っています)。
回答:
の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
相対レイアウトと制約レイアウトの同等のプロパティ
(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子レイアウトを2つ作成しました。それぞれに親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
クイックメソッドトレース比較:
Githubリポジトリのサンプル:https : //github.com/OnlyInAmerica/ConstraintLayoutPerf
相違点と利点は次のとおりです。
制約レイアウトには、相対レイアウトと線形レイアウトの両方の二重の機能があります。ビューの相対位置を設定し(相対レイアウトなど)、動的UIの重みを設定します(これは線形レイアウトでのみ可能でした)。
非常に強力な用途は、チェーンを形成することによる要素のグループ化です。このようにして、ビューのグループを形成することができます。ビューのグループを形成するために、階層の別のレイヤーを追加することなく、全体として希望の方法で配置することができます。
ウェイトに加えて、水平方向と垂直方向のバイアスを適用できます。これは、中心からの変位の割合にすぎません。(0.5のバイアスは中央揃えを意味します。これより少ないまたは多い値は、それぞれの方向の対応する動きを意味します)。
別の非常に重要な機能は、GONEビューを処理する機能を尊重し、提供することで、JavaコードによってビューがGONEに設定されている場合にレイアウトが壊れないようにすることです。詳細はこちら:https : //developer.android.com/reference/android/support/constraint/ConstraintLayout.html#VisibilityBehavior
ブループリントとページのデザインを容易にするビジュアルエディターツールを使用して、自動制約を適用する機能を提供します。
これらすべての機能により、ビュー階層が平坦化され、パフォーマンスが向上します。また、さまざまな画面サイズや密度に簡単に適応できる、応答性の高い動的UIの作成にも役立ちます。
すぐに学ぶのに最適な場所は次のとおりです:https : //codelabs.developers.google.com/codelabs/constraint-layout/#0
大きな違いは、ConstraintLayoutはビューが消えた場合でも制約を尊重することです。したがって、チェーンがあり、ビューを途中で非表示にしたい場合でも、レイアウトが壊れることはありません。
@ 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を使用します。以前と比べてはるかに良いです。
本当の質問は、制約レイアウト以外のレイアウトを使用する理由はありますか?答えはノーだと思います。
初心者のプログラマーなどを対象としていると主張する人には、他のレイアウトよりも劣る理由を提供する必要があります。
制約レイアウトはあらゆる点で優れています(APKサイズは150k程度です)。それらはより速く、より簡単で、より柔軟性があり、変更に対してよりよく反応し、アイテムが消えたときの問題を修正し、根本的に異なる画面タイプによく適合し、その長いネストされたループの束を使用しませんすべてのツリー構造を引き出しました。どこでも、どこでも、どこにでも置くことができます。
ビジュアルレイアウトエディターでは不十分だった2016年半ばの時点で、それらは少し不快でしたが、レイアウトがある場合は、制約レイアウトの使用を真剣に検討する必要があるかもしれません。それがと同じことをするときRelativeLayout
、または単純なことですらLinearLayout
。FrameLayouts
明らかにまだ目的があります。しかし、現時点では他に何かを構築することはできません。彼らがこれで始めたなら、彼らは他に何も追加しなかっただろう。
私ができる結論は
1)コードのxml部分に触れることなくUI設計を行うことができます。正直に言うと、GoogleはiOSアプリでのUIの設計方法をコピーしていると思います。 xmlデザインに触れずに制約を設定することは困難です。
2)次に、他のレイアウトとは異なり、ビューの階層がフラットであるため、他の回答から見た相対レイアウトよりもパフォーマンスが優れています。
3)相対的なレイアウトとは別に、たとえば、相対的なレイアウトでは実行できない特定の半径で特定の半径でこのビューを基準にして別のビューを配置できる円形の相対配置など、追加の機能もあります。
もう一度言いますが、制約レイアウトを使用したUIの設計はiOSでのUIの設計と同じであるため、将来iOSで作業する場合は、制約レイアウトを使用した方が簡単であることがわかります