如何根据android中的设备大小在画布上缩放背景图像

时间:2013-07-15 15:11:29

标签: android android-canvas

我曾经习惯将图像作为画布上的背景

canvas.drawBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.help_4, 0, 0, null);

我得到一张大图。所以任何人都可以。为我提供了根据设备大小设置图像的解决方案。由于我是编码的新手,我们将不胜感激:)

谢谢

3 个答案:

答案 0 :(得分:0)

你快到了。您只需要通过设置输出宽度和高度(基于屏幕大小)来配置BitmapFactory.Options变量:

BitmapFactory.Options options = new BitmapFactory.Options();
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
options.outHeight = size.x;
options.outWidth = size.y;
canvas.drawBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.help_4, options));

答案 1 :(得分:0)

确定设备的宽度和高度并进行缩放:

int deviceWidth = getWindowManager().getDefaultDisplay()
.getWidth();
int deviceHeight = getWindowManager().getDefaultDisplay()
.getHeight();

完整后,您可以使用以下here中的以下即用型片段:

public Bitmap scaleToActualAspectRatio(Bitmap bitmap) {
if (bitmap != null) {
boolean flag = true;

int deviceWidth = getWindowManager().getDefaultDisplay()
.getWidth();
int deviceHeight = getWindowManager().getDefaultDisplay()
.getHeight();

int bitmapHeight = bitmap.getHeight();
int bitmapWidth = bitmap.getWidth();

if (bitmapWidth > deviceWidth) {
flag = false;

// scale According to WIDTH
int scaledWidth = deviceWidth;
int scaledHeight = (scaledWidth * bitmapHeight) / bitmapWidth;

try {
if (scaledHeight > deviceHeight)
  scaledHeight = deviceHeight;
  bitmap = Bitmap.createScaledBitmap(bitmap, scaledWidth,
  scaledHeight, true);
 } catch (Exception e) {
  e.printStackTrace();
 }
}

if (flag) {
  if (bitmapHeight > deviceHeight) {
    // scale According to HEIGHT
    int scaledHeight = deviceHeight;
    int scaledWidth = (scaledHeight * bitmapWidth) / bitmapHeight;

    try {
      if (scaledWidth > deviceWidth)
       scaledWidth = deviceWidth;
      bitmap = Bitmap.createScaledBitmap(bitmap, scaledWidth,
      scaledHeight, true);
     } catch (Exception e) {
      e.printStackTrace();
     }
    }
   }
  }
 return bitmap;
}

最后使用:

 myCanvas.drawBitmap(scaleToActualAspectRatio(myBitmap), X, Y, null)

答案 2 :(得分:0)

这个过程看起来像这样:

  1. 获取屏幕尺寸
  2. 计算新图像尺寸(保持纵横比)
  3. 将位图解码为新大小。
  4. 获取屏幕尺寸

    要获得设备的确切屏幕尺寸,请使用DisplayMetrics ...

    DisplayMetrics metrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(metrics);
    

    metrics变量现在将包含屏幕尺寸(以像素为单位)。您可以使用metrics.widthPixelsmetrics.heightPixels来获取值。

    计算新图像尺寸(保持纵横比)

    要计算新的图片尺寸,我们可以使用BitmapFactory.Options并告诉它将图片缩小x倍。要计算该因子(也称为inSampleSize),请使用以下方法...

    public static int calculateInSampleSize(
                BitmapFactory.Options options, int reqWidth, int reqHeight) {
        // Raw height and width of image
        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 1;
    
        if (height > reqHeight || width > reqWidth) {
    
            // Calculate ratios of height and width to requested height and width
            final int heightRatio = Math.round((float) height / (float) reqHeight);
            final int widthRatio = Math.round((float) width / (float) reqWidth);
    
            // Choose the smallest ratio as inSampleSize value, this will guarantee
            // a final image with both dimensions larger than or equal to the
            // requested height and width.
            inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
        }
    
        return inSampleSize;
    }
    

    将位图解码为新尺寸

    // First decode with inJustDecodeBounds=true to check dimensions
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeResource(getResources(), R.drawable.help_4, options);
    
    // Calculate inSampleSize
    options.inSampleSize = calculateInSampleSize(options, metrics.widthPixels, metrics.heightPixels);
    
    // Decode bitmap with inSampleSize set
    options.inJustDecodeBounds = false;
    return BitmapFactory.decodeResource(getResources(), R.drawable.help_4, options);
    

    inJustDecodeBounds选项告诉框架使Bitmap无效以防止OOM异常,因为我们只对维度感兴趣,而不是对实际图像感兴趣。

    此方法将确保位图高效缩放。在此处阅读更多内容:http://developer.android.com/training/displaying-bitmaps/load-bitmap.html