次のレイアウトファイルを検討してください。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<Android.support.constraint.ConstraintLayout
Android:id="@+id/activity_main"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="#FF0000"
Android:paddingBottom="@dimen/activity_vertical_margin"
Android:paddingLeft="@dimen/activity_horizontal_margin"
Android:paddingRight="@dimen/activity_horizontal_margin"
Android:paddingTop="@dimen/activity_vertical_margin">
<ImageView
Android:layout_width="0dp"
Android:layout_height="0dp"
Android:background="#0000FF"
Android:padding="16dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintDimensionRatio="H,3:1"
tools:layout_editor_absoluteX="16dp" />
</Android.support.constraint.ConstraintLayout>
</RelativeLayout>
App:layout_constraintDimensionRatioの仕組みがわかりません。私の理解では、比率は常に幅と高さになるということです。したがって、3:1の場合、ImageViewは常に高さの3倍の幅で表示されます。接頭辞HまたはWは、ConstraintLayoutにどの次元が比率を尊重するかを指示します。 Hの場合、最初に幅が他の制約から計算され、次に縦横比に従って高さが調整されることを意味します。ただし、これはレイアウトの結果です。
高さは幅の3倍であり、予想外です。 app:layout_constraintDimensionRatio設定に関してディメンションがどのように計算されるかを誰かが説明できますか?
app:layout_constraintDimensionRatio
の動作についてのあなたの理解は正しいです。 app:layout_constraintDimensionRatio="H,3:1"
を設定すると、最初に幅が他の制約から計算され、次に縦横比に従って高さが調整されます。実装の唯一の問題は、app:layout_constraintBottom_toBottomOf="parent"
をImageViewに追加したため、app:layout_constraintDimensionRatio
が無視されることです。
ImageViewを3:1のアスペクト比でサイズ変更するレイアウトは次のとおりです。
<Android.support.constraint.ConstraintLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="#FF0000">
<ImageView
Android:id="@+id/imageView"
Android:layout_width="0dp"
Android:layout_height="0dp"
Android:layout_marginStart="16dp"
Android:layout_marginTop="16dp"
Android:layout_marginEnd="16dp"
Android:background="#0000FF"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintDimensionRatio="H,3:1" />
</Android.support.constraint.ConstraintLayout>
結果ビューは次のとおりです。
基本的には、
layout_constraintDimensionRatio(width:height)
例
<!-- button which have width = it's content and height = 1/2 width -->
<Button
Android:layout_width="wrap_content"
Android:layout_height="0dp"
app:layout_constraintStart_toStartOf="parent" <!-- I still think that we don't need this attribute but I when I don't add this, constraint not working -->
Android:text="Button TEST RATIO 1"
app:layout_constraintDimensionRatio="2:1" />
出力
<!-- button which have width = it's content and height = 1/2 width -->
<Button
Android:layout_width="wrap_content"
Android:layout_height="0dp"
app:layout_constraintStart_toStartOf="parent"
Android:text="Button TEST RATIO 2"
app:layout_constraintDimensionRatio="2" /> <!-- 2 here <=> 2:1 <=> 2/1 (1:1 <=> 1, 1/2 <=> 0.5, ....) ->
出力
<!-- button which have width = match_parent and height = 1/2 width -->
<Button
Android:layout_width="match_parent"
Android:layout_height="0dp"
Android:text="Button TEST RATIO 3"
app:layout_constraintDimensionRatio="2" />
出力
<!-- button which have width = match constraint and height = 1/2 width -->
<Button
Android:layout_width="0dp"
Android:layout_height="0dp"
Android:text="Button TEST RATIO 4"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintDimensionRatio="2" />
出力
デモ: https://github.com/PhanVanLinh/AndroidConstraintLayoutRatio
これらのImageView
プロパティを見てください。
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
これらのプロパティはlayout_constraintDimensionRatio
をオーバーライドします。これにより、ImageView
はメインの親の下部、上部、および左側に制約され、メインの左、上部、および下部をView
が占有します。画面。
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
これが1つの解決策になります。ビューを上部に表示する場合、またはその逆を表示する場合は、layout_constraintBottom_toBottomOf
を省略できます。 上記のすべての制約をすべて削除するが、おそらく最もよいlayout_constraintDimensionRatio
を除いて推奨であることが最善でしょう。