调整图像大小和setCompoundDrawablesWithIntrinsicBounds

时间:2013-01-21 00:19:45

标签: android resize image-resizing

我的应用包含带有图像的按钮,使用 setCompoundDrawablesWithIntrinsicBounds 进行设置。我使用应用程序的 drawables 文件夹中的图像,但也使用从网上下载并存储在SD卡上的图像。我发现我需要升级SD卡图像,这样它们的渲染大小与 drawables 中的图像相同。我是这样做的:

    Options opts = new BitmapFactory.Options();

    opts.inDensity = 160;
    Bitmap bm = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory() +
      context.getResources().getString(R.string.savefolder) + iconfile, opts);

    myIcon = new BitmapDrawable(context.getResources(), bm);
    btn.setCompoundDrawablesWithIntrinsicBounds(myIcon, null, null, null );

这一切都没有问题,直到我将手机更新到Android 4.1.1并注意到下载的图像现在出现的尺寸比可绘制文件夹的尺寸小得多。

我使用 inDensity 值搞砸了很少的效果,但是根据 btnheight 值(只是图像按钮的高度)缩放位图更成功坐在上面:

    int intoffset=bm.getHeight() - bm.getWidth();                   
    myIcon = new  BitmapDrawable(context.getResources(), 
      Bitmap.createScaledBitmap(bm, btnheight - (((btnheight/100)*10) +
      intoffset) , btnheight - ((btnheight/100)*10), true));

这种作品,但图像仍然比它所在的按钮大一点(根据上述情况不应该是这种情况,因为它应该将图像高度缩放到按钮高度的90% 。)我做了这个测试。我不能在我的应用程序中使用此方法,因为按钮高度根据按钮上显示的字体大小而变化,用户可以在应用程序首选项中更改此字体大小。

顺便说一句,奇怪的是(?),通过使用

将位图缩放到原始高度的两倍
   Bitmap.createScaledBitmap(bm, bm.getWidth() * 2
       , bm.getHeight() * 2, true));

它在4.0.3和4.1.1中正确渲染(好吧,它显示的尺寸与可绘制的图标相同),但在2.1中表现得如你所期望的那样(渲染得比它所在的按钮大)

如果有人对4.1.1中发生这种情况的原因有任何见解,我可以这样做,我的decodeFile位图呈现与我的可绘制位图相同的大小,而不必单独编写4.1.1代码,它将是非常感谢!

1 个答案:

答案 0 :(得分:7)

修改原始代码如下所示4.1.1以及之前测试的版本...

   Options opts = new BitmapFactory.Options();

   DisplayMetrics dm = new DisplayMetrics();
   context.getWindowManager().getDefaultDisplay().getMetrics(dm);

    int dpiClassification = dm.densityDpi;

    opts.inDensity = dm.DENSITY_MEDIUM;

    opts.inTargetDensity = dpiClassification;
    opts.inScaled =true;

    Bitmap bm = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory() +
     context.getResources().getString(R.string.savefolder) + iconfile, opts);

    myIcon = new BitmapDrawable(context.getResources(), bm);
    btn.setCompoundDrawablesWithIntrinsicBounds(myIcon, null, null, null );