You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android:如何通过Canvas缩放Bitmap适配不同分辨率屏幕消除黑边?

解决Android游戏背景图适配长屏设备的问题

问题原因

你当前直接按原图尺寸绘制背景,没有根据设备屏幕的实际尺寸做适配,导致像三星A34这类长屏设备(1080×2340)的屏幕高度超出背景图的1920px,底部出现黑条。

解决方案

要实现背景图铺满无黑条且保持比例不变,按以下步骤修改代码:

1. 提前加载并缓存背景图

避免每次绘制时重复解码资源造成性能浪费,在初始化阶段(比如onCreate或SurfaceHolder.Callback的surfaceCreated方法)加载背景图:

private Bitmap originalBg;
private Bitmap scaledBg;
private int drawX, drawY;

@Override
public void surfaceCreated(SurfaceHolder holder) {
    // 加载原始背景图
    originalBg = BitmapFactory.decodeResource(getResources(), R.drawable.backgame);
    // 获取屏幕实际可用尺寸
    DisplayMetrics metrics = getResources().getDisplayMetrics();
    int screenWidth = metrics.widthPixels;
    int screenHeight = metrics.heightPixels;

    // 计算等比例缩放系数(优先铺满屏幕,避免黑条)
    float scaleX = (float) screenWidth / originalBg.getWidth();
    float scaleY = (float) screenHeight / originalBg.getHeight();
    float scale = Math.max(scaleX, scaleY); // 取较大的缩放值,保证铺满屏幕

    // 生成缩放后的背景图
    scaledBg = Bitmap.createScaledBitmap(originalBg,
            (int) (originalBg.getWidth() * scale),
            (int) (originalBg.getHeight() * scale),
            true);

    // 计算居中绘制的坐标
    drawX = (screenWidth - scaledBg.getWidth()) / 2;
    drawY = (screenHeight - scaledBg.getHeight()) / 2;
}

2. 绘制缩放后的背景图

在onDraw方法中使用缩放后的Bitmap绘制:

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    Paint paint = new Paint();
    paint.setAntiAlias(true);
    paint.setFilterBitmap(true);
    paint.setDither(true);

    // 绘制适配后的背景
    canvas.drawBitmap(scaledBg, drawX, drawY, paint);
}

3. 其他图形元素的适配建议

  • 不要用固定像素值设置元素位置,改用屏幕尺寸的百分比计算,比如按钮位置设为screenWidth * 0.2、screenHeight * 0.8,适配不同屏幕比例
  • 如果游戏是全屏模式,记得隐藏状态栏和导航栏,确保获取的屏幕尺寸是完整的可用区域
  • 若背景图有可拉伸的区域,可改用NinePatch格式图片,缩放更高效且不会变形

内容的提问来源于stack exchange,提问作者Glezy Production

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 22:16:22