图片、网络图片与 SVG
当前项目有图片 DSL:ui.image(id)。它和 ui.rect、ui.text 一样由 core::dsl::Runtime 管理,不需要页面或组件直接创建 OpenGL primitive。
DSL 写法
ui.image("logo")
.size(96.0f, 96.0f)
.source("assets/icon.svg")
.radius(18.0f)
.opacity(0.92f)
.cover()
.build();
ui.image("remote")
.size(260.0f, 150.0f)
.url("https://example.com/picture.png")
.cover()
.radius(16.0f)
.build();
ui.image("bing")
.size(260.0f, 150.0f)
.bingDaily(0, "zh-CN")
.cover()
.radius(16.0f)
.build();
components::image(ui, id) 会返回一个已经套用默认 theme token 的 ImageBuilder。如果页面有自己的 light/dark token,推荐传入:
components::image(ui, "avatar", tokens)
.source("assets/icon.png")
.cover()
.build();
支持能力
- 本地 PNG / JPG / BMP / WebP 等位图通过
3rd/stb_image.h解码。 - SVG 通过
3rd/nanosvg.h和3rd/nanosvgrast.h栅格化成 RGBA 纹理。 - Windows 的
http:///https://图片使用系统URLDownloadToFileA下载到临时缓存目录。 - Linux / 其他非 Windows 平台通过 libcurl 请求网络资源;CMake 在非 Windows 平台要求
CURL::libcurl。 - 网络图片下载是后台线程;下载期间不阻塞界面,下载完成后 Runtime 会触发重绘。
- 图片纹理按解析后的文件路径缓存,同一张图重复使用不会重复上传纹理。
bingDaily(idx, mkt)内置 Bing 每日图:先请求 Bing API,再下载返回的图片 URL。
Fit 模式
默认是 ImageFit::Cover。
.cover() // 铺满区域,保持比例,超出部分裁剪
.contain() // 完整显示图片,保持比例,区域可能留空
.stretch() // 拉伸到区域,可能变形
.fit(core::ImageFit::Cover)
Gallery 的 about logo 和 Bing 图片都使用 cover,因此图片不会被压缩变形,而是适应裁剪。
可动画属性
Image 进入 dirty rect 流程,支持这些属性动画:
- frame:位置和大小
- tint / color
- opacity
- radius
- transform:translate / scale / rotate
示例:
ui.image("avatar")
.size(active ? 120.0f : 88.0f, active ? 120.0f : 88.0f)
.source("assets/icon.png")
.radius(active ? 32.0f : 18.0f)
.rotate(active ? 0.25f : 0.0f)
.transition(0.28f, core::Ease::OutCubic)
.animate(core::AnimProperty::Frame |
core::AnimProperty::Radius |
core::AnimProperty::Transform)
.build();
交互
Image 支持通用交互:
ui.image("github.logo")
.size(96.0f, 96.0f)
.source("assets/icon.png")
.onClick([] {
core::platform::openUrl("https://github.com/sudoevolve/EUI-NEO");
})
.build();
但 Image 没有内置 hover / pressed 视觉状态。需要 hover 变色、按压缩放等效果时,推荐外层使用 Stack + Rect + Image 组合,或封装成组件。
网络文本 API 示例
通用网络文本请求在 core/network.h:
core::network::requestText(
"bing.meta",
"https://www.bing.com/HPImageArchive.aspx?format=js&n=1&idx=0&mkt=zh-CN");
const core::network::TextResult result = core::network::textResult("bing.meta");
if (result.ready && result.ok) {
ui.text("api.text")
.size(520.0f, 72.0f)
.text(result.body)
.wrap(true)
.build();
}
requestText 是后台请求,不阻塞 UI。请求完成后会唤醒 GLFW 事件循环,app/dsl_app.h 会在收到网络文本完成信号后重新 compose。
Gallery 的 Bing 页面包含本地 PNG、本地 SVG、Bing daily 图片和 Bing API 文本示例。
当前限制
- SVG 当前按固定目标尺寸栅格化,适合图标和中等尺寸图片;还没有按元素尺寸动态重新栅格化。
- 网络请求没有暴露 header、超时、取消、进度等高级能力。
- 图片点击可以做,但 hover / pressed 视觉状态需要自己组合 rect。
实现位置
core/image.hcore/image.cppcore/network.hcore/network.cppcore/dsl.h:ElementKind::Image和ImageBuildercore/dsl_runtime.h:Image 实例缓存、动画同步、dirty rect 和渲染分发components/image.h:薄封装