You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android平台Canvas固定1920×1080分辨率适配问题咨询

嘿,刚好做过Java Canvas移动游戏的适配优化,来给你分享一套可行的解决方案!

核心思路:用相对比例彻底替代硬编码

首先得把所有硬编码的偏移值、尺寸全部换成基于基准分辨率的相对比例——这是解决适配问题的根本。比如你原本在1920×1080下建筑X偏移是300,那先算出它的相对比例:300f / 1920f,绘制时再乘以当前屏幕的实际宽度,这样不管屏幕尺寸怎么变,元素位置都会保持相对一致。

给你一段可直接复用的核心代码示例:

// 你的基准设计分辨率(比如你最初用的1920×1080)
private static final float BASE_WIDTH = 1920f;
private static final float BASE_HEIGHT = 1080f;

// 当前屏幕实际尺寸
private float screenWidth;
private float screenHeight;

// 缩放比例与屏幕偏移量(用于居中显示)
private float scale;
private float offsetX;
private float offsetY;

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    // 避免屏幕尺寸为0的异常情况
    if (width == 0 || height == 0) return;
    
    screenWidth = width;
    screenHeight = height;
    
    // 计算宽高方向的缩放比例
    float scaleX = screenWidth / BASE_WIDTH;
    float scaleY = screenHeight / BASE_HEIGHT;
    
    // 取较小的比例,保证所有内容完整显示(避免拉伸变形)
    scale = Math.min(scaleX, scaleY);
    
    // 计算偏移量,让游戏内容在屏幕居中
    offsetX = (screenWidth - BASE_WIDTH * scale) / 2;
    offsetY = (screenHeight - BASE_HEIGHT * scale) / 2;
}

绘制时的正确姿势:

@Override
public void draw(Canvas canvas) {
    super.draw(canvas);
    
    // 先保存Canvas当前状态,避免缩放影响后续绘制
    canvas.save();
    
    // 平移到居中位置,再执行缩放
    canvas.translate(offsetX, offsetY);
    canvas.scale(scale, scale);
    
    // 现在直接用基准分辨率下的坐标绘制就行,不用管实际屏幕
    canvas.drawBitmap(buildingBitmap, 300, 200, paint); // 300、200是你原本硬编码的位置
    drawUIElements(canvas);
    
    // 恢复Canvas状态,避免干扰其他绘制逻辑
    canvas.restore();
}
解决Canvas.scale崩溃的问题

你之前用scale崩溃,大概率是这两个原因:

  1. 没有保存/恢复Canvas状态:多次叠加缩放会导致坐标彻底混乱,甚至触发越界异常,一定要用canvas.save()canvas.restore()包裹缩放逻辑。
  2. 缩放时机错误:比如在surfaceCreated里就计算缩放比例,此时屏幕宽高还未初始化,导致scale为NaN/Infinity,一定要把缩放计算放在surfaceChanged方法里。
避免黑边的可选优化

如果不想让屏幕出现黑边,可以根据游戏类型调整适配策略:

  • 裁剪适配:把scale = Math.max(scaleX, scaleY),取较大的缩放比例让内容填满屏幕,超出部分自动裁剪,适合对布局完整性要求不高的游戏(比如跑酷类)。
  • 动态布局调整:针对宽屏/竖屏设备,动态调整元素间距或补充装饰元素,比如宽屏手机左右两侧多放一些背景装饰,既填满屏幕又不破坏核心布局。
UI元素的适配细节

UI元素(按钮、血条、文字)除了用scale缩放,还要做针对性处理:

  • 底部/顶部固定的按钮:不要用固定Y坐标,改用screenHeight - buttonHeight * scale - 20 * scale,保证按钮始终在屏幕底部上方20个基准单位的位置。
  • 文字大小:用paint.setTextSize(48 * scale),让文字在不同屏幕上的视觉大小保持一致。
总结落地步骤
  1. 确定你的基准设计分辨率(比如1920×1080)。
  2. surfaceChanged中完成屏幕尺寸、缩放比例、偏移量的计算。
  3. 绘制时严格遵循「保存状态→平移+缩放→绘制元素→恢复状态」的流程。
  4. 把所有硬编码的坐标、尺寸、文字大小全部替换为「基准值 × scale」的形式。
  5. 测试不同分辨率的设备,根据游戏类型调整裁剪/居中策略。

这样就能彻底解决布局错位、UI显示异常的问题,同时最大程度避免黑边,也不会再出现Canvas崩溃的情况啦!

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

火山引擎 最新活动