2017-08-04 69 views
1

我创建了一个应用程序来计算多图像的大小,以便在Codename One设计器中使用它们。如你在下面的屏幕截图中看到的,我的应用程序有一个滑块,我得到它的宽度(以毫米为单位)。问题是所选宽度的值不正确。我在两款Android设备上测试了该应用,测量的长度与该应用报告的长度不同。Codename One:如何以毫米为单位获取组件的宽度?

你可以看到full source code,但是相关的代码如下:

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"); 
}); 

非常感谢您的任何帮助

Codename One MultiImage Calculator

回答

1

毫米的措施是不准确的。设备可以为转换方法返回不同的值或比率,而不是返回密度标志的值。

不幸的是,谷歌测试套件将设备认证为“良好”并不包括这些内容。对此我们无能为力。

+0

所以“Integer sliderWidth = slider.getWidth();” (如上面的代码中所示)是不准确的(在我看来,没有很好的文档记录,因为API没有报告返回值中使用了哪种单位的错误)。如果“Display.getInstance()。getDeviceDensity()”更精确,我没有得到:生成想要大小的多图像的最佳方法是什么? –

+0

'getWidth' 100%准确,因为它适用于像素。密度是有点掷硬币。我们使用getDeviceDensity来选择正确的图像大小。我们在设计工具代码中有一些硬编码的最佳实践,可以导入多个图像,您可以通过设计工具的github代码查看 –

+0

Density和DPI是一样的东西吗? 我上面的代码是错误的,因为我认为getWidth()返回英寸倍数而不是像素数: /* Double inch = sliderWidth.doubleValue()/(slider.getMaxValue() - slider.getMinValue()) * valueSelected/100.0; */ 我试图来解决它,以便: [sliderActionListener.java](https://gist.github.com/jsfan3/6ee8358a71a4e79fd7360814f0a78c8c) 我试图执行MultiImageCalculator.getDeviceDPI(),所以: [getDeviceDPI。 java](https://gist.github.com/jsfan3/80c915f752a92d4f2f860b717197d6fc) 这是否正确? –

相关问题