Dies ist nicht die leistungsstärkste Lösung, aber wie jemand vorgeschlagen hat, können Sie anstelle des Hintergrunds FrameLayout oder RelativeLayout erstellen und ImageView als Pseudohintergrund verwenden - andere Elemente werden einfach darüber positioniert:
<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>
Das Problem mit ImageView besteht darin, dass nur die verfügbaren scaleTypes verfügbar sind: CENTER, CENTER_CROP, CENTER_INSIDE, FIT_CENTER, FIT_END, FIT_START, FIT_XY, MATRIX ( http://etcodehome.blogspot.de/2011/05/android-imageview-scaletype-samples.samples )
und um "das Hintergrundbild zu skalieren (sein Seitenverhältnis beizubehalten)" in einigen Fällen, wenn Sie möchten, dass ein Bild den gesamten Bildschirm ausfüllt (z. B. Hintergrundbild) und das Seitenverhältnis des Bildschirms sich von dem des Bildes unterscheidet, ist der erforderliche Skalentyp freundlich von TOP_CROP, weil:
CENTER_CROP zentriert das skalierte Bild, anstatt die Oberkante an der Oberkante der Bildansicht auszurichten, und FIT_START passt die Bildschirmhöhe an und füllt nicht die Breite. Und wie Benutzer Anke bemerkte, behält FIT_XY das Seitenverhältnis nicht bei.
Gerne hat jemand ImageView erweitert, um TOP_CROP zu unterstützen
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
Jetzt wäre IMHO perfekt, wenn jemand ein benutzerdefiniertes Drawable schreiben würde, das das Bild so skaliert. Dann könnte es als Hintergrundparameter verwendet werden.
Reflog empfiehlt, Drawable vor der Verwendung vorab zu skalieren. Hier ist eine Anleitung, wie es geht:
Java (Android): Wie skaliere ich ein Drawable ohne Bitmap?
Obwohl dies den Nachteil hat, dass die hochskalierte Drawable / Bitmap mehr RAM benötigt, während die von ImageView verwendete Skalierung im laufenden Betrieb nicht mehr Speicher benötigt. Vorteil könnte eine geringere Prozessorlast sein.