HarmonyOS Next 办公应用:消息气泡组件的实现(一)

HarmonyOS Next 办公应用:消息气泡组件的实现

概述

在 HarmonyOS Next 办公类应用开发中,实现消息气泡组件是常见的交互需求。消息气泡可用于展示聊天消息、通知等内容,并且根据消息类型和发送方向有不同的显示样式。下面将介绍如何构建一个支持多种消息类型的消息气泡组件。

核心代码功能及对应代码段

1. 组件状态与属性定义

MessageBubble 组件定义了多个状态和属性,用于控制消息气泡的显示样式和内容。

typescript 复制代码
@Component
export struct MessageBubble {
  receivedName: string ='';
  @Link currentFeatureIndex: number;
  private isReceived: boolean = false;
  private content: string = '';
  private isAppletMsg?: boolean;
  private isDocumentMsg?: boolean;
  avatar1: Resource = $r('app.media.avatar1');
  avatar2: Resource = $r('app.media.avatar7');
  // ...
}
  • receivedName:接收方的名称。
  • isReceived:标记消息是否为接收的消息。
  • content:消息的具体内容。
  • isAppletMsgisDocumentMsg:标记消息是否为小程序消息或文档消息。
  • avatar1avatar2:分别表示接收方和发送方的头像资源。
2. 消息气泡布局构建

build 方法构建了消息气泡的整体布局,根据 isReceived 的值决定消息气泡的对齐方式和头像显示位置。

typescript 复制代码
build() {
  Column() {
    Flex({ justifyContent: this.isReceived ? FlexAlign.Start : FlexAlign.End, direction: FlexDirection.Row }) {
      if (this.isReceived) {
        Image(conversationListData.find((item) => item.name === this.receivedName)?.icon || this.avatar1)
          .width('40vp')
          .height('40vp')
          .flexShrink(0)
      }
      Column() {
        Stack({ alignContent: this.isReceived ? Alignment.TopStart : Alignment.TopEnd }) {
          // 路径绘制,用于消息气泡的三角箭头
          Path()
            .commands('M-10 1 L0 18 L32 1 Z')
            .fillOpacity(1)
            .stroke(Color.White)
            .strokeWidth(1)
            .fill(Color.White)
            .visibility(this.isReceived ? Visibility.Visible : Visibility.None)
          Path()
            .commands('M23 1 L0 28 L-10 1 Z')
            .fillOpacity(1)
            .stroke(Color.White)
            .strokeWidth(1)
            .fill(Color.White)
            .visibility(this.isReceived ? Visibility.None : Visibility.Visible)
            .zIndex(2)
            .margin({ right: '-10vp' })
          Column() {
            this.MessageContent()
          }
          .padding({
            left: '12vp',
            right: '12vp',
            top: '10vp',
            bottom: '10vp'
          })
          .backgroundColor(Color.White)
          .borderRadius(8)
        }
        .padding({
          top: '1vp',
          left: '20vp',
          right: '20vp',
          bottom: '22vp'
        })
        .width('100%')
      }
      .width('100%')

      if (!this.isReceived) {
        Image(this.avatar2)
          .width('40vp')
          .height('40vp')
          .flexShrink(0)
      }
    }
  }
  .margin({ left: '15vp', right: '16vp' })
}
  • 通过 Flex 组件根据 isReceived 控制消息气泡的对齐方式。
  • 使用 Path 组件绘制消息气泡的三角箭头,根据消息方向显示不同的箭头。
  • 调用 MessageContent 方法显示消息内容。
相关推荐
nullregedit1 小时前
原生鸿蒙像素画板实战 22:快捷键与鼠标交互
harmonyos·arkts·鸿蒙·bitart·像素画
●VON2 小时前
鸿蒙 PC Markdown 编辑器图片粘贴:从系统剪贴板到标准相对链接
华为·编辑器·harmonyos·鸿蒙
●VON2 小时前
鸿蒙 PC Markdown 编辑器外部修改检测:从文件指纹到冲突决策
华为·编辑器·harmonyos·鸿蒙
●VON2 小时前
鸿蒙 PC Markdown 编辑器十兆级大文档保护模式
华为·编辑器·harmonyos·鸿蒙
●VON2 小时前
鸿蒙 PC Markdown 编辑器三方冲突处理:本地缓冲区、磁盘版本与共同基线
网络·华为·编辑器·harmonyos·鸿蒙
listening7772 小时前
HarmonyOS 6.1 性能极致调优:从“流畅”到“极致”的SmartPerf深度剖析
华为·harmonyos
轻口味2 小时前
【大展鸿图】HarmonyOS DevEco Code 入门与最佳实
华为·harmonyos·鸿蒙·月更
●VON3 小时前
鸿蒙 PC Markdown 编辑器搜索选项响应式布局:220 vp 侧栏中的完整中文控件
服务器·华为·编辑器·harmonyos·鸿蒙
Helen_cai4 小时前
HarmonyOS ArkTS 实战:实现一个外出报备晚归登记应用
华为·harmonyos
fengxinzi_zack11 小时前
HarmonyOS应用开发实战:萌宠日记 - 健康分类数据隔离
harmonyos·鸿蒙