Codenameone 代号一:如何获得组件的宽度(毫米)?

Codenameone 代号一:如何获得组件的宽度(毫米)?,codenameone,Codenameone,我创建了一个应用程序来计算多幅图像的大小,以便在代号为One designer的应用程序中使用它们 正如你在下面的屏幕截图中看到的,我的应用程序有一个滑块,我可以得到它的宽度(以毫米为单位)。问题在于所选宽度的值不正确。我在两台Android设备上测试了该应用程序,测得的长度与该应用程序报告的长度不同 您可以看到,但是相关代码如下所示: Label value = new Label("Move the cursor on the slider..."); Style thumbStyle =

我创建了一个应用程序来计算多幅图像的大小,以便在代号为One designer的应用程序中使用它们

正如你在下面的屏幕截图中看到的,我的应用程序有一个滑块,我可以得到它的宽度(以毫米为单位)。问题在于所选宽度的值不正确。我在两台Android设备上测试了该应用程序,测得的长度与该应用程序报告的长度不同

您可以看到,但是相关代码如下所示:

Label value = new Label("Move the cursor on the slider...");

Style thumbStyle = new Style();
thumbStyle.setFont(Font.createSystemFont(Font.FACE_MONOSPACE, Font.STYLE_BOLD, Font.SIZE_LARGE), true);

Slider slider = new Slider();
slider.setMaxValue(1000);
slider.setMinValue(0);
slider.setProgress(20); // Set  the starting value
slider.setThumbImage(FontImage.create("|", thumbStyle));
slider.setEditable(true); // to it works as a slider instead of a progress bar
slider.addActionListener(e -> {
    Integer valueSelected = slider.getProgress();
    Integer sliderWidth = slider.getWidth();
    Double inch = sliderWidth.doubleValue() / (slider.getMaxValue() - slider.getMinValue()) * valueSelected / 100.0;
    Integer millimeters = Double.valueOf(inch * 25.4).intValue();
    value.setText("Value selected: " + millimeters.toString() + " mm");
});
非常感谢你的帮助


毫米测量不准确。设备可以为convert方法返回不同的值或比率,而不是为density flag返回的值


不幸的是,谷歌用来证明设备“良好”的测试套件实际上并没有涵盖这些内容。我们对此无能为力。

因此“Integer sliderWidth=slider.getWidth();”(如上面的代码所示)是不准确的(我认为没有很好的文档记录,因为API没有报告返回值中使用了哪种错误单位)。我不知道“Display.getInstance().getDeviceDensity()”是否更准确:生成所需大小的多重图像的最佳方法是什么?
getWidth
与像素一起使用时,准确率为100%。密度有点像掷硬币。我们使用getDeviceDensity来选择正确的图像大小。我们在designer工具代码中有一些硬编码的最佳实践,可以导入多个图像。您可以通过github代码查看designer工具的密度和DPI是一样的吗?我上面的代码是错误的,因为我假设getWidth()返回的是英寸的倍数而不是像素:/*双英寸=sliderWidth.doubleValue()/(slider.getMaxValue()-slider.getMinValue())*valueSelected/100.0;*/我试图修复它,所以:我试图实现MultiImageCalculator.getDeviceDPI(),所以:这种方法正确吗?我们总是使用像素,并且这些像素在所有情况下都是100%准确的。这可能对你有用,要把这些数字弄对需要反复试验