Codename One - 根据可用空间自动调整图像大小

时间:2017-11-27 02:26:07

标签: android ios codenameone

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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