2010-05-04 13 views
16

Tengo un ImageView con la altura máxima y el ancho máximo ambos configurados en 100. La siguiente figura claramente no es un cuadrado, pero se puede utilizar su imaginación;)Posicionar una imagen dentro de un ImageView con la altura máxima y el ancho máximo establecidos

Figura 1:

╔══════════════════════════════════════════════╗ 
║ ImageView ╔══════════════╗    ║ 
║    ║    ║    ║ 
║    ║ Actual image ║    ║ 
║    ║    ║    ║ 
║    ║    ║    ║ 
║    ║    ║    ║ 
║    ╚══════════════╝    ║ 
╚══════════════════════════════════════════════╝ 

De todos modos, Si trato de establecer un BitMap a la ImageView que no tiene una relación de 1: 1, la imagen se coloca como se muestra en la Figura 1. Lo que quiero es que la imagen se coloque a la izquierda dentro de ImageView, como se muestra en la Figura 2 a continuación.

Figura 2:

╔══════════════════════════════════════════════╗ 
║══════════════╗        ║ 
║    ║        ║ 
║ Actual image ║        ║ 
║    ║        ║ 
║    ║        ║ 
║    ║        ║ 
║══════════════╝        ║ 
╚══════════════════════════════════════════════╝ 

puedes ver mis ImageView en XML siguiente. maxHeight, maxWidth y adjustViewBounds se establecen durante el tiempo de ejecución.

<ImageView android:id="@+id/someImage" 
    android:layout_alignParentLeft="true" 
    android:layout_below="@+id/textName" 
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content" 
    android:paddingRight="4dp" 
    /> 

Esto es en un RelativeLayout si hace alguna diferencia.

+8

+1 para bien ascii arte :-) –

Respuesta

1

Trate

android:gravity="left" 

gravedad es cómo una vista posiciona su contenido. Funciona en TextView para texto y probablemente ImageView para imagen.

Editar:

trate de hacer una FrameLayout que contiene el ImageView. Establezca el ancho y el alto de ImageView a "wrap_content" y establezca la gravedad del elemento principal como "izquierda".

De lo contrario, implemente onDraw en una Vista y dibuje la imagen en la posición que desee.

1

que utilizo:

android:scaleType="fitCenter" 

documentados here. ¡Buena suerte!

EDIT: Malo, no me di cuenta de que estaba centrando una imagen en un ImageView (mi primera lectura pensé que tenía problemas para centrar el ImageView dentro de otra Vista). Ahora no estoy tan seguro, pero se puede mirar a ScaleType de todos modos^_-

2

que enfrentan el mismo problema y así es como lo resolví:

me acabó poniendo el ImageView dentro de un RelativeLayout que es tan grande como ImageView y establecer la gravedad de la distribución relativa a lo que quería (en su caso).

También establecí adjustViewBounds en verdadero, por lo que ImageView es tan grande como la imagen y se coloca dentro del diseño relativo.

No

una solución muy elegante, pero funciona ...

3

¿Por qué no acaba de añadir una drawableLeft a la vista.

Me gusta esto (en su diseño.xml): android: drawableLeft = "@ drawable/yourDrawableId" -o bien - de esta manera (en código Java): yourView.setCompoundDrawablesWithIntrinsicBounds (yourDrawableId, 0, 0,0);

Puede controlar el relleno, etc. de este dibujable dentro de su contenedor de visualización (para controlar los ajustes de diseño de granularidad cercana).

+0

¿Y dónde exactamente funciona eso? La finalización automática no me muestra "DrawableLeft". ¿Puedes dar un ejemplo? –

19

probar esto

<ImageView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:src="@drawable/home_icon" 
    android:scaleType="fitStart"/> 

Sólo ayuda para mí.

1

Algo no está bien. Su ImageView se define con wrap_content para su layout_width y layout_height en el XML, por lo que siempre debe ocupar el mismo espacio que su mapa de bits.

trate de añadir un android:background para su ImageView a ver que lo que realmente es más ancho que el mapa de bits y causó el centrado deseado:

<ImageView android:id="@+id/someImage" 
    android:layout_alignParentLeft="true" 
    android:layout_below="@+id/textName" 
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content" 
    android:paddingRight="4dp" 
    android:background="#F00" 
    /> 

prueba con algunos mapas de bits que tiene color de fondo transparente para que podamos ver la roja fondo de ImageView. Espero que muestre un rectángulo alto si el mapa de bits de origen es alto y un rectángulo ancho si el mapa de bits es ancho. Solo verá un cuadrado si su mapa de bits de origen es cuadrado. Nunca deberíamos ver el caso de la figura 1 de su pregunta.

¿Tal vez quería tener su ImageView para tener siempre una dimensión 100x100 en todo momento? A continuación, puede utilizar el siguiente código (nótese la fitStart para la scaleType atributo como mencionado correctamente por otros ya):

<ImageView android:id="@+id/someImage" 
    android:layout_alignParentLeft="true" 
    android:layout_below="@+id/textName" 
    android:layout_width="100dp" 
    android:layout_height="100dp" 
    android:paddingRight="4dp" 
    android:background="#F00" 
    android:scaleType="fitStart" 
    /> 

No hay necesidad de establecer maxHeight, maxWidth y adjustViewBounds del código Java, si esto es lo que querer.

4

De forma predeterminada, scaleType es "fitCenter"/ScaleType.FIT_CENTER como en su primer boceto.


Para alinear la dibujable a la dejó del ImageView, como se muestra en el segundo boceto:

en la vista xml:

<ImageView 
    android:scaleType="fitStart" /> 

o en la clase Java :

ImageView image_view = [create new ImageView or getView from xml]; 
image_view.setScale(ScaleType.FIT_START); 


Para alinear la dibujable a la derecha del ImageView

en la vista xml:

<ImageView 
    android:scaleType="fitEnd" /> 

o en la clase Java:

ImageView image_view = [create new ImageView or getView from xml]; 
image_view.setScale(ScaleType.FIT_END); 
+0

¡Exactamente la buena respuesta para centrar una imagen dentro de un ImageView, necesita más votos! – Pull

Cuestiones relacionadas