【问题标题】:Draw a scaled Bitmap to the Canvas?在画布上绘制一个缩放的位图?
【发布时间】:2022-02-21 19:54:42
【问题描述】:

以下代码定义了我的位图:

Resources res = context.getResources();

mBackground = BitmapFactory.decodeResource(res, R.drawable.background);

// scale bitmap
int h = 800; // height in pixels
int w = 480; // width in pixels
// Make sure w and h are in the correct order
Bitmap scaled = Bitmap.createScaledBitmap(mBackground, w, h, true);

...下面的代码用于执行/绘制它(未缩放的位图):

canvas.drawBitmap(mBackground, 0, 0, null);

我的问题是,我如何设置它以绘制以Bitmap scaled 形式返回的缩放位图,而不是原始?

【问题讨论】:

    标签: java android


    【解决方案1】:

    定义一个新的类成员变量: Bitmap mScaledBackground; 然后,将新创建的缩放位图分配给它: mScaledBackground = scaled; 然后,调用你的 draw 方法: canvas.drawBitmap(mScaledBackground, 0, 0, null);

    请注意,以您在上面的 sn-p 中所做的方式对屏幕大小进行硬编码并不是一个好主意。最好通过以下方式获取您的设备屏幕尺寸:

    int width = getWindowManager().getDefaultDisplay().getWidth();
    int height = getWindowManager().getDefaultDisplay().getHeight();
    

    最好不要仅仅为了以缩放方式绘制原始背景而声明新位图。位图会消耗大量宝贵的资源,而且通常一部手机仅限于几 MB 的位图,您可以在应用程序出现异常失败之前加载这些位图。相反,您可以这样做:

    Rect src = new Rect(0, 0, bitmap.getWidth() - 1, bitmap.getHeight() - 1);
    Rect dest = new Rect(0, 0, width - 1, height - 1);
    canvas.drawBitmap(mBackground, src, dest, null);
    

    【讨论】:

    • 您的答案对我有用,但是从参数中的宽度和高度中减去 1 会在显示的位图的右侧和底部显示一条线(来自背景的另一个位图),删除 -1 效果很好。
    • 我知道这是一篇较旧的帖子。但对于 Android 7.0+,您可能无法在分屏模式下依赖完整的显示宽度/高度。因此,对于使用此解决方案的任何人,您都应该牢记这一点。
    • 这样画位图会不会很慢?
    【解决方案2】:

    要绘制缩放位图,您要将缩放位图保存在某个字段中(此处称为mScaled)并调用:

    canvas.drawBitmap(mScaled, 0, 0, null);
    

    在您的 draw 方法中(或您现在调用的任何地方)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多