Questa non è la soluzione più performante, ma come qualcuno ha suggerito invece di sfondo puoi creare FrameLayout o RelativeLayout e usare ImageView come sfondo pseudo - altri elementi saranno posizionati semplicemente sopra di esso:
<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>
Il problema con ImageView è che solo scaleTypes disponibili sono: 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 )
e per "ridimensionare l'immagine di sfondo (mantenendo le proporzioni)" in alcuni casi, quando si desidera che un'immagine riempia l'intero schermo (ad esempio l'immagine di sfondo) e le proporzioni dello schermo siano diverse da quelle dell'immagine, il tipo di scala necessario è gentile di TOP_CROP, perché:
CENTER_CROP centra l'immagine in scala invece di allineare il bordo superiore a quello superiore della vista immagine e FIT_START si adatta all'altezza dello schermo e non riempie la larghezza. E come ha notato l'utente Anke, FIT_XY non mantiene le proporzioni.
Volentieri qualcuno ha esteso ImageView per supportare 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
Ora IMHO sarebbe perfetto se qualcuno scrivesse un Drawable personalizzato che ridimensiona l'immagine in quel modo. Quindi potrebbe essere utilizzato come parametro di sfondo.
Reflog suggerisce di ridimensionare il disegno prima di usarlo. Ecco le istruzioni su come farlo:
Java (Android): come ridimensionare un disegno senza Bitmap?
Sebbene abbia uno svantaggio, quel drawable / bitmap ingrandito utilizzerà più RAM, mentre il ridimensionamento al volo usato da ImageView non richiede più memoria. Il vantaggio potrebbe essere un minor carico del processore.