代号1-根据可用空间自动尺寸图像



我在登录屏幕的顶部有一个徽标:

ScaleImageLabel logo =  new ScaleImageLabel(theme.getImage("myLogo.svg"))
logo.setName("MyLogo");
logo.setUIID("MyLogo");
backgroundContainer.add(BorderLayout.NORTH, FlowLayout.encloseCenterMiddle(logo));

我的主要问题是尺寸,因为在某些设备上太大,在其他设备上太小。

例如,假设我希望徽标在水平屏幕空间的80%和最大垂直空间的最大20%(根据其最大值的最大值)上自动调整大小。如果徽标位于边界布局的北部,我该如何实现?

您正在使用流布局来包装组件。流程布局使组件具有首选尺寸,因此您的缩放组件不再重要,如果首选尺寸太小。

我建议使用基于DPI在所有设备中看起来不错的多图像,并避免对徽标等元素进行缩放。多图像是为此目的而设计的。另外,您可以使用以下代码将图像大小尺寸。

Image img = logo.scaledHeight(Display.getInstance().convert(sizeInMM));  

shai的答案通常是正确的,但是在这种情况下,我需要对图像大小进行更精确和控制,该图像大小应该根据屏幕可用大小自动更改(换句话说,徽标,大小应在设备方向以及使用虚拟键盘时更改)。请注意,我正在使用矢量图像来避免调整大小的图像质量损失问题(我测试了该SVG文件在Android 4上正确渲染,所以我想在任何现代设备上都正确呈现了)。

)。

我共享我的解决方案:

public class MyMainClass {
    [...]
    private static Label logo;
    public void init(Object context) {
        [...]
    }
    public void start() {
        [...]
        // Insert vectorial logo in the north
        // Constraints:
        // logoMaxWidth is the maximum horizontal screen space in percentage
        // logoMaxHeight is the maximum vertical screen space in percentage
        double logoMaxWidth = 0.75;
        double logoMaxHeight = 0.15;
        logo = new Label((theme.getImage("Logo.svg")).scaledSmallerRatio(Double.valueOf(Display.getInstance().getDisplayWidth() * logoMaxWidth).intValue(), Double.valueOf(Display.getInstance().getDisplayHeight() * logoMaxHeight).intValue()));
        backgroundContainer.add(BorderLayout.NORTH, FlowLayout.encloseCenterMiddle(logo));
        [...]
        // Recalculate the size of the logo when device size changes
        Form logoForm = logo.getComponentForm();
        if (logoForm != null) {
            logoForm.addSizeChangedListener(l -> {
                logo.remove();
                logo = new Label((theme.getImage("Logo.svg")).scaledSmallerRatio(Double.valueOf(Display.getInstance().getDisplayWidth() * logoMaxWidth).intValue(), Double.valueOf(Display.getInstance().getDisplayHeight() * logoMaxHeight).intValue()));
                backgroundContainer.add(BorderLayout.NORTH, FlowLayout.encloseCenterMiddle(logo));
                logoForm.revalidate();
            });
        }

最新更新