1

好吧,所有这一切都折磨了我好几个星期,我设置了一个 227 像素高的图像,将其缩放到 170 像素,即使我希望它是 wrap_content 每当我这样做的时候。

行。在这里,我拍摄了 1950 像素长的 My Image(我将其中的一部分放在这里,以便您了解它的外观)。

在此处输入图像描述

首先,我想将其缩放回 227 像素高,因为这就是它的设计方式和应该如何

Bitmap bitmapOrg = BitmapFactory.decodeResource(getResources(),R.drawable.ver_bottom_panel_tiled_long);
            int width = bitmapOrg.getWidth();
        int height = bitmapOrg.getHeight();
        int newWidth = 200; //this should be parent's whdth later
        int newHeight = 227;

        // calculate the scale
        float scaleWidth = ((float) newWidth) / width;
        float scaleHeight = ((float) newHeight) / height;

        // create a matrix for the manipulation
        Matrix matrix = new Matrix();
        // resize the bit map
        matrix.postScale(scaleWidth, scaleHeight);

        // recreate the new Bitmap
        Bitmap resizedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0, 
                          width, height, matrix, true); 


        BitmapDrawable dmpDrwbl=new BitmapDrawable(resizedBitmap);

    verbottompanelprayer.setBackgroundDrawable(dmpDrwbl);

所以...它根本不是裁剪图像 - 不,它是 1950 像素压入 200 像素。 在此处输入图像描述

但我只想剪除这 200 像素或我将设置的任何宽度之外的任何东西 - 裁剪它,而不是将所有这些长图像压入 200 像素区域。

还有,BitmapDrawable(Bitmap bitmap); 和 imageView.setBackgroundDrawable(drawable); 已弃用 - 我该如何更改?

4

1 回答 1

5

根据我所看到的,您创建了一个新尺寸 (200x227) 的位图,所以我不确定您的预期。你甚至写在你缩放的评论中,没有关于裁剪的消息......

你可以做的是:

  1. 如果 API 至少为 10 (gingerbread) ,您可以使用BitmapRegionDecoder,使用decodeRegion

  2. 如果 API 太旧,您需要解码大位图,然后使用Bitmap.createBitmap将其裁剪为新位图

像这样的东西:

final Rect rect =...
if (VERSION.SDK_INT >= VERSION_CODES.GINGERBREAD_MR1)
  {
  BitmapRegionDecoder decoder=BitmapRegionDecoder.newInstance(imageFilePath, true);
  croppedBitmap= decoder.decodeRegion(rect, null);
  decoder.recycle();
  }
else 
  {
  Bitmap bitmapOriginal=BitmapFactory.decodeFile(imageFilePath, null);
  croppedBitmap=Bitmap.createBitmap(bitmapOriginal,rect.left,rect.top,rect.width(),rect.height());
  }
于 2013-08-19T12:22:58.607 回答