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

Codename One应用竖屏模拟器图像缩小问题及分辨率设置求助

问题:Codename One应用竖屏模拟器中图像缩小,桌面端显示正常

我使用Codename One开发了一款仅通过paint方法绘制对象的应用,遇到的问题是:该应用在桌面端运行时图像显示正常,但在竖屏模拟器中运行时图像会缩小。

桌面端显示效果:
Desktop App

竖屏模拟器显示效果:
Simulator

相关代码

Main类:

public class Main extends Lifecycle {

    public static GameCanvas gameCanvas;

    @Override
    public void runApp() {
        gameCanvas = new GameCanvas();
        gameCanvas.start();
        gameCanvas.show();
    }
}

GameCanvas类:

public final class GameCanvas extends Form{
@Override
    public void paint(Graphics var1) {
        try {
           var1.drawImage(imgLogo, this.getWidth() >> 1,this.getHeight() >> 1);
        } catch (Exception var3) {
        }
    }
}

解决方案

这个问题的核心是未考虑Codename One的屏幕缩放系数,以及绘制逻辑未适配图像尺寸与屏幕缩放。

1. 关键原因

Codename One会根据设备/模拟器的屏幕DPI自动应用缩放系数,桌面端和竖屏模拟器的缩放系数不同,直接使用屏幕宽高计算位置且未对图像尺寸做缩放处理,就会导致图像显示比例异常。

2. 修正后的代码

修改GameCanvas类的paint方法,适配缩放系数并确保居中绘制:

@Override
public void paint(Graphics g) {
    super.paint(g); // 必须调用父类方法,保证Form基础渲染正常
    try {
        if (imgLogo != null) {
            Display display = Display.getInstance();
            float scale = display.getDisplayScale();
            
            // 计算图像居中的坐标(考虑缩放后的图像尺寸)
            int imgWidth = (int) (imgLogo.getWidth() * scale);
            int imgHeight = (int) (imgLogo.getHeight() * scale);
            int x = (getWidth() - imgWidth) / 2;
            int y = (getHeight() - imgHeight) / 2;
            
            // 按缩放后的尺寸绘制图像
            g.drawImage(imgLogo, x, y, imgWidth, imgHeight);
        }
    } catch (Exception e) {
        e.printStackTrace(); // 保留异常打印,便于调试
    }
}

3. 额外优化建议

  • 资源适配:为不同DPI设备准备多尺寸图像资源,放置在src/main/resources下的hd/、xdpi/等目录,Codename One会自动匹配最优资源。
  • 避免吞异常:原代码的空catch块会掩盖绘制中的错误,建议保留异常输出方便排查问题。

内容的提问来源于stack exchange,提问作者Duy Khong Phai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 13:10:01