移动/游戏
在 Kuikly 中添加、打包和加载本地 assets…
适用于 Kuikly 项目(Kuikly DSL 或 Compose DSL)需要引用本地图片等 assets 资源,并按 Android/iOS/鸿蒙/H5/微信小程序/动态化配置打包的场景。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
在 Kuikly 中添加、打包和加载本地特定
解决思路
- 将 assets 资源存放在 `shared/src/commonMain/assets` 目录下。
- 一般将资源放在对应页面目录下,推荐资源跟随页面,例如 `shared/src/commonMain/assets/MyPage/` 放 MyPage 页面资源(如 `banner.png`、`icon.png`)。
- 多页面共享的资源放在 `common/` 目录,例如 `shared/src/commonMain/assets/common/logo.png`。
- 业务代码放在 `shared/src/commonMain/kotlin/`。
- 使用 `ImageUri` 作为 Kuikly 统一的资源 URI 封装类,在 `Image`、`PAG` 等组件中引用资源。
- 页面 assets 资源:调用 `ImageUri.pageAssets("banner.png")`,生成 `assets://#pageName#/banner.png`,运行时替换为实际页面名(最常用)。
- 页面 assets 子目录资源:调用 `ImageUri.pageAssets("icons/star.png")`,生成 `assets://#pageName#/icons/star.png`。
- 公共 assets 资源:调用 `ImageUri.commonAssets("logo.png")`,生成 `assets://common/logo.png`。
- 本地文件路径:调用 `ImageUri.file("/path/to/image.png")`,生成 `file:///path/to/image.png`。
- URI Scheme 常量 `SCHEME_COMMON_ASSETS` 的值为 `assets://common/`,说明为公共资源。
- URI Scheme 常量 `SCHEME_PAGE_ASSETS` 的值为 `assets://#pageName#/`,说明为页面资源,运行时替换。
- URI Scheme 常量 `SCHEME_FILE` 的值为 `file://`,说明为本地文件。
- URI Scheme 常量 `SCHEME_BASE64` 的值为 `data:image`,说明为 Base64 图片。
- Kuikly DSL 加载页面 assets 图片:在 `Image` 组件中写 `attr { src(ImageUri.pageAssets("banner.png")) }`。
- Kuikly DSL 加载公共 assets 图片:在 `Image` 组件中写 `attr { src(ImageUri.commonAssets("logo.png")) }`。
- Compose DSL 通过 `DrawableResource` + `ImageUri` 加载本地 assets 资源,目录结构和打包配置与 Kuikly DSL 完全一致。
- Compose DSL 相关 import:`com.tencent.kuikly.compose.foundation.Image`、`com.tencent.kuikly.compose.resources.painterResource`、`com.tencent.kuikly.compose.resources.imageResource`、`com.tencent.kuikly.compose.resources.DrawableResource`、`com.tencent.kuikly.compose.resources.InternalResourceApi`。
- Compose DSL 定义 `DrawableResource`:需要 `@OptIn(InternalResourceApi::class)`,写法为 `private val bannerRes by lazy(LazyThreadSafetyMode.NONE) { DrawableResource(ImageUri.pageAssets("banner.png").toUrl("")) }`。
- Compose DSL 使用 `painterResource` 加载:返回 `Painter`,用于 `Image` 组件;示例 `Image(painter = painterResource(bannerRes), contentDescription = null, modifier = Modifier.size(200.dp, 100.dp))`。
- Compose DSL 使用 `imageResource` 加载:返回 `ImageBitmap`,用于 Canvas 绘制;示例 `val bitmap = imageResource(bannerRes); Canvas(Modifier.size(100.dp)) { drawImage(bitmap) }`。
- 首次使用 assets 资源需要配置各平台打包,详见 `references/PLATFORM_CONFIG.md`,覆盖 Android/iOS/鸿蒙/H5/微信小程序/动态化等平台。
适用边界 · 注意事项
- 不适用于非 Kuikly 项目,或未引入 Kuikly DSL/Compose DSL 资源加载能力的工程。
- 不适用于只需要网络 URL 图片、不涉及本地 assets 打包与 ImageUri 的场景。
- 若资源需按平台走各平台原生资源目录且不经过 Kuikly assets 打包链路,则不应按本文做法。