import router from '@ohos.router';
interface MenuItem {
icon: string;
label: string;
action: () => void;
}
@Entry
@Component
struct ContextMenuExample {
@State clickMenuItems: MenuItem[] = [
{ icon: '✏️', label: '编辑', action: () => console.info('编辑 clicked') },
{ icon: '📋', label: '复制', action: () => console.info('复制 clicked') },
{ icon: '✂️', label: '剪切', action: () => console.info('剪切 clicked') },
{ icon: '🗑️', label: '删除', action: () => console.info('删除 clicked') }
];
@State longPressMenuItems: MenuItem[] = [
{ icon: '🔍', label: '搜索', action: () => console.info('搜索 clicked') },
{ icon: '🔗', label: '分享', action: () => console.info('分享 clicked') },
{ icon: '⭐', label: '收藏', action: () => console.info('收藏 clicked') },
{ icon: '🔔', label: '提醒', action: () => console.info('提醒 clicked') }
];
// 点击触发的菜单
@Builder ClickMenuBuilder() {
Column() {
ForEach(this.clickMenuItems, (item: MenuItem, index: number) => {
Row({ space: 8 }) {
Text(item.icon)
.fontSize(18)
Text(item.label)
.fontSize(15)
.fontColor('#333333')
}
.width('100%')
.height(44)
.padding({ left: 16, right: 16 })
.justifyContent(FlexAlign.Start)
.onClick(() => {
item.action();
})
if (index < this.clickMenuItems.length - 1) {
Divider()
.strokeWidth(0.5)
.color('#E5E5E5')
.margin({ left: 16, right: 16 })
}
})
}
.width(150)
.backgroundColor('#FFFFFF')
.borderRadius(8)
.shadow({ radius: 10, color: '#20000000', offsetX: 0, offsetY: 4 })
}
// 长按触发的菜单
@Builder LongPressMenuBuilder() {
Column() {
ForEach(this.longPressMenuItems, (item: MenuItem, index: number) => {
Row({ space: 8 }) {
Text(item.icon)
.fontSize(18)
Text(item.label)
.fontSize(15)
.fontColor('#333333')
}
.width('100%')
.height(44)
.padding({ left: 16, right: 16 })
.justifyContent(FlexAlign.Start)
.onClick(() => {
item.action();
})
if (index < this.longPressMenuItems.length - 1) {
Divider()
.strokeWidth(0.5)
.color('#E5E5E5')
.margin({ left: 16, right: 16 })
}
})
}
.width(150)
.backgroundColor('#FFFFFF')
.borderRadius(8)
.shadow({ radius: 10, color: '#20000000', offsetX: 0, offsetY: 4 })
}
build() {
Column({ space: 20 }) {
// 顶部导航
Row() {
Text('←')
.fontSize(24)
.fontColor('#333333')
.onClick(() => {
router.back();
})
Text('菜单演示')
.fontSize(20)
.fontWeight(FontWeight.Medium)
.fontColor('#1a1a1a')
Blank()
Text('')
.width(24)
}
.width('100%')
.padding(16)
.backgroundColor('#FFFFFF')
// 内容区域
Scroll() {
Column({ space: 20 }) {
// 禁用触觉反馈示例
Column({ space: 12 }) {
Text('🔇')
.fontSize(40)
Text('禁用触觉')
.fontSize(18)
.fontWeight(FontWeight.Medium)
.fontColor('#1a1a1a')
Text('点击触发菜单(无触觉反馈)')
.fontSize(13)
.fontColor('#999999')
.textAlign(TextAlign.Center)
}
.width('100%')
.padding(24)
.backgroundColor('#FFFFFF')
.borderRadius(16)
.shadow({ radius: 8, color: '#10000000', offsetX: 0, offsetY: 2 })
.bindMenu(this.ClickMenuBuilder, {
hapticFeedbackMode: HapticFeedbackMode.DISABLED
})
// 点击菜单示例
Column({ space: 12 }) {
Text('👆')
.fontSize(40)
Text('点击菜单')
.fontSize(18)
.fontWeight(FontWeight.Medium)
.fontColor('#1a1a1a')
Text('点击卡片触发点击菜单')
.fontSize(13)
.fontColor('#999999')
.textAlign(TextAlign.Center)
}
.width('100%')
.padding(24)
.backgroundColor('#FFFFFF')
.borderRadius(16)
.shadow({ radius: 8, color: '#10000000', offsetX: 0, offsetY: 2 })
.bindMenu(this.ClickMenuBuilder, {
hapticFeedbackMode: HapticFeedbackMode.ENABLED
})
// 长按菜单示例
Column({ space: 12 }) {
Text('👆')
.fontSize(40)
Text('长按菜单')
.fontSize(18)
.fontWeight(FontWeight.Medium)
.fontColor('#1a1a1a')
Text('长按卡片触发长按菜单')
.fontSize(13)
.fontColor('#999999')
.textAlign(TextAlign.Center)
}
.width('100%')
.padding(24)
.backgroundColor('#FFFFFF')
.borderRadius(16)
.shadow({ radius: 8, color: '#10000000', offsetX: 0, offsetY: 2 })
.bindContextMenu(this.LongPressMenuBuilder, ResponseType.LongPress, {
hapticFeedbackMode: HapticFeedbackMode.ENABLED
})
// 自动触觉反馈示例(无蒙层 - 不震动)
Column({ space: 12 }) {
Text('⚙️')
.fontSize(40)
Text('AUTO(无蒙层)')
.fontSize(18)
.fontWeight(FontWeight.Medium)
.fontColor('#1a1a1a')
Text('点击触发菜单(无蒙层,不震动)')
.fontSize(13)
.fontColor('#999999')
.textAlign(TextAlign.Center)
}
.width('100%')
.padding(24)
.backgroundColor('#FFFFFF')
.borderRadius(16)
.shadow({ radius: 8, color: '#10000000', offsetX: 0, offsetY: 2 })
.bindMenu(this.ClickMenuBuilder, {
hapticFeedbackMode: HapticFeedbackMode.AUTO
})
// 自动触觉反馈示例(有蒙层 - 会震动)
Column({ space: 12 }) {
Text('⚙️🔘')
.fontSize(40)
Text('AUTO(有蒙层)')
.fontSize(18)
.fontWeight(FontWeight.Medium)
.fontColor('#1a1a1a')
Text('点击触发菜单(有蒙层,会震动)')
.fontSize(13)
.fontColor('#999999')
.textAlign(TextAlign.Center)
}
.width('100%')
.padding(24)
.backgroundColor('#FFFFFF')
.borderRadius(16)
.shadow({ radius: 8, color: '#10000000', offsetX: 0, offsetY: 2 })
.bindMenu(this.ClickMenuBuilder, {
hapticFeedbackMode: HapticFeedbackMode.AUTO,
mask: { color: '#80000000' }
})
// 自动触觉反馈示例(无蒙层 - 不震动)
Column({ space: 12 }) {
Text('⚙️')
.fontSize(40)
Text('AUTO(无蒙层)')
.fontSize(18)
.fontWeight(FontWeight.Medium)
.fontColor('#1a1a1a')
Text('长按触发菜单(无蒙层,不震动)')
.fontSize(13)
.fontColor('#999999')
.textAlign(TextAlign.Center)
}
.width('100%')
.padding(24)
.backgroundColor('#FFFFFF')
.borderRadius(16)
.shadow({ radius: 8, color: '#10000000', offsetX: 0, offsetY: 2 })
.bindContextMenu(this.LongPressMenuBuilder, ResponseType.LongPress, {
hapticFeedbackMode: HapticFeedbackMode.AUTO,
})
// 自动触觉反馈示例(有蒙层 - 会震动)
Column({ space: 12 }) {
Text('⚙️🔘')
.fontSize(40)
Text('AUTO(有蒙层)')
.fontSize(18)
.fontWeight(FontWeight.Medium)
.fontColor('#1a1a1a')
Text('长按触发菜单(有蒙层,会震动)')
.fontSize(13)
.fontColor('#999999')
.textAlign(TextAlign.Center)
}
.width('100%')
.padding(24)
.backgroundColor('#FFFFFF')
.borderRadius(16)
.shadow({ radius: 8, color: '#10000000', offsetX: 0, offsetY: 2 })
.bindContextMenu(this.LongPressMenuBuilder, ResponseType.LongPress, {
hapticFeedbackMode: HapticFeedbackMode.AUTO,
mask: { color: '#80000000' }
})
}
.width('100%')
.padding(16)
}
.layoutWeight(1)
.scrollBar(BarState.Off)
.backgroundColor('#f5f5f7')
}
.width('100%')
.height('100%')
.backgroundColor('#f5f5f7')
}
}