From 0b6c5dfc5433f370a2b03ac7e266c50eb8cc03d1 Mon Sep 17 00:00:00 2001 From: lanterngamescn Date: Sat, 27 Jun 2026 15:52:05 +0800 Subject: [PATCH] =?UTF-8?q?feat(share):=20=E6=96=87=E6=9C=AC=E5=88=86?= =?UTF-8?q?=E4=BA=AB=E6=8C=87=E5=BC=95=E6=A1=86=E9=87=8D=E5=81=9A=E4=B8=BA?= =?UTF-8?q?=E5=88=86=E6=AD=A5=E5=BC=95=E5=AF=BC=E5=8D=A1=E7=89=87(?= =?UTF-8?q?=E5=8F=82=E8=80=83=E6=88=AA=E5=9B=BE)=EF=BC=8C=E5=8E=BB?= =?UTF-8?q?=E6=8E=89=E7=B3=BB=E7=BB=9F=E5=88=86=E4=BA=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ShareGuideDialog: 居中卡片 标题{渠道}分享准备完成 + 内容已复制到剪贴板 + 微信/QQ/抖音三套分步指引 + 两按钮(稍后分享/立即打开{渠道},渠道主题色)。文本不再提供系统分享(移除onGuideAction system分支+systemText)。 容器移除 contentKind 接线。 --- .../main/ets/components/ShareGuideDialog.ets | 141 +++++++++++------- .../main/ets/pages/BridgeGameContainer.ets | 3 - .../src/main/ets/providers/ShareProvider.ets | 15 +- 3 files changed, 87 insertions(+), 72 deletions(-) diff --git a/entry/src/main/ets/components/ShareGuideDialog.ets b/entry/src/main/ets/components/ShareGuideDialog.ets index 0e50646..7114c5c 100644 --- a/entry/src/main/ets/components/ShareGuideDialog.ets +++ b/entry/src/main/ets/components/ShareGuideDialog.ets @@ -1,15 +1,13 @@ /** - * 分享指引弹窗(渠道选定后弹出)。纯展示组件:动作经 onPick 回容器, - * 由容器一次性 resultEvent 回投 ShareProvider(同 SharePanel 模式,不持业务逻辑)。 - * 文案按 contentKind:文本→"请打开XX粘贴分享";图片→"可在XX长按粘贴;或用系统分享"。 + * 分享指引弹窗(文本分享用;图片分享走系统分享面板、不经此)。居中卡片: + * 标题「{渠道}分享准备完成」+「内容已复制到剪贴板」+ 分步指引 + 「稍后分享」/「立即打开{渠道}」。 + * 纯展示组件:动作经 onPick 回容器,由容器一次性 resultEvent 回投 ShareProvider。 */ @Component export struct ShareGuideDialog { /** 渠道:'wechat' | 'qq' | 'douyin'。 */ platform: string = 'wechat'; - /** 内容类型:'text' | 'image'。 */ - contentKind: string = 'text'; - /** 动作回调:'open' | 'system' | 'cancel'。 */ + /** 动作回调:'open'(立即打开App)| 'cancel'(稍后分享/点空白)。 */ onPick: (action: string) => void = () => { }; private appName(): string { @@ -22,75 +20,108 @@ export struct ShareGuideDialog { return '微信'; } - private appIcon(): Resource { + /** 渠道主题色(标题序号徽标 + 打开按钮)。 */ + private appColor(): string { if (this.platform === 'qq') { - return $r('app.media.share_qq'); + return '#12B7F5'; } if (this.platform === 'douyin') { - return $r('app.media.share_douyin'); + return '#FE2C55'; } - return $r('app.media.share_wechat'); + return '#07C160'; } - private hint(): string { - const name: string = this.appName(); - return this.contentKind === 'image' - ? `图片已复制,可在${name}长按粘贴;或点下方用系统分享` - : `内容已复制,请打开${name}粘贴分享`; + /** 各渠道"分享到好友或群聊"分步文案(差异主要在第 1 步进入聊天的入口)。 */ + private steps(): string[] { + if (this.platform === 'qq') { + return ['打开QQ,进入「消息」列表', '选择好友或群聊进入聊天', '在输入框长按粘贴内容', '点击发送即可分享']; + } + if (this.platform === 'douyin') { + return ['打开抖音,点击右下角「消息」', '选择好友或群聊进入聊天', '在输入框长按粘贴内容', '点击发送即可分享']; + } + return ['打开微信,进入聊天列表', '选择好友或群聊进入聊天', '在输入框长按粘贴内容', '点击发送即可分享']; + } + + @Builder + stepRow(index: number, text: string) { + Row() { + Text(`${index + 1}`) + .fontSize(13) + .fontColor(Color.White) + .width(20) + .height(20) + .textAlign(TextAlign.Center) + .backgroundColor(this.appColor()) + .borderRadius(4) + Text(text) + .fontSize(14) + .fontColor('#333333') + .margin({ left: 10 }) + .layoutWeight(1) + } + .width('100%') + .margin({ top: 10 }) + .alignItems(VerticalAlign.Center) } build() { Column() { - Blank() - .layoutWeight(1) - .width('100%') - .onClick(() => this.onPick('cancel')) - Column() { - Image(this.appIcon()) - .width(48) - .height(48) - .objectFit(ImageFit.Contain) - .margin({ top: 16 }) - Text(this.hint()) - .fontSize(14) - .fontColor('#333333') - .textAlign(TextAlign.Center) - .margin({ top: 12, bottom: 12 }) - .padding({ left: 20, right: 20 }) + Text(`${this.appName()}分享准备完成`) + .fontSize(18) + .fontWeight(FontWeight.Bold) + .fontColor('#222222') + .width('100%') - Divider().color('#EEEEEE') - Text(`打开${this.appName()}`) - .fontSize(16) - .fontColor('#1989FA') - .width('100%') - .textAlign(TextAlign.Center) - .padding({ top: 14, bottom: 14 }) - .onClick(() => this.onPick('open')) - Divider().color('#EEEEEE') - Text('用系统分享') - .fontSize(16) - .fontColor('#333333') - .width('100%') - .textAlign(TextAlign.Center) - .padding({ top: 14, bottom: 14 }) - .onClick(() => this.onPick('system')) - Divider().color('#EEEEEE') - Text('取消') - .fontSize(16) + Row() { + Text('✅').fontSize(15) + Text('内容已复制到剪贴板') + .fontSize(14) + .fontColor('#333333') + .margin({ left: 6 }) + } + .width('100%') + .margin({ top: 14 }) + + Text('🎯 分享到好友或群聊步骤:') + .fontSize(14) .fontColor('#666666') .width('100%') - .textAlign(TextAlign.Center) - .padding({ top: 14, bottom: 14 }) - .onClick(() => this.onPick('cancel')) + .margin({ top: 14 }) + + ForEach(this.steps(), (item: string, index: number) => { + this.stepRow(index, item) + }) + + Row() { + Button('稍后分享') + .fontSize(16) + .fontColor('#666666') + .backgroundColor('#F2F2F2') + .layoutWeight(1) + .onClick(() => this.onPick('cancel')) + Button(`立即打开${this.appName()}`) + .fontSize(16) + .fontColor(Color.White) + .backgroundColor(this.appColor()) + .layoutWeight(1) + .margin({ left: 12 }) + .onClick(() => this.onPick('open')) + } + .width('100%') + .margin({ top: 22 }) } - .width('100%') + .width('82%') + .padding(20) .backgroundColor(Color.White) - .borderRadius({ topLeft: 16, topRight: 16 }) + .borderRadius(16) .onClick(() => { /* 消费点击,避免穿透到遮罩 */ }) } .width('100%') .height('100%') .backgroundColor('rgba(0,0,0,0.45)') + .justifyContent(FlexAlign.Center) + .alignItems(HorizontalAlign.Center) + .onClick(() => this.onPick('cancel')) } } diff --git a/entry/src/main/ets/pages/BridgeGameContainer.ets b/entry/src/main/ets/pages/BridgeGameContainer.ets index 7cddd5d..44d5185 100644 --- a/entry/src/main/ets/pages/BridgeGameContainer.ets +++ b/entry/src/main/ets/pages/BridgeGameContainer.ets @@ -56,7 +56,6 @@ export struct BridgeGameContainer { /** 分享指引窗显隐(渠道选定后叠在 Stack 顶层)。 */ @State private shareGuideVisible: boolean = false; private shareGuidePlatform: string = ''; - private shareGuideKind: string = ''; /** 当前指引窗的一次性回投事件名(用户选动作后 emit 回 ShareProvider)。 */ private shareGuideResultEvent: string = ''; @@ -166,7 +165,6 @@ export struct BridgeGameContainer { } const req = p as ShareGuideRequest; this.shareGuidePlatform = req.platform; - this.shareGuideKind = req.contentKind; this.shareGuideResultEvent = req.resultEvent; this.shareGuideVisible = true; } @@ -431,7 +429,6 @@ export struct BridgeGameContainer { if (this.shareGuideVisible) { ShareGuideDialog({ platform: this.shareGuidePlatform, - contentKind: this.shareGuideKind, onPick: (action: string) => this.emitShareGuideResult(action), }) } diff --git a/feature_capabilities/src/main/ets/providers/ShareProvider.ets b/feature_capabilities/src/main/ets/providers/ShareProvider.ets index bc3f18b..a6f0535 100644 --- a/feature_capabilities/src/main/ets/providers/ShareProvider.ets +++ b/feature_capabilities/src/main/ets/providers/ShareProvider.ets @@ -241,13 +241,8 @@ export class ShareProvider implements CapabilityProvider { if (platform === 'wechat') { this.reportResult(2, reportType); } - } else if (action === 'system') { - this.systemText(uiCtx, bean); - if (platform === 'wechat') { - this.reportResult(2, reportType); - } } else { - // cancel + // 稍后分享 / 取消:仅微信回执取消。 if (platform === 'wechat') { this.reportResult(3, reportType); } @@ -299,14 +294,6 @@ export class ShareProvider implements CapabilityProvider { // —— 系统分享(图片可靠交付 / 文本兜底;文本不下发 url)—— - private systemText(uiCtx: common.UIAbilityContext, bean: SharetypeBean): void { - const text: string = buildShareText(bean.title, bean.description); - const record: systemShare.SharedRecord = { - utd: utd.UniformDataType.PLAIN_TEXT, content: text !== '' ? text : ' ', - }; - this.showSystemShare(uiCtx, record); - } - private systemImage(uiCtx: common.UIAbilityContext, filePath: string, bean: SharetypeBean): void { const typeId: string = utd.getUniformDataTypeByFilenameExtension(this.extOf(filePath), utd.UniformDataType.IMAGE);