动态overlay | 静态overlay | |
|---|---|---|
overlay资源包类型 | HAP/HSP | HSP |
核心API | ResourceManager.addResource/removeResource | overlay.setOverlayEnabled |
应用场景 | 静态资源定制(多语言、主题)。 | 动态UI交互(导航菜单、浮动面板)。 |
// EntryAbility.ets文件
onCreate(): void {
this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET);
hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onCreate');
// 系统默认使能,这里可以不设置
overlay.setOverlayEnabled('staticOverlay', true, (err) => {
if (err) {
hilog.error(DOMAIN, 'testTag', 'err code: ' + err.code + ' ' + 'message:' + err.message);
return;
}
console.info('setOverlayEnabled success');
});
} // Index.ets
@Entry
@Component
struct Index {
build() {
RelativeContainer() {
Image($r('app.media.bg'))
.width(100)
.height(100)
.alignRules({
center: { anchor: '__container__', align: VerticalAlign.Center },
middle: { anchor: '__container__', align: HorizontalAlign.Center }
})
}
.height('100%')
.width('100%')
}
} 

targetModuleName和targetPriority标签需要单独设置。
targetModuleName:字符串类型,指定要overlay的应用中的目标moduleName,这里需要替换Entry的资源,所以设置为Entry的moduleName。
targetPriority:整数类型,指定overlay优先级。
// staticOverlay module.json5
{
"module": {
"name": "staticOverlay",
"type": "shared",
"description": "$string:shared_desc",
"deviceTypes": [
"phone"
],
"deliveryWithInstall": true,
"pages": "$profile:main_pages",
"targetModuleName": "entry",
"targetPriority": 1
}
} 由于静态overlay需要替换实现主Entry包中的资源,所以需要注意的是,要在DevEco Studio上Run->Edit Configurations中选中entry包进行勾选“Deploy Multi Hap/Hsp Packages”选项,打包编译时会将静态资源包编译到应用HAP中:

执行编译后,在静态资源包这里会看到编译生成了编译产物:

staticOverlay包中“bg.png”资源替换了entry包中的“bg.png”,资源文件的路径、名称要和被替换包中资源文件一致。

// Index1.ets
import { common } from '@kit.AbilityKit';
@Entry
@Component
struct Index1 {
context: common.Context = this.getUIContext().getHostContext() as common.Context;
@State image: PixelMap = this.context.resourceManager.getDrawableDescriptor($r('app.media.bg').id).getPixelMap();
build() {
RelativeContainer() {
Image(this.image)
.width(100)
.height(100)
.alignRules({
center: { anchor: '__container__', align: VerticalAlign.Center },
middle: { anchor: '__container__', align: HorizontalAlign.Center }
}).onClick(()=> {
let path = this.context.bundleCodeDir + '/dynamicOverlay.hsp';
try {
this.context.resourceManager.addResource(path);
this.image = this.context.resourceManager.getDrawableDescriptor($r('app.media.bg').id).getPixelMap();
} catch (error) {
let code: number = (error as BusinessError<number>).code;
let message: string = (error as BusinessError<string>).message;
console.error(`addResource failed, error code: ${code}, message: ${message}.`);
}
})
}
.height('100%')
.width('100%')
}
} 
// dynamicOverlay module.json5
{
"module": {
"name": "dynamicOverlay",
"type": "shared",
"description": "$string:shared_desc",
"deviceTypes": [
"phone"
],
"deliveryWithInstall": true,
"pages": "$profile:main_pages"
}
}