主题图标¶
GtkIconTheme API 提供了访问与图标主题一起提供的图标的途径。
图标主题是共享共同外观和感觉的一组图标;主题是将名称与图标文件和大小映射的关系。
注意
有关图标主题的更多信息,您可以阅读 freedesktop.org 的 图标主题规范
扩展图标主题¶
有时,应用程序需要过于特定于领域的图标,无法包含在通用图标主题中。
有多种方法可以将图标资源作为命名图标提供
资源(推荐)
文件
资源¶
可以将应用程序特定的图标直接包含在应用程序二进制文件中作为资源,而不是将其安装到文件系统中。通过使用资源,您可以减少在文件系统上查找文件带来的性能损失,并提高应用程序的可移植性和可靠性。缺点是更改图标需要重新构建应用程序,并且二进制文件的大小会增加。
要使用资源,请将图标放置在与 hicolor 图标主题匹配的目录结构中
<gresources>
<gresource prefix="/my/resources/icons/scalable/actions">
<file>app-remove-symbolic.svg</file>
<file>edit-select-all-symbolic.svg</file>
</gresource>
<gresource prefix="/my/resources/icons/16x16/actions">
<file>app-remove.png</file>
<file>edit-select-all.png</file>
...
</gresource>
</gresources>
注意
在使用资源时,您不需要在路径中包含“hicolor”。
然后,告诉 GtkIconTheme 资源路径,您的图标位于该路径
GtkIconTheme *theme = gtk_icon_theme_get_for_display (gdk_display_get_default ());
gtk_icon_theme_add_resource_path (theme, "/my/resources/icons");
theme = Gtk.IconTheme.get_for_display(Gdk.Display.get_default())
theme.add_resource_path("/my/resources/icons")
var theme = Gtk.IconTheme.get_for_display (Gdk.Display.get_default ());
theme.add_resource_path ("/my/resources/icons");
const theme = Gtk.IconTheme.get_for_display(Gdk.Display.get_default());
theme.add_resource_path("/my/resources/icons");
最后,您可以使用图标的名称引用图标
GtkWidget *image = gtk_image_new_from_icon_name ("app-remove-symbolic");
image = Gtk.Image(icon_name="app-remove-symbolic")
var image = Gtk.Image.new_from_icon_name ("app-remove-symbolic");
const image = Gtk.Image({ icon_name: "app-remove-symbolic" });
<object class="GtkImage">
<property name="icon-name">app-remove-symbolic</property>
</object>
重要提示
GtkApplication 会根据应用程序的应用程序 ID 自动设置资源路径。如果您的应用程序 ID 是“org.my.App”,则会在“/org/my/App/icons”下查找图标。请参阅 GtkApplication 文档 以获取有关自动资源的更多信息。
文件¶
您可以将图标安装到与 *hicolor* 图标主题匹配的目录结构中。通常,图标位于应用程序的数据目录中,例如 /usr/share/org.gnome.YourApp。
例如,您可以从 Meson 构建文件安装图标
# Define PKG_DATADIR as a global symbol
pkg_datadir = get_option('prefix') / get_option('datadir') / meson.project_name()
add_project_arguments('-DPKG_DATADIR=@0@'.format(datadir), language: 'c')
# List the icons to install
action_icons_dir = pkg_datadir / 'icons/hicolor/16x16/actions'
action_icons = [
'action-name-1.png',
'action-name-2.png',
]
# Install the icons
install_data(action_icons, install_dir: action_icons_dir)
# Ensure that the directory matches the expected icon theme definition
meson.add_install_script(
'gtk-update-icon-cache',
'-q',
'-t',
'-f',
customdir,
skip_if_destdir: true,
)
您还需要告诉 GtkIconTheme 查看该目录
GtkIconTheme *theme = gtk_icon_theme_get_for_display (gdk_display_get_default ());
gtk_icon_theme_append_search_path (theme, PKG_DATADIR "/icons");
theme = Gtk.IconTheme.get_for_display(Gdk.Display.get_default())
theme.append_search_path(os.path.join(PKG_DATADIR, "icons"))
var theme = Gtk.IconTheme.get_for_display (Gdk.Display.get_default ());
theme.append_search_path (PKG_DATADIR + "/icons");
const theme = Gtk.IconTheme.get_for_display(Gdk.Display.get_default());
theme.append_search_path(PKG_DATADIR + "/icons");
即使对于这些私有图标,也建议遵循 图标命名规范 的原则。
这种扩展图标主题的方法比其他方法具有一些优势
应用程序特定的图标不会污染主题图标的共享命名空间,并且其他应用程序不会无意中选择仅供您的应用程序使用的图标
由于图标安装到“hicolor”下方的目录中,主题可以覆盖图标,使您的应用程序与系统的其余部分相适应
翻转的图标¶
某些图标受益于在从右到左 (RTL) 定位中“翻转”。GTK 会自动执行此操作,通过将 GTK_ICON_LOOKUP_DIR_RTL 或 GTK_ICON_LOOKUP_DIR_LTR 标志传递给 GtkIconTheme 在加载图标时。
如果您使用 GtkIconTheme API 手动加载图标,您可能也希望对翻转相关的图标执行相同的操作。
当然,为了使这有任何区别,图标主题中必须存在 RTL 变体。如果您有一个带有 RTL 变体的图标,则应将 -rtl 后缀附加到图标的文件基本名称。
符号图标¶
符号图标具有简单的形式,并且可以像文本一样使用。它们将根据使用的上下文进行重新着色。按照惯例,符号图标的命名带有 -symbolic 后缀。
将像“pan-start-symbolic”这样的图标名称传递给 GTK 函数(如 gtk_image_set_from_icon_name())将自动完成正确的操作。当您使用 GtkIconTheme API 手动加载符号图标时,请确保使用“symbolic”变体,例如 gtk_icon_info_load_symbolic(),以确保图标被正确着色。
重要提示
只有通过 GtkIconTheme 加载的符号图标才会被使用样式颜色重新着色。直接从文件或资源加载的图标,或者存储在与图标主题目录结构不匹配的位置的图标,将 不会 被 GTK 自动重新着色。
- 在文件系统上安装自己的符号图标时,您可以安装
svg(符号图标创建的传统形式)或使用
gtk-encode-symbolic-svg 工具将图标转换为专门制作的 .symbolic.png 文件,这些文件可以安装到图标主题的固定大小子目录中
gtk-encode-symbolic-svg -o /usr/share/icons/hicolor/48x48/apps my-app-symbolic.svg 48x48
应用程序图标¶
图标主题规范定义了一个通用的回退主题,称为 hicolor,应用程序可以在其中安装需要被系统其余部分识别的图标。
这方面的一个主要示例是应用程序图标,该图标用于应用程序的桌面文件。此图标的名称应与应用程序名称匹配,并安装在 /usr/share/icons/hicolor/48x48/apps/ 中。其他大小是可选的,但 256x256 图标是 GNOME 在其应用程序网格中使用的默认大小,因此强烈建议您提供一个。
应用程序还鼓励将应用程序图标的符号版本安装到 hicolor 主题中,名称相同并带有 -symbolic 后缀。符号图标可以作为 SVG 安装在 /usr/share/icons/hicolor/symbolic/apps 目录中(在 hicolor 0.15 中添加),或作为 .symbolic.png 文件安装在 /usr/share/icons/hicolor/48x48/apps/ 中。其他大小是可选的。
注意
与其它图标不同,应用程序图标不能添加到 GResource 中,因为它们由桌面文件引用并由桌面加载。