Android Codename One-根据可用空间自动调整图像大小
我在登录屏幕的顶部有一个徽标:Android Codename One-根据可用空间自动调整图像大小,android,ios,codenameone,Android,Ios,Codenameone,我在登录屏幕的顶部有一个徽标: ScaleImageLabel logo = new ScaleImageLabel(theme.getImage("myLogo.svg")) logo.setName("MyLogo"); logo.setUIID("MyLogo"); backgroundContainer.add(BorderLayout.NORTH, FlowLayout.encloseCenterMiddle(logo)); 我的主要问题是大小,因为在某些设备上太大,而在其他设备上
ScaleImageLabel logo = new ScaleImageLabel(theme.getImage("myLogo.svg"))
logo.setName("MyLogo");
logo.setUIID("MyLogo");
backgroundContainer.add(BorderLayout.NORTH, FlowLayout.encloseCenterMiddle(logo));
我的主要问题是大小,因为在某些设备上太大,而在其他设备上太小
例如,假设我希望徽标自动调整大小,最大值为水平屏幕空间的80%,最大值为垂直空间的20%(根据它们的最大值)。如果徽标位于边界布局的北部,如何实现这一点 您正在使用流布局来包装组件。“流布局”为组件提供了其首选大小,因此如果首选大小过小,则缩放组件不再重要 我建议在所有基于DPI的设备中使用一个看起来不错的多图像,并避免像徽标这样的元素的缩放。Multi-image正是为此目的而设计的。或者,您可以使用以下代码以毫米为单位调整图像大小:
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();
});
}
在XMLAndroid中:权重的作用类似于宽度、高度和百分比。