风蚀之月

Slate中图标的使用

18 Aug 2015 UE4 Slate Icon

在Slate控件中,图标的使用除了直接引用图片外,还是有一些其他便利的方法的。

当前UE4版本4.8.3。

目前官方的版本已经到4.9.0了,但是由于FMod并没有更新对应版本的插件,项目无法迁移,故而依然使用4.8.3版本。

自带图标

UE4自带的图标在对SWidget进行封装时比较容易遇到。UWidget在编辑器中的显示图标使用的就是自带的图标系统。通常为对如下的函数进行覆盖实现:

const FSlateBrush* UCListViewWidget::GetEditorIcon() 
{     
  return FUMGStyle::Get().GetBrush("Widget.TextBlock"); 
}

这些图标都是在引擎内部预定义的,通过搜索就能看到这些图标的定义。

// UMGStyle.cpp  

Style->Set("Widget.NativeWidgetHost", new IMAGE_BRUSH(TEXT("NativeWidgetHost"), Icon16x16));

其中IMAGE_BRUSH是同一个文件中定义的宏

#define IMAGE_BRUSH( RelativePath, ... ) FSlateImageBrush( Style->RootToContentDir( RelativePath, TEXT(".png") ), __VA_ARGS__ )

ICON16x16也同样是宏定义,再次就不赘述了。

自带图标也可以直接在控件中进行使用

const FSlateBrush *m_Icon = FUMGStyle::Get().GetBrush("Palette.Icon");
 
return SNew(STableRow< FFileListItemPtr >, OwnerTable)
[
SNew(SHorizontalBox)
    + SHorizontalBox::Slot()
    .HAlign(HAlign_Left)
    .AutoWidth()
    [
        SNew(SImage)
        .Image(m_Icon)
    ]
    + SHorizontalBox::Slot()
    .HAlign(HAlign_Left)
    [
        SNew(STextBlock)
        .Text(FText::FromString(Item->GetDisplayName()))
        .Font(FSlateFontInfo(FPaths::EngineContentDir() / TEXT("Slate/Fonts/Roboto-Bold.ttf"), 12))
    ]
];

Icon Font

Icon Font添加图标确实非常的方便,UE4编辑器中也有使用到Font Awesome作为图标显示。

由于Font Awesome比较有名,项目中使用的也是它。

C++中的使用

要在C++中使用Font Awesome,首先要对UFont对象进行生成。

FontAwesome = Cast<UFont>(StaticLoadObject(UFont::StaticClass(), NULL, TEXT("Font'/Game/Resource/Font/fontawesome-webfont.fontawesome-webfont'")));

其中Font部分为直接对导入的字体进行引用复制所得。接下来只要使用STextBlock来使用相应的图标就可以了

return SNew(STableRow< FFileListItemPtr >, OwnerTable)
    [
        SNew(SHorizontalBox)
        + SHorizontalBox::Slot()
        .HAlign(HAlign_Left)
        .AutoWidth()
        .Padding(FMargin(0.0f, 3.0f, 1.0f, 0.0f))
        [
            SNew(STextBlock)
            .Font(FSlateFontInfo(FontAwesome, 12))
            .Text(FText::FromString(FString(Item->IsDirectory ? TEXT("\xf07b" /*fa-folder*/) : TEXT("\xf15b" /*fa-file*/))))
        ]
        + SHorizontalBox::Slot()
        .HAlign(HAlign_Left)
        .Padding(FMargin(3.0f, 3.0f, 0.0f, 0.0f))
        [
            SNew(STextBlock)
            .Text(FText::FromString(Item->GetDisplayName()))
            .Font(FSlateFontInfo(FPaths::EngineContentDir() / TEXT("Slate/Fonts/Roboto-Bold.ttf"), 12))
        ]
 
    ];

上面的代码是实现的列表的元素显示,最终的结果如下:

image

如果要在蓝图中进行使用的话,需要首先将字体的使用制定为对应的Icon Font。

通常Icon Font在提供的时候都会有每一个图标对应的Unicode编码,Font Awesome的编码集在[这里]。

Font Awesome的编码集页面是可以直接复制对应的字符的,但是也有只提供了编码集的情况出现。

只要有编码集就可以对Icon进行使用了,要输入对应的Unicode码有很多种方式,这里提供两种。

Win+R输入并运行charmap,在其中选择对应的图标并复制其Unicode码。

在Word中输入对应的Unicode码,选中这些值按Alt+X就可以实现转换。

由于UE4编辑器中使用的字体并非对应的Icon Font,所以会以乱码显示,不过并不影响实际使用。

排版

使用到图标的时候有时需要对布局进行控制,布局的具体操作可以参看官方的Slate控件文档

其中需要注意的是,Padding布局使用的是数据结构FMargin。作用参看FMargin本身的构造函数定义即可,只是Padding参数本身对FMargin进行了封装,光看官方的例子会有一定的迷惑性。

对于FMargin,当参数为4个时分别对应Left, Top, Right, Bottom;为2个时对应Horizontal和Vertical;为1个时则对应所有方向。

另外要注意的是在列表中AutoWidth必须手动指定,并不像文档中所描述的一样是默认启动的。