Ce n'est pas la solution la plus performante, mais comme quelqu'un l'a suggéré, au lieu d'un arrière-plan, vous pouvez créer un FrameLayout ou un RelativeLayout et utiliser ImageView comme pseudo-arrière-plan - les autres éléments seront positionnés simplement au-dessus :
<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>
Le problème avec ImageView est que les seuls scaleTypes disponibles sont : 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 )
et pour "mettre à l'échelle l'image d'arrière-plan (en conservant son rapport d'aspect)" dans certains cas, lorsque vous voulez qu'une image remplisse tout l'écran (par exemple l'image d'arrière-plan) et que le rapport d'aspect de l'écran est différent de celui de l'image, le type d'échelle nécessaire est en quelque sorte TOP_CROP, car.. :
CENTER_CROP centre l'image mise à l'échelle au lieu d'aligner le bord supérieur sur le bord supérieur de la vue de l'image et FIT_START s'adapte à la hauteur de l'écran et ne remplit pas la largeur. Et comme l'utilisateur Anke l'a remarqué, FIT_XY ne conserve pas le rapport d'aspect.
Heureusement, quelqu'un a étendu ImageView pour supporter 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
Maintenant, IMHO serait parfait si quelqu'un a écrit un Drawable personnalisé qui met l'image à l'échelle comme ça. Il pourrait alors être utilisé comme paramètre d'arrière-plan.
Reflog suggère de mettre à l'échelle le dessinable avant de l'utiliser. Voici les instructions pour le faire : Java (Android) : Comment mettre à l'échelle un drawable sans Bitmap ? Bien qu'elle présente l'inconvénient de nécessiter plus de mémoire vive (RAM) pour la mise à l'échelle d'un dessin ou d'un bitmap, la mise à l'échelle à la volée utilisée par ImageView ne nécessite pas plus de mémoire. L'avantage pourrait être de réduire la charge du processeur.