En un diseño, quiero escalar la imagen de fondo (manteniendo su relación de aspecto) al espacio asignado cuando se crea la página. ¿Alguien tiene una idea de cómo hacer esto?
Estoy usando layout.setBackgroundDrawable()
y a BitmapDrawable()
para configurar el gravity
recorte y el relleno, pero no veo ninguna opción para escalar.
Respuestas:
Para personalizar la escala de la imagen de fondo, cree un recurso como este:
Luego se centrará en la vista si se usa como fondo. También hay otras banderas: http://developer.android.com/guide/topics/resources/drawable-resource.html
fuente
No he intentado hacer exactamente lo que desea, pero puede escalar un ImageView usando
android:scaleType="fitXY"
y se ajustará al tamaño que le dé al ImageView.
Por lo tanto, puede crear un FrameLayout para su diseño, colocar ImageView dentro de él y luego cualquier otro contenido que necesite en FrameLayout también con un fondo transparente.
fuente
Hay una manera fácil de hacer esto desde el sorteo:
your_drawable.xml
El único inconveniente es que si no hay suficiente espacio, su imagen no se mostrará completamente, pero se recortará, no pude encontrar una manera de hacerlo directamente desde un dibujo. Pero a partir de las pruebas que hice, funciona bastante bien y no recorta gran parte de la imagen. Podrías jugar más con las opciones de gravedad.
Otra forma será la de simplemente crear un diseño, donde usará una
ImageView
y establecer lascaleType
afitCenter
.fuente
error: <item> must have a 'name' attribute.
Para mantener la relación de aspecto que tiene que usar
android:scaleType=fitCenter
ofitStart
etc. UsofitXY
no mantener la relación de aspecto original de la imagen!Tenga en cuenta que esto solo funciona para imágenes con un
src
atributo, no para la imagen de fondo.fuente
Use la imagen como fondo dimensionado para el diseño:
fuente
android:scaleType="centerCrop"
funcionaCuando establece el Drawable de un ImageView usando el
setBackgroundDrawable
método, la imagen siempre se escalará. Los parámetros comoadjustViewBounds
o diferentesScaleTypes
simplemente serán ignorados. La única solución para mantener la relación de aspecto que encontré es cambiar el tamañoImageView
después de cargar su dibujo. Aquí está el fragmento de código que utilicé:En el fragmento de código anterior, bmp es el objeto de mapa de bits que se debe mostrar e imageView es el
ImageView
objetoUna cosa importante a tener en cuenta es el cambio de los parámetros de diseño . Esto es necesario porque
setMaxHeight
ysetMaxWidth
solo hará una diferencia si el ancho y la altura están definidos para envolver el contenido, no para llenar el padre. Los padres de llenado en el otro lado es el ajuste deseado al principio, porque de lo contrariocontainerWidth
ycontainerHeight
ambos tienen valores iguales a 0. Por lo tanto, en su archivo de diseño va a tener algo como esto para su ImageView:fuente
Esta no es la solución más eficaz, pero como alguien sugirió en lugar de fondo, puede crear FrameLayout o RelativeLayout y usar ImageView como pseudo fondo; otros elementos se colocarán simplemente encima:
El problema con ImageView es que solo los tipos de escalas disponibles son: CENTER, CENTER_CROP, CENTER_INSIDE, FIT_CENTER, FIT_END, FIT_START, FIT_XY, MATRIX ( http://etcodehome.blogspot.de/2011/05/android-imageview-scaletype-samples.html )
y para "escalar la imagen de fondo (manteniendo su relación de aspecto)" en algunos casos, cuando desea que una imagen llene toda la pantalla (por ejemplo, imagen de fondo) y la relación de aspecto de la pantalla es diferente a la de la imagen, el tipo de escala necesario es amable de TOP_CROP, porque:
CENTER_CROP centra la imagen a escala en lugar de alinear el borde superior con el borde superior de la vista de imagen y FIT_START se ajusta a la altura de la pantalla y no llena el ancho. Y como el usuario Anke notó que FIT_XY no mantiene la relación de aspecto.
Con mucho gusto alguien ha extendido ImageView para soportar TOP_CROP
https://stackoverflow.com/a/14815588/2075875
Ahora, en mi humilde opinión, sería perfecto si alguien escribiera Drawable personalizado que escalara una imagen como esa. Entonces podría usarse como parámetro de fondo.
Reflog sugiere preescalar dibujable antes de usarlo. Aquí hay instrucciones de cómo hacerlo: Java (Android): ¿Cómo escalar un dibujo sin Bitmap? Aunque tiene una desventaja, ese mapa de bits / drawable escalado utilizará más RAM, mientras que el escalado sobre la marcha utilizado por ImageView no requiere más memoria. La ventaja podría ser una menor carga del procesador.
fuente
El código de abajo hace el mapa de bits perfectamente con el mismo tamaño de la vista de imagen. Obtenga la altura y el ancho de la imagen de mapa de bits y luego calcule la nueva altura y ancho con la ayuda de los parámetros de imageview. Eso le da la imagen requerida con la mejor relación de aspecto.
fuente
Lo que Dweebo propuso funciona. Pero en mi humilde opinión es innecesario. Un fondo dibujable se escala bien solo. La vista debe tener ancho y alto fijos, como en el siguiente ejemplo:
fuente
Una opción para intentar es colocar la imagen en la
drawable-nodpi
carpeta y establecer el fondo de un diseño en la identificación del recurso dibujable.Esto definitivamente funciona con la reducción, no he probado con la ampliación sin embargo.
fuente
Kotlin:
Si necesita dibujar un mapa de bits en una Vista, ajuste a FIT.
Puede hacer los cálculos adecuados para establecer bm la altura igual al contenedor y ajustar el ancho, en el caso de que la relación ancho / altura bm sea menor que la relación ancho / altura del contenedor, o lo inverso en el escenario opuesto.
Imágenes:
fuente
tendrás que preescalar ese dibujo antes de usarlo como fondo
fuente
Puede usar uno de los siguientes:
android: gravity = "fill_horizontal | clip_vertical"
O
android: gravity = "fill_vertical | clip_horizontal"
fuente