Consider the following layout file:
<?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>
I am not sure how the app:layout_constraintDimensionRatio works. My understanding is the ratio will always be width:height. So 3:1 will always make the ImageView appear 3 times wider than height. The prefix H or W tells ConstraintLayout which dimension should respect the ratio. If it is H then it means width will be first computed from other constraints and then height will be adjusted according to the aspect ratio. However this is the result of the layout:
The height is 3 times larger than width which is unexpected. Can anyone explain to me how the dimensions are computed with respect to app:layout_constraintDimensionRatio setting?
Basically, we have
EXAMPLE
Output
Output
Output
Output
DEMO: https://github.com/PhanVanLinh/AndroidConstraintLayoutRatio
Take a look at these
ImageView
properties:These properties override the
layout_constraintDimensionRatio
due to which theImageView
is constrained to the bottom, top and left of the main parent resulting in theView
occupying the left, top and bottom portions of the main screen.This would be one solution. You can omit
layout_constraintBottom_toBottomOf
if you want the View to appear on the top or vice-versa. It would probably be best to remove all the above constraints altogether except thelayout_constraintDimensionRatio
, which would be the most recommended solution.Your understanding for the way
app:layout_constraintDimensionRatio
works is correct. If you setapp:layout_constraintDimensionRatio="H,3:1"
then it means width will be first computed from other constraints and then height will be adjusted according to the aspect ratio. The only problem with your implementation is that you addedapp:layout_constraintBottom_toBottomOf="parent"
to the ImageView, so that it causedapp:layout_constraintDimensionRatio
to be ignored.Here's the layout to size your ImageView in 3:1 aspect ratio:
and here's the result view: