Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Android: Escala de una imagen de dibujo o de fondo?

En un diseño, quiero escalar la imagen de fondo (manteniendo su relación de aspecto) con el espacio asignado cuando se crea la página. Alguien tiene alguna idea de cómo hacer esto?

Estoy usando layout.setBackgroundDrawable () y estoy usando un BitmapDrawable para setGravity para recortar y rellenar, pero no veo ninguna opción para escalar.

  • Limite el número de claves API de Google Maps asociadas con una huella dactilar SHA-1 (es decir, almacén de claves de depuración)?
  • Cómo agregar Go botón en android SoftKeyBoard y su funcionalidad?
  • Cómo crear un método para el método de cálculo de edad en android
  • Retornos de carro / saltos de línea con \ n en cadenas en Android
  • Error de compilación: Error con el proyecto de Android en Xamarin.Forms
  • Borrar marcadores de Google Map en Android
  • Eclipse no crea nueva actividad y archivo de diseño xml (problemas iniciados después de actualizar eclipse y sdk)
  • Android: 'Pantalla Splash' sólo una vez
  • 12 Solutions collect form web for “Android: Escala de una imagen de dibujo o de fondo?”

    Para personalizar la ampliación de la imagen de fondo, cree un recurso como este:

    <?xml version="1.0" encoding="utf-8"?> <bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:gravity="center" android:src="@drawable/list_bkgnd" /> 

    A continuación, se centrará en la vista si se utiliza como fondo. También hay otras banderas: http://developer.android.com/guide/topics/resources/drawable-resource.html

    No has intentado hacer exactamente lo que quieres, pero puedes escalar un ImageView usando android:scaleType="fitXY"
    Y se dimensionará para adaptarse a cualquier tamaño que le dé el ImageView.

    Así que usted podría crear un FrameLayout para su diseño, poner el ImageView dentro de él, y luego cualquier otro contenido que necesita en el FrameLayout así w / un fondo transparente.

     <FrameLayout android:layout_width="fill_parent" android:layout_height="fill_parent"> <ImageView android:layout_width="fill_parent" android:layout_height="fill_parent" android:src="@drawable/back" android:scaleType="fitXY" /> <LinearLayout>your views</LinearLayout> </FrameLayout> 

    Hay una manera fácil de hacer esto del drawable:

    Your_drawable.xml

     <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item android:drawable="@color/bg_color"/> <item> <bitmap android:gravity="center|bottom|clip_vertical" android:src="@drawable/your_image" /> </item> </layer-list> 

    El único inconveniente es que si no hay suficiente espacio, su imagen no se mostrará completamente, pero se cortará, no pude encontrar una manera de hacerlo directamente desde un dibujable. Pero a partir de las pruebas que hice que funciona bastante bien, y no clip que gran parte de la imagen. Podrías jugar más con las opciones de gravedad.

    Otra forma será simplemente crear un diseño, donde se utilizará un ImageView y establecer el scaleType para fitCenter .

    Para mantener la relación de aspecto que tiene que usar android:scaleType=fitCenter o fitStart etc Utilizando fitXY no mantendrá la relación de aspecto original de la imagen!

    Tenga en cuenta que esto sólo funciona para las imágenes con un atributo src , no para la imagen de fondo.

    Utilice la imagen como fondo de tamaño de diseño:

     <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" > <ImageView android:id="@+id/imgPlaylistItemBg" android:layout_width="match_parent" android:layout_height="match_parent" android:adjustViewBounds="true" android:maxHeight="0dp" android:scaleType="fitXY" android:src="@drawable/img_dsh" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > </LinearLayout> </FrameLayout> 

    Cuando establezca Drawable de un ImageView utilizando el método setBackgroundDrawable , la imagen siempre se escalará. Parámetros como adjustViewBounds o diferentes ScaleTypes simplemente serán ignorados. La única solución para mantener la relación de aspecto que encontré, es cambiar el tamaño de ImageView después de cargar su dibujable. Aquí está el fragmento de código que utilicé:

     // bmp is your Bitmap object int imgHeight = bmp.getHeight(); int imgWidth = bmp.getWidth(); int containerHeight = imageView.getHeight(); int containerWidth = imageView.getWidth(); boolean ch2cw = containerHeight > containerWidth; float h2w = (float) imgHeight / (float) imgWidth; float newContainerHeight, newContainerWidth; if (h2w > 1) { // height is greater than width if (ch2cw) { newContainerWidth = (float) containerWidth; newContainerHeight = newContainerWidth * h2w; } else { newContainerHeight = (float) containerHeight; newContainerWidth = newContainerHeight / h2w; } } else { // width is greater than height if (ch2cw) { newContainerWidth = (float) containerWidth; newContainerHeight = newContainerWidth / h2w; } else { newContainerWidth = (float) containerHeight; newContainerHeight = newContainerWidth * h2w; } } Bitmap copy = Bitmap.createScaledBitmap(bmp, (int) newContainerWidth, (int) newContainerHeight, false); imageView.setBackgroundDrawable(new BitmapDrawable(copy)); LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); imageView.setLayoutParams(params); imageView.setMaxHeight((int) newContainerHeight); imageView.setMaxWidth((int) newContainerWidth); 

    En el fragmento de código anterior se muestra bmp el objeto Bitmap que se va a mostrar y imageView es el objeto ImageView

    Una cosa importante a tener en cuenta es el cambio de los parámetros de diseño . Esto es necesario porque setMaxHeight y setMaxWidth sólo harán una diferencia si el ancho y la altura están definidos para envolver el contenido, no para rellenar el padre. Llenar padre por otro lado es la configuración deseada al principio, porque de lo contrario containerWidth y containerHeight tendrán ambos valores iguales a 0. Así, en tu archivo de diseño tendrás algo como esto para tu ImageView:

     ... <ImageView android:id="@+id/my_image_view" android:layout_width="fill_parent" android:layout_height="fill_parent"/> ... 

    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 estarán simplemente por encima de la posición:

     <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="match_parent" android:layout_width="match_parent"> <ImageView android:id="@+id/ivBackground" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:scaleType="fitStart" android:src="@drawable/menu_icon_exit" /> <Button android:id="@+id/bSomeButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_marginLeft="61dp" android:layout_marginTop="122dp" android:text="Button" /> </RelativeLayout> 

    El problema con ImageView es que sólo los tipos scaleTypes 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 "escalar la imagen de fondo (manteniendo su relación de aspecto)" en algunos casos, cuando se 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, De TOP_CROP, porque:

    CENTER_CROP centra la imagen escalada en lugar de alinear el borde superior al borde superior de la vista de imagen y FIT_START ajusta la altura de la pantalla y no rellena el ancho. Y como el usuario Anke notó FIT_XY no mantiene la relación de aspecto.

    Felizmente alguien ha extendido ImageView para apoyar TOP_CROP

     public class ImageViewScaleTypeTopCrop extends ImageView { public ImageViewScaleTypeTopCrop(Context context) { super(context); setup(); } public ImageViewScaleTypeTopCrop(Context context, AttributeSet attrs) { super(context, attrs); setup(); } public ImageViewScaleTypeTopCrop(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); setup(); } private void setup() { setScaleType(ScaleType.MATRIX); } @Override protected boolean setFrame(int frameLeft, int frameTop, int frameRight, int frameBottom) { float frameWidth = frameRight - frameLeft; float frameHeight = frameBottom - frameTop; if (getDrawable() != null) { Matrix matrix = getImageMatrix(); float scaleFactor, scaleFactorWidth, scaleFactorHeight; scaleFactorWidth = (float) frameWidth / (float) getDrawable().getIntrinsicWidth(); scaleFactorHeight = (float) frameHeight / (float) getDrawable().getIntrinsicHeight(); if (scaleFactorHeight > scaleFactorWidth) { scaleFactor = scaleFactorHeight; } else { scaleFactor = scaleFactorWidth; } matrix.setScale(scaleFactor, scaleFactor, 0, 0); setImageMatrix(matrix); } return super.setFrame(frameLeft, frameTop, frameRight, frameBottom); } } 

    https://stackoverflow.com/a/14815588/2075875

    Ahora IMHO sería perfecto si alguien escribió Drawable personalizado que escala imagen como esa. Entonces podría ser utilizado como parámetro de fondo.


    Reflog sugiere a prescale dibujable antes de usarlo. Aquí está la instrucción de cómo hacerlo: Java (Android): ¿Cómo escalar un dibujable sin Bitmap? A pesar de que tiene desventaja, que upscaled dibujable / mapa de bits se utiliza más de RAM, mientras que la escala de la mosca utilizada por ImageView no requiere más memoria. Ventaja podría ser menos carga del procesador.

    Lo que Dweebo propuso obras. Pero en mi humilde opinión es innecesario. Un plano de fondo escalables bien por sí mismo. La vista debe tener anchura y altura fijas, como en el ejemplo siguiente:

      < RelativeLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@android:color/black"> <LinearLayout android:layout_width="500dip" android:layout_height="450dip" android:layout_centerInParent="true" android:background="@drawable/my_drawable" android:orientation="vertical" android:padding="30dip" > ... </LinearLayout> < / RelativeLayout> 

    El código inferior hace que el mapa de bits perfectamente con el mismo tamaño de la imagen. Obtenga la altura y el ancho de la imagen de mapa de bits y luego calcule la nueva altura y el ancho con la ayuda de los parámetros de imageview. Que le dan la imagen necesaria con la mejor relación de aspecto.

     int bwidth=bitMap1.getWidth(); int bheight=bitMap1.getHeight(); int swidth=imageView_location.getWidth(); int sheight=imageView_location.getHeight(); new_width=swidth; new_height = (int) Math.floor((double) bheight *( (double) new_width / (double) bwidth)); Bitmap newbitMap = Bitmap.createScaledBitmap(bitMap1,new_width,new_height, true); imageView_location.setImageBitmap(newbitMap) 

    Una opción para intentar es poner la imagen en la carpeta drawable-nodpi y establecer el fondo de un diseño en el ID de recurso dibujable.

    Esto definitivamente funciona con la reducción de escala, no he probado con la ampliación.

    Usted tendrá que pre-escalar que dibujable antes de usarlo como un fondo

    Puede utilizar uno de los siguientes:

    Android: gravity = "fill_horizontal | clip_vertical"

    O

    Android: gravity = "fill_vertical | clip_horizontal"

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.