web-dev-qa-db-fra.com

Redimensionner Drawable dans Android

Je définis un dessinable pour une boîte de dialogue de progression (pbarDialog) mais mon problème est que je veux redimensionner le dessinable à chaque fois mais je ne sais pas comment.

Voici du 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

Ce qui suit a fonctionné pour moi:

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

Voici où je me suis retrouvé, en partie grâce à la réponse de Saad:

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
William T. Mallard

Pour le redimensionnement, c'est Nice et court (le code ci-dessus ne fonctionnait pas pour moi), trouvé ici :

  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

Peut-être que ma solution ne couvre pas complètement la question, mais j'avais besoin de quelque chose comme un "CustomDrawable".

En d'autres termes, je veux mettre un logo devant une forme de cercle. J'ai donc créé un FrameLayout avec un fond (juste un cercle coloré) et devant cette forme ronde je montre le logo.

Pour redimensionner le logo, je réduis le logo en le redimensionnant - voici du 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);

Voici le FrameLayout qui montre l'icône dans la ligne de ListView:

<FrameLayout
    Android:id="@+id/iv_card_icon"
    Android:layout_width="48dp"
    Android:layout_height="48dp"
    Android:src="@drawable/circle"
    Android:layout_marginStart="16dp"
    />

Voir cette solution comme une option/idée.

1
Martin Pfeffer

Voici une combinaison des réponses ci-dessus en tant qu'extension Kotlin

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)
}

Usage:

val scaled = context.scaledDrawableResources(R.drawable.ic_whatever, R.dimen.width, R.dimen.height)
imageView.setImageDrawable(scaled)

ou

val scaled = context.scaledDrawable(R.drawable.ic_whatever, 100, 50)
imageView.setImageDrawable(scaled)
1
Chad Bingham