Ich stelle eine Zeichenfläche für ein Fortschrittsdialogfeld ein (pbarDialog
), aber mein Problem ist, dass ich die Größe der Zeichenfläche jedes Mal ändern möchte, aber nicht herausfinden kann, wie.
Hier ist ein Code:
Handler progressHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
// some more code
case UPDATE_PBAR:
pbarDialog.setIcon(mAppIcon);
pbarDialog.setMessage(mPbarMsg);
pbarDialog.incrementProgressBy(mIncrement+1);
break;
}
}
};
pbarDialog.show();
Thread myThread = new Thread(new Runnable() {
public void run() {
// some code
for (int i = 0; i < mApps.size(); i++) {
mAppIcon = mAdapter.getIcons().get(mApps.get(i).getPackageName());
// need to resize drawable here
progressHandler.sendEmptyMessage(UPDATE_PBAR);
}
handler.sendEmptyMessage(DISMISS_PBAR);
}
});
myThread.start();
Folgendes hat für mich funktioniert:
private Drawable resize(Drawable image) {
Bitmap b = ((BitmapDrawable)image).getBitmap();
Bitmap bitmapResized = Bitmap.createScaledBitmap(b, 50, 50, false);
return new BitmapDrawable(getResources(), bitmapResized);
}
Hier bin ich gelandet, auch dank Saads Antwort:
public Drawable scaleImage (Drawable image, float scaleFactor) {
if ((image == null) || !(image instanceof BitmapDrawable)) {
return image;
}
Bitmap b = ((BitmapDrawable)image).getBitmap();
int sizeX = Math.round(image.getIntrinsicWidth() * scaleFactor);
int sizeY = Math.round(image.getIntrinsicHeight() * scaleFactor);
Bitmap bitmapResized = Bitmap.createScaledBitmap(b, sizeX, sizeY, false);
image = new BitmapDrawable(getResources(), bitmapResized);
return image;
}
Für die Größenänderung ist dies Nizza und kurz (der Code oben funktionierte nicht für mich), gefunden hier :
ImageView iv = (ImageView) findViewById(R.id.imageView);
Bitmap bMap = BitmapFactory.decodeResource(getResources(), R.drawable.picture);
Bitmap bMapScaled = Bitmap.createScaledBitmap(bMap, newWidth, newHeight, true);
iv.setImageBitmap(bMapScaled);
Vielleicht deckt meine Lösung die Frage nicht vollständig ab, aber ich brauchte so etwas wie ein "CustomDrawable".
Mit anderen Worten, ich möchte ein Logo vor eine Kreisform setzen. Also habe ich ein FrameLayout mit einem Hintergrund (nur einem farbigen Kreis) erstellt und vor dieser runden Form zeige ich das Logo.
m die Größe des Logos zu ändern, verkleinere ich das Logo durch Skalieren - hier ist ein Code:
iv = new ImageView(mContext);
iv.setScaleX(0.75f); // <- resized by scaling
iv.setScaleY(0.75f);
// loading the drawable from a getter (replace this with any drawable)
Drawable drawable = ML.loadIcon(mContext, Integer.parseInt(icon));
iv.setImageDrawable(drawable);
// icon get's shown inside a ListView
viewHolder.mIvIcon.addView(iv);
Hier ist das FrameLayout, in dem das Symbol in der ListView-Zeile angezeigt wird:
<FrameLayout
Android:id="@+id/iv_card_icon"
Android:layout_width="48dp"
Android:layout_height="48dp"
Android:src="@drawable/circle"
Android:layout_marginStart="16dp"
/>
Sehen Sie diese Lösung als Option/Idee.
Hier ist eine Kombination der obigen Antworten als Kotlin-Erweiterung
fun Context.scaledDrawableResources(@DrawableRes id: Int, @DimenRes width: Int, @DimenRes height: Int): Drawable {
val w = resources.getDimension(width).toInt()
val h = resources.getDimension(height).toInt()
return scaledDrawable(id, w, h)
}
fun Context.scaledDrawable(@DrawableRes id: Int, width: Int, height: Int): Drawable {
val bmp = BitmapFactory.decodeResource(resources, id)
val bmpScaled = Bitmap.createScaledBitmap(bmp, width, height, false)
return BitmapDrawable(resources, bmpScaled)
}
Verwendung:
val scaled = context.scaledDrawableResources(R.drawable.ic_whatever, R.dimen.width, R.dimen.height)
imageView.setImageDrawable(scaled)
oder
val scaled = context.scaledDrawable(R.drawable.ic_whatever, 100, 50)
imageView.setImageDrawable(scaled)