您的位置:首页 > 其它

Wrong size from Drawable.getIntrinsicWidth()

2013-02-05 23:42 579 查看

I download image with this code:

ImageGetter imageGetter =newImageGetter(){@OverridepublicDrawable getDrawable(String source){Drawable drawable =null;try{
URL url =new URL(source);String path =Environment.getExternalStorageDirectory().getPath()+"/Android/data/com.my.pkg/"+url.getFile();File f=newFile(path);if(!f.exists()){URLConnection connection = url.openConnection();InputStreamis= connection.getInputStream();

f=newFile(f.getParent());
f.mkdirs();FileOutputStream os =newFileOutputStream(path);byte[] buffer =newbyte[4096];int length;while((length =is.read(buffer))>0){
os.write(buffer,0, length);}
os.close();is.close();}
drawable =Drawable.createFromPath(path);}catch(MalformedURLException e){
e.printStackTrace();}catch(Throwable t){
t.printStackTrace();}if(drawable !=null){
drawable.setBounds(0,0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());}return drawable;}};

This image has size 20x20. But drawable.getIntrinsicWidth() and drawable.getIntrinsicHeight() return 27. And image looks larger. How I can fix it?



android
image
share|edit
asked Oct 22 '12 at 14:49



BArtWell
10718

feedback

1 Answer



BitmapDrawable must scale bitmap to compensate for different screen densities.

If you need it to draw pixel-for-pixel, try setting Drawable's source density & target density to same value. To do this, you need slightly different objects to work with.

Instead of

drawable =Drawable.createFromPath(path);

use

Bitmap bmp =BitmapFactory.decodeFile(path);DisplayMetrics dm = context.getResources().getDisplayMetrics();
bmp.setDensity(dm.densityDpi);
drawable =newBitmapDrawable(bmp, context.getResources());

If you don't have context (which you should), you can use application context, see e.g. Using Application context everywhere?

Since bitmap's density is set to resources' density, which is actual device's screen's density, it should draw without scaling.

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: