2012-09-07 7 views
22

Estoy tratando de establecer el ancho del diseño en "fill_parent" mientras que el alto de la vista tiene la misma longitud, para hacer que el diseño sea un cuadrado.Cómo establecer una relación de aspecto fija para un diseño en Android

Cualquier sugerencia será apreciada, ¡gracias de antemano! : D

+0

use wrap_content. Toma el mismo ancho y largo que la vista. –

+0

posible duplicado de [Rellene el espacio restante con vista superficial de relación de aspecto fija] (http://stackoverflow.com/questions/10510371/fill-remaining-space-with-fixed-aspect-ratio-surfaceview) – Tim

+0

Luché con esto por mí mismo un tiempo, y finalmente decidí que tenía que anular el onMeasure de la vista que quería restringir y establecer las dimensiones mediante programación. Ver el duplicado vinculado – Tim

Respuesta

18

Con la introducción de ConstraintLayout usted no tiene que escribir sea una sola línea de código o utilizar terceras partes o confiar en que fueron PercentFrameLayout en desuso en 26.0.0.

Aquí está el ejemplo de cómo mantener una relación 1: 1 aspecto de su diseño utilizando ConstraintLayout:

<android.support.constraint.ConstraintLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <FrameLayout 
     android:layout_width="0dp" 
     android:layout_height="0dp" 
     android:layout_marginEnd="0dp" 
     android:layout_marginStart="0dp" 
     android:layout_marginTop="0dp" 
     android:background="@android:color/black" 
     app:layout_constraintDimensionRatio="H,1:1" 
     app:layout_constraintEnd_toEndOf="parent" 
     app:layout_constraintStart_toStartOf="parent" 
     app:layout_constraintTop_toTopOf="parent"> 

    </FrameLayout> 

</android.support.constraint.ConstraintLayout> 

O en lugar de editar el archivo XML, puede editar su diseño directamente en Layout Editor:

Layout Editor

+0

Hola @Eugene, cada vez que uso esto para capturar un video, el ancho siempre parece elástico, lo que podría haber sido la causa de este error. –

+0

Comparta la captura de pantalla, por favor. –

+0

https://meshileya.github.io/error.png esa es la captura de pantalla @Eugene Gracias por su respuesta. –

-1

altura establecida como fill_parent, la anchura que wrap_content

y fijar la relación de aspecto con android:adjustViewBounds="true"

+0

AdjustViewBounds solo se aplica a ImageView, y restringe la proporción del dibujable, no la proporción de la vista. – Tim

+0

por lo que desea hacer el diseño CUADRADO? –

17

Usted puede tratar de la configuración inicial de la layout_height a wrap_content. Pero a partir de ahí creo que tienes que entrar en el código. Sólo para experimentar, en su actividad de intentar algo como:

@Override 
public void onResume(){ 
    super.onResume(); 
    findViewById(R.id.squareView).getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
     @Override public void onGlobalLayout() { 
      View squareView = findViewById(R.id.squareView); 
      LayoutParams layout = squareView.getLayoutParams(); 
      layout.height = squareView.getWidth(); 
      squareView.setLayoutParams(layout); 
      squareView.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
     } 
    }); 
} 

Dónde R.id.squareView es el id de la opinión de que se trate. Y tenga en cuenta que este código está incluido en la llamada onGlobalLayout para asegurarse de que squareView.getWidth() tenga un valor significativo.

+0

¡Funciona! ¡Muchas gracias! – Bolton

+0

'removeGlobalOnLayoutListener' está en desuso. use 'removeOnGlobalLayoutListener (...)' – Aks4125

0
LinearLayout ll = (LinearLayout)findViewById(R.id.LL); 


int width = ll.getWidth(); 
LinearLayout.LayoutParams ll_params = new LinearLayout.LayoutParams(width, width); 
ll.setLayoutParams(ll_params); 
+1

Esto está más o menos bien, sin embargo, todo depende de * cuando * se llame. Por ejemplo, si pusiera este código en Crear, ll.getWidth() devolvería 0. – newbyca

19

En su build.gradle complemento:

compile 'com.android.support:percent:23.1.1' 

y en su layout.xmlenvoltura lo que sea vista o ViewGroup desea seguir una relación dentro de un PercentFrameLayout donde:

android:layout_width="match_parent" 
android:layout_height="wrap_content" 

y luego para la vista o ViewGroup desea seguir una relación reemplazarandroide: layout_width y androide: layout_height:

app:layout_aspectRatio="178%" 
    app:layout_widthPercent="100%" 

y se tiene una vista o ViewGroup donde la relación de aspecto es de 16: 9 (1.78: 1) con el ancho que coincide con el elemento principal y la altura ajustada en consecuencia.

Nota: Es importante que elimine las propiedades normales de ancho y alto. Lint se quejará, pero funcionará.

+1

Estoy de acuerdo con todo lo dicho aquí, excepto que para eliminar las propiedades normales de ancho y alto que mencionó es importante. Lo intenté y no funcionó para mí. En cambio, tuve que configurarlos para el siguiente android: layout_width = "0dp" android: layout_height = "0dp" como se describe aquí: http://stackoverflow.com/questions/34931023/percentframelayout-you-must-supply-a- layout-width-attribute –

+0

Advertencia: esto solo funcionará si el ancho del contenedor es> = altura del contenedor * 16/9. Si, por ejemplo, el ancho de su contenedor es de 1000dp y su altura de 50dp, su hijo se ajustará al ancho y tendrá una altura de 1000 * 9/16 = 562.5. –

+1

'PercentRelativeLayout' y' PercentFrameLayout' ahora están en desuso y sugieren utilizar 'ConstraintLayout' en su lugar. –

2

Creé una biblioteca de diseño para el caso de uso similar. Sientase libre de usarlo.

RatioLayouts

instalación

añadir esto a la parte superior del archivo

repositories { 
    maven { 
     url "http://dl.bintray.com/riteshakya037/maven" 
    } 
} 


dependencies { 
    compile 'com.ritesh:ratiolayout:1.0.0' 
} 

Uso

Definir espacio de nombres 'app' en vista raíz en su diseño

xmlns:app="http://schemas.android.com/apk/res-auto" 

Incluir esta biblioteca en su diseño

<com.ritesh.ratiolayout.RatioRelativeLayout 
     android:id="@+id/activity_main_ratio_layout" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     app:fixed_attribute="WIDTH" // Fix one side of the layout 
     app:horizontal_ratio="2" // ratio of 2:3 
     app:vertical_ratio="3"> 
Cuestiones relacionadas