如何获取Codenameone FontImages和描述的列表,以在自定义图像选择器对话框中呈现?

问题描述 投票:1回答:1

我正在使用CN1构建我的应用程序,我想创建一个用户可以搜索的屏幕,并从可用的材料字体图像列表中进行选择。我怎么能得到这份清单,即。我将需要char代码(“\ uE900”)和要搜索的描述。我非常想复制CN1在他们酷炫的新Guibuilder中构建的对话框。

enter image description here

通过使用相同的方法,这有望意味着当CN1团队添加更多内容时,列表将自动增长。

我曾想过将Github中的FontImage类文本解构为可管理的列表,但不认为这是未来的证明。

一旦我有了这个列表,那么我可以使用以下方法将它应用于Button tile网格:

gui_IconButton.setIcon(
            FontImage.createFixed("\uE900", FontImage.getMaterialDesignFont(), 0xffffff, 20, 20).toImage());

虽然也许有一种更简洁的实施方式,它可以提供与上图相同的LAF。

提前谢谢了。

image codenameone
1个回答
1
投票

为该对话框做了什么是这样的:

private static List<MaterialFont> getMaterialFonts(){
    ArrayList<MaterialFont> list = new ArrayList<>();
    list.add(new MaterialFont(FontImage.MATERIAL_3D_ROTATION, "3d rotation"));
    list.add(new MaterialFont(FontImage.MATERIAL_AC_UNIT, "ac unit"));
    list.add(new MaterialFont(FontImage.MATERIAL_ACCESS_ALARM, "access alarm"));
    list.add(new MaterialFont(FontImage.MATERIAL_ACCESS_ALARMS, "access alarms"));
    list.add(new MaterialFont(FontImage.MATERIAL_ACCESS_TIME, "access time"));
    ...
}

static class MaterialFont implements Comparable<MaterialFont>{
    private char icon;
    private String description;

    public MaterialFont(char icon, String description) {
        this.icon = icon;
        this.description = description;
    }

    @Override
    public int compareTo(MaterialFont o) {
        return description.compareTo(((MaterialFont)o).description);
    }        
}

这是有问题的。由于我们没有反射,因此我们添加新图标时难以维护。我不认为该列表包含我们最近添加的新图标。

我认为更好的方法是一个单独的类,它只包含类的元数据,这将允许优化器在不使用元数据类时删除未使用的图标。此类不需要是Codename One的一部分,可以使用脚本“自动生成”。

如果你是像我这样的Unix人,那么这个语句将生成list.add()条目:

javap -classpath ~/dev/cn1/CodenameOne/dist/CodenameOne.jar com.codename1.ui.FontImage | grep MATERIAL_ | sed 's/  public static final char //' | sed 's/MATERIAL_*//g' | sed 's/;//' | sed 's/.*/    list.add(new MaterialFont(FontImage.MATERIAL_&, "&");/' 

然后你可以只做一个MetaData页眉和页脚,并将sed命令的输出与cat命令结合起来。

© www.soinside.com 2019 - 2024. All rights reserved.