Sie können setBounds
die "zusammengesetzten" Zeichen aufrufen, um die Größe des Bildes zu ändern.
Versuchen Sie diesen Code, um die Zeichnungsgröße Ihrer Schaltfläche automatisch zu ändern:
DroidUtils.scaleButtonDrawables((Button) findViewById(R.id.ButtonTest), 1.0);
definiert durch diese Funktion:
public final class DroidUtils {
/** scale the Drawables of a button to "fit"
* For left and right drawables: height is scaled
* eg. with fitFactor 1 the image has max. the height of the button.
* For top and bottom drawables: width is scaled:
* With fitFactor 0.9 the image has max. 90% of the width of the button
* */
public static void scaleButtonDrawables(Button btn, double fitFactor) {
Drawable[] drawables = btn.getCompoundDrawables();
for (int i = 0; i < drawables.length; i++) {
if (drawables[i] != null) {
int imgWidth = drawables[i].getIntrinsicWidth();
int imgHeight = drawables[i].getIntrinsicHeight();
if ((imgHeight > 0) && (imgWidth > 0)) { //might be -1
float scale;
if ((i == 0) || (i == 2)) { //left or right -> scale height
scale = (float) (btn.getHeight() * fitFactor) / imgHeight;
} else { //top or bottom -> scale width
scale = (float) (btn.getWidth() * fitFactor) / imgWidth;
}
if (scale < 1.0) {
Rect rect = drawables[i].getBounds();
int newWidth = (int)(imgWidth * scale);
int newHeight = (int)(imgHeight * scale);
rect.left = rect.left + (int)(0.5 * (imgWidth - newWidth));
rect.top = rect.top + (int)(0.5 * (imgHeight - newHeight));
rect.right = rect.left + newWidth;
rect.bottom = rect.top + newHeight;
drawables[i].setBounds(rect);
}
}
}
}
}
}
Beachten Sie, dass dies möglicherweise nicht onCreate()
für eine Aktivität aufgerufen wird , da Höhe und Breite der Schaltflächen dort (noch) nicht verfügbar sind. Rufen Sie dies auf onWindowFocusChanged()
oder verwenden Sie diese Lösung , um die Funktion aufzurufen.
Bearbeitet:
Die erste Inkarnation dieser Funktion funktionierte nicht richtig. Es wurde userSeven7s Code verwendet, um das Bild zu skalieren, aber die Rückgabe ScaleDrawable.getDrawable()
scheintScaleDrawable
für mich nicht zu funktionieren (und auch nicht ).
Der geänderte Code verwendet setBounds
, um die Grenzen für das Bild bereitzustellen. Android passt das Bild in diese Grenzen.