2012-10-22 75 views
3

我下載的圖像與此代碼:大小從Drawable.getIntrinsicWidth錯誤的()

ImageGetter imageGetter = new ImageGetter() { 
    @Override 
    public Drawable 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=new File(path); 
      if(!f.exists()) { 
       URLConnection connection = url.openConnection(); 
       InputStream is = connection.getInputStream(); 

       f=new File(f.getParent()); 
       f.mkdirs();     

       FileOutputStream os = new FileOutputStream(path); 
       byte[] buffer = new byte[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; 
    } 
}; 

此圖片的大小爲20×20。但drawable.getIntrinsicWidth()和drawable.getIntrinsicHeight()的返回27和圖像看起來更大。我如何解決它?

回答

5

BitmapDrawable必須擴展位,以補償不同的屏幕密度。

如果你需要它來繪製的像素對像素,嘗試繪製對象的源密度&目標密度設置爲相同的值。要做到這一點,你需要稍微不同的對象來處理。

而不是

drawable = Drawable.createFromPath(path); 

使用

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

如果沒有上下文(你應該),你可以使用應用程序上下文,例如見Using Application context everywhere?

由於位圖的密度設置爲資源的密度,這是實際的設備屏幕的密度,這應該引起不結垢。

6

我試過代碼形式的答案,沒有工作。所以,而是我使用下面的代碼,它工作正常。

 DisplayMetrics dm = context.getResources().getDisplayMetrics(); 

    Options options=new Options(); 
    options.inDensity=dm.densityDpi; 
    options.inScreenDensity=dm.densityDpi; 
    options.inTargetDensity=dm.densityDpi;  

    Bitmap bmp = BitmapFactory.decodeFile(path,options); 
    drawable = new BitmapDrawable(bmp, context.getResources()); 
+0

這兩種解決方案都適用於我,但是,您更接近於新的API更改。再次感謝。 – ForceMagic