Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why are the Width / Height of the drawable in ImageView wrong?

Should be a simple one.

When I pull image.getDrawable().getIntrinsicWidth() I get a value larger than the source image width. It's X coordinate is returning 2880 instead of 1920 which is 1.5 times too big?

I wondered wether the ImageView having a scaleType of "center" effected it but, according to the documentation:

"Center the image in the view, but perform no scaling."

Here is the source:

<ImageView  
    android:id="@+id/backgroundImage"   
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"
    android:src="@drawable/background"
    android:scaleType="center"/>
like image 955
Graeme Avatar asked Jun 30 '11 14:06

Graeme


2 Answers

You said the drawable is from your /res folder. Which folder is it in?

  • /res/drawable

  • /res/drawable-mdpi

  • /res/drawable-hdpi

    etc..

And what is the density of the device you are testing on? Is it a Nexus S with general density of 240dpi? Because if your source drawable is located in the drawable-mdpi folder and you are testing on a 240dpi device, then the Android system will automatically scale the drawable up by a factor of 1.5 so that the physical size will be consistent with the baseline device density at 160dpi.

When you call getIntrinsicWidth() what is returned is the size the drawable wants to be after Android scales the drawable. You'll notice that 2880 = 1920 * 1.5

If you placed the drawable in /res/drawable the Android system treats those drawables as meant for mdpi devices, thus the upscaling in your Nexus S. If this was meant for hdpi screens and you do not want this to upscale then try placing it in drawable-hdpi

like image 78
Tony Chan Avatar answered Nov 05 '22 19:11

Tony Chan


Have you tried to multiply height and width by density:

getResources().getDisplayMetrics().density

Is your drawable in ressources or download from the web? If it is downloaded, you have to give it the density:

DisplayMetrics metrics = new DisplayMetrics();
getContext().getWindowManager().getDefaultDisplay().getMetrics(metrics);
Resources r = new Resources(getContext().getAssets(), metrics, null);
BitmapDrawable bmd = new BitmapDrawable(r, bitmap);
like image 31
Climbatize Avatar answered Nov 05 '22 18:11

Climbatize