wake-up-neo.com

Skalierbar in Android

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();
34
mDude26

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);
}
82
Saad Farooq

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;

}
20

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);
9
craned

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.

1
Martin Pfeffer

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)
1
Chad Bingham