Home » Android » Android scaledrawable doesn't seems to work

Android scaledrawable doesn't seems to work

Posted by: admin April 23, 2020 Leave a comment

Questions:

I’m trying out the android ScaleDrawable

But it doesn’t seem to work… I created the xml as in the documentation example and I have a logo.png in the drawable folder

<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/logo"
    android:scaleGravity="center_vertical|center_horizontal"
    android:scaleHeight="80%"
    android:scaleWidth="80%" />

I saved this as logo2.xml in the drawable folder then I have a LinearLayout with an ImageView and set the src of the ImageView to “@drawable/logo2” but the logo doesn’t appear…Am I doing something wrong here? How do you actually use the scale element?

How to&Answers:

Just today I faced the same problem. The ScaleDrawable does not seem to work. After some investigation I’ve found the solution:

If you look at the documentation you can find this phrase: “A Drawable that changes the size of another Drawable based on its current level value.” That’s it.

It became clear after I found the onBoundsChange() function uses the strange level variable.

For you the code would be something like this:

Resources res = getResources();
ScaleDrawable sd = (ScaleDrawable) res.getDrawable(R.drawable.logo2);
Drawable d = sd.getDrawable();

d.setLevel(1);

ImageView iv = new ImageView(this);
iv.setImageDrawable(sd);
iv.setAdjustViewBounds(true); 
iv.setLayoutParams(new Gallery.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

setContentView(iv);

Update: I think the problem in the draw() function. Because after an initialization the level variable is 0:

public void draw(Canvas canvas) {
    if (mScaleState.mDrawable.getLevel() != 0)
        mScaleState.mDrawable.draw(canvas);
}

Update: Maybe then this code may help you:

private void useScaledImage() {
    Resources res = getResources();
    BitmapDrawable bd = (BitmapDrawable)res.getDrawable(R.drawable.sun);
    Bitmap b = Bitmap.createScaledBitmap(bd.getBitmap(),
                         (int) (bd.getIntrinsicHeight() * 0.7),
                         (int) (bd.getIntrinsicWidth() * 0.7),
                         false);

    LinearLayout l = new LinearLayout(this);
    ImageView iv = new ImageView(this);

    iv.setImageDrawable(new BitmapDrawable(b));
    iv.setLayoutParams(new Gallery.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

    l.addView(iv);

    setContentView(l);
}

Answer:

Use insert drawable instead of scale drawable

<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android" 
    android:drawable="@drawable/logo"
    android:insetTop="2dp"
    android:insetLeft="2dp"  
    android:insetRight="2dp"
    android:insetBottom="2dp"
    >

Answer:

To answer to the initial question, you just have to initialize your ScaleDrawable’s Level with 10 000 in your onCreate.
You get your ImageView, ImageButton’s drawable using getIcon or getBackground (depends if you set it as a source or a background) and then call setLevel on it.
For a MenuItem, the code looks like :

    editMenuItem = menu.findItem(R.id.action_edit);
    menuItemEdit_ScaleDrawable = (ScaleDrawable) editMenuItem.getIcon();
    //when playing with scaleDrawable always initialize the level
    menuItemEdit_ScaleDrawable.setLevel(10000);

I use ScaleDrawable when running animation that changes the size of the drawable. For your usecase, I definitely prefer managing the size of the component not the drawable displayed by the component.

Answer:

ScaleDrawable not only allows you to scale a drawable, it also allows you to control the scale using setLevel on the ScaleDrawable itself.
But the ScaleDrawable doesn’t change the intrinsic width and height of the drawable
As @m039 pointed out, the ScaleDrawable source actually does a strange thing: when the original drawable’s level is set to 0, the scaleDrawable itself won’t draw.

To take effect of the scale, you have to do something like this:

ScaleDrawable scaleDrawable = (ScaleDrawable) imageView.getDrawable();
scaleDrawable.setLevel(10000);
or 
scaleDrawable.setLevel(5000);

Answer:

You need to add level in your xml.

android:level="1"