Ésta no es la solución mas potente, pero como alguien sugirió en lugar de fondo se puede crear FrameLayout o RelativeLayout y el uso ImageView como pseudo fondo - otros elementos serán posición simplemente por encima de ella:
<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 scaleTypes disponibles son: CENTRO, CENTER_CROP, CENTER_INSIDE, FIT_CENTER, FIT_END, FIT_START, FIT_XY, MATRIZ (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 algún caso s, cuando quiere que una imagen ocupe 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 TOP_CROP, porque:
CENTER_CROP centra la imagen escalada en lugar de alineando el borde superior con el borde superior de la vista de la 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.
mucho gusto que 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 mi humilde opinión sería perfecto si alguien escribió Disponibles a medida que escala la imagen de esa manera. Entonces podría usarse como parámetro de fondo.
Reflog sugiere preescalar dibujable antes de usarlo. Aquí está la instrucción de cómo hacerlo: Java (Android): How to scale a drawable without Bitmap? Aunque tiene una desventaja, ese mapa escalable/de mapa escalable utilizará más RAM, mientras que el escalado sobre la marcha utilizado por ImageView no requiere más memoria. La ventaja podría ser menos carga del procesador.
Tuve este problema y seguí la recomendación de Dweebo con el cambio sugerido por Anke: cambiado fitXY para fitCenter. Funcionado bien. –