Porcentaje de ancho máximo de ConstraintLayout

6 minutos de lectura

Avatar de usuario de Hyhage
Hyhage

He estado experimentando con ConstraintLayout, ¿hay alguna manera de establecer el ancho máximo de una vista en un porcentaje del padre (y una altura de restricción de coincidencia y una relación de dimensión de 1: 1)?

Aquí está el código sin usar el ancho máximo:

<?xml version="1.0" encoding="utf-8"?>
<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="wrap_content">

   <FrameLayout
      android:id="@+id/frameLayout3"
      android:layout_width="0dp"
      android:layout_height="259dp"
      android:layout_marginEnd="8dp"
      android:layout_marginStart="8dp"
      android:background="@android:color/black"
      app:layout_constraintEnd_toEndOf="parent"
      app:layout_constraintHorizontal_bias="0.0"
      app:layout_constraintStart_toEndOf="@+id/imageView"
      app:layout_constraintTop_toTopOf="parent"/>

   <ImageView
      android:id="@+id/imageView"
      android:layout_width="0dp"
      android:layout_height="0dp"
      android:src="https://stackoverflow.com/questions/49255147/@android:drawable/ic_menu_add"
      app:layout_constraintBottom_toBottomOf="@+id/frameLayout3"
      app:layout_constraintDimensionRatio="1:1"
      app:layout_constraintStart_toStartOf="parent"
      app:layout_constraintTop_toTopOf="parent"
      app:layout_constraintWidth_percent="0.3"/>

</android.support.constraint.ConstraintLayout>

Este es el resultado:

Tableta:

Tableta

Teléfono:

Teléfono

  • Intentar este enlace.

    – Cagri Yalcín

    13/03/2018 a las 11:50

  • Sin embargo, preferiría evitar usar PercentLayout, ya que quedó obsoleto a favor de ConstraintLayout.

    – Hyhage

    13 de marzo de 2018 a las 12:19

  • Entonces puedes usar LinearLayout

    – Cagri Yalcín

    13 de marzo de 2018 a las 14:01

  • Lo siento si no estoy siendo claro, en realidad no quiero usar porcentajes para ancho/alto, solo quiero que la vista esté limitada por un porcentaje. Usar un porcentaje (usando peso o con una guía) hace que se vea así en el teléfono: i.imgur.com/4fjmryf.png lo cual está bien, pero no en la tableta: i.imgur.com/27F39Lq.png . ImageView no debe ser más grande que FrameLayout a la derecha.

    – Hyhage

    13 de marzo de 2018 a las 14:45


Avatar de usuario de Thomson Varghese
Thomson Varghese

Logré el porcentaje de ancho máximo usando dos atributos:

app:layout_constraintWidth_max="wrap"
app:layout_constraintWidth_percent="0.4" 

Ejemplo:

<TextView
    android:id="@+id/textView2"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="8dp"
    android:layout_marginTop="8dp"
    android:text="Helo world"
    android:textAlignment="viewStart"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintWidth_max="wrap"
    app:layout_constraintWidth_percent="0.4" />

El ancho del texto aumentará al 40% del principal y luego se ajustará si el contenido excede eso.

  • @ thomson-varghese, probé su respuesta, pero no recibí el resultado correcto / Tal vez, hice algo mal. ¿Puede verificar mi código, por favor y escribir, cómo establecer el ancho máximo como porcentaje del padre, pero solo el ancho “regular” debería ser como wrap_content: 1) primera variante cuando el texto es demasiado largo, y el ancho debe ser como% del padre 2) segunda variantecuando el ancho no debe ser tan grande, basta con wrap_content Mi código

    – Serguéi Grishin

    28 de julio de 2019 a las 15:42

  • ¡buen trabajo! ¿podría explicar qué significa layout_constraintWidth_max="wrap" significa realmente?

    – mamá

    30 de abril de 2020 a las 11:42

  • no funciona cuando dicha vista de texto se coloca en Flujo vertical cuando oscurece la vista que está arriba y abajo

    – Michael Ziobro

    15 de junio de 2020 a las 8:34

  • pero si el espacio ocupado es inferior al 0,4 por ciento, seguirá siendo un mínimo igualado al 0,4 por ciento

    – usuario924

    21 de julio de 2020 a las 14:42

  • no se ajusta si el texto está en varias líneas

    –David Abraham

    19 de octubre de 2020 a las 7:08

Si estoy entendiendo tu problema en ese momento, ya casi has llegado. creo que estas dando frameLayout altura estática es por eso que no está dando el resultado apropiado en la tableta… porque establece la altura de acuerdo con la vista previa del teléfono. Lo que tienes que hacer es hacer la altura de frameLayout relativo a imageView.. así que cuando imageView crece en tamaño el frameLayout también crece con él.

Creo que deberías hacer algo como esto.

<?xml version="1.0" encoding="utf-8"?>
<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="wrap_content">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:src="https://stackoverflow.com/questions/49255147/@android:drawable/ic_menu_add"
        app:layout_constraintDimensionRatio="1:1"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintWidth_percent="0.3" />    

    <FrameLayout
        android:id="@+id/frameLayoutTwo"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="@android:color/black"
        app:layout_constraintBottom_toBottomOf="@+id/imageView"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/imageView"
        app:layout_constraintTop_toTopOf="parent" /> 

</android.support.constraint.ConstraintLayout>

Lo comprobé y esto da el mismo resultado en el teléfono y la tableta. Corrígeme si entendí mal tu problema.

No no hay. Creo que deberíamos presentar una solicitud de función. Estoy bastante seguro de que PercentRelativeLayout tampoco tiene esta función. (Esta respuesta es precisa para ConstraintLayout 1.1)

Puede establecer un LinearLayout u otro ViewGroup como porcentaje exacto width y coloca tu wrap_content ver dentro de este diseño.

        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <ImageView
                android:id="@+id/image_place_holder"
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:scaleType="centerCrop"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

            <!-- This LinearLayout will have exact 80% of parent width-->
            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintTop_toTopOf="parent"
                app:layout_constraintWidth_percent="0.8">

                
                <!-- This MaterialCardView will get a wrap_content width, 
                with a max width of his parent LinearLayout, which is 80% -->
                <com.google.android.material.card.MaterialCardView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="@dimen/half_activity_horizontal_margin"
                    android:layout_marginTop="@dimen/half_activity_vertical_margin"
                    android:layout_marginEnd="@dimen/half_activity_horizontal_margin"
                    android:layout_marginBottom="@dimen/half_activity_vertical_margin"
                    android:backgroundTint="?attr/colorPrimary">

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:maxLines="1"
                        android:paddingStart="@dimen/half_activity_horizontal_margin"
                        android:paddingEnd="@dimen/half_activity_horizontal_margin"
                        android:text="Lorem ipsum"
                        android:textAppearance="?attr/textAppearanceCaption" />

                </com.google.android.material.card.MaterialCardView>

            </LinearLayout>

        </androidx.constraintlayout.widget.ConstraintLayout>

¿Ha sido útil esta solución?