会话页面自定义
消 息点击事件
为了避免内存泄露,请将监听保存,在必要的时候移除
您可以通过调用 addMessageClickListener
方法监听消息的点击事件,消息点击监听 MessageClickListener 的所有方法均为可选方法,可以按需实现,此处为了方便展示,将所有方法都做了默认实现。
- 从
1.4.3
版本开始,onMessageClick
支持语音消息。 - 从
1.4.3
版本开始,所有方法均增加Context
、ClickEvent/GestureEvent
参数。
示例代码
let msgClickListener : MessageClickListener = {
onMessagePortraitClick: (message: Message, userId: string, context?: Context, event?: ClickEvent) => {
// 消息头像点击事件
// true 由 App 处理该事件,SDK 不再处理。false 由 SDK 处理
return false;
},
onMessagePortraitLongClick: (message: Message, user: UserInfoModel, context?: Context, event?: GestureEvent) => {
// 消息头像长按事件
// true 由 App 处理该事件,SDK 不再处理。false 由 SDK 处理
return false;
},
onMessageClick: (message: Message, context?: Context, event?: ClickEvent) => {
// 消息点击事件
// true 由 App 处理该事件,SDK 不再处理。false 由 SDK 处理
return false;
},
onMessageLongClick: (message: Message, context?: Context, event?: GestureEvent) => {
// 消息长按事件
// true 由 App 处理该事件,SDK 不再处理。false 由 SDK 处理
return false;
},
onMessageRecallEditClick: (message: Message, context?: Context, event?: ClickEvent) => {
// 消息撤回编辑事件
// true 由 App 处理该事件,SDK 不 再处理。false 由 SDK 处理
return false;
},
onMessageLinkClick: (message: Message, url: string, context?: Context, event?: ClickEvent) => {
// 文本消息超链接点击事件
// true 由 App 处理该事件,SDK 不再处理。false 由 SDK 处理
return false;
},
onMessageEmailClick: (message: Message, email: string, context?: Context, event?: ClickEvent) => {
// 文本消息 email 点击事件
// true 由 App 处理该事件,SDK 不再处理。false 由 SDK 处理
return false;
},
onMessagePhoneClick: (message: Message, phone: string, context?: Context, event?: ClickEvent) => {
// 文本消息手机号点击事件
// true 由 App 处理该事件,SDK 不再处理。false 由 SDK 处理
return false;
},
}
RongIM.getInstance().conversationService().addMessageClickListener(msgClickListener);
增加消息气泡的长按事件
您可以通过 addMessageItemLongClickAction
方法设置会话页面的长按消息事件监听,在相关监听方法中自定义事件:
示例代码
let msgLongClickAction :ItemLongClickAction<Message> = {
obtainTitle: (context: Context, data: Message): string | Resource => {
return "自定义的消息长按事件"
},
onClick: (context: Context, data: Message): void => {
promptAction.showToast({message : "点击了自定义的消息长按事件"})
},
onFilter: (data: Message): boolean => {
// 是否显示该长按事件?true 显示;false 不显示
// 开发者可以根据 Message 对象的会话类型或者消息类型决定是否显示
return true;
},
// 自定义的消息长按事件 Id,相同的 Id 的长按事件只会增加一次
actionId: 'CustomMessageActionId'
}
RongIM.getInstance().conversationService().addMessageItemLongClickAction(msgLongClickAction);
参数说明
ItemLongClickAction
类属性如下表所示。
属性 | 类型 | 描述 |
---|---|---|
obtainTitle | string | 显示名称。 |
onClick | (context: Context, data: Message): void | 长按消息监听函数。 |
onFilter | int | 控制是否会被显示出来的过滤器。 |
actionId | Filter | 自定义的消息长按事件 Id,相同的 Id 的长按事件只会增加一次 |
配置消息气泡的长按更多选项
在长按消息弹窗的菜单选项选择更多后,SDK 进入消息多选模式,多选模式下默认提供了删除按钮。您可以增删已有按钮、添加自定义按钮。
IMKit SDK没有内置消息转发功能,实现可以参照:转发消息实现。
示例代码
let msgMoreAction : MessageMoreAction = {
actionId: 'message_more_forward',// 动作 Id
location: 100, // 按钮将放置在底部,根据 location 值,按照从小到大的顺序依次向右排列。
icon: $r("app.media.rc_message_more_forward"), // 图标
onClick: (context: Context, data: Message[]): boolean => {
// 处理自定义的点击事件
// return true :聊天页面依旧处于多选状态
// return false : 聊天页面 退出多选状态
promptAction.showToast({message : "点击了聊天页面底部的更多按钮"});
return true
},
onFilter: (data: Message[]): boolean => {
// 是否显示该按钮,true 显示,false 不显示
return true;
}
}
RongIM.getInstance().conversationService().addMessageMoreAction(msgMoreAction)
修改消息气泡的 UI 配置
IMKit 从 1.4.3
版本开始支持通过 setConversationConfig
方法传入对应的 ConversationConfig
对象修改消息气泡的 UI 配置。支持设置的属性:边框圆角大小、边框色、背景色。
仅支持初始化前的配置,若初始化后开发者设置,则不会生效。
修改边框圆角大小
边框圆角大小支持按消息方向来设置:
- 设置/获取接收的消息气泡边框圆角大小:
setReceivedMessageBorderRadius
、getReceivedMessageBorderRadius
。 - 设置/获取发送的消息气泡边框圆角大小:
setSentMessageBorderRadius
、getSentMessageBorderRadius
。
示例代码
let config = RongIM.getInstance().conversationService().getConversationConfig();
let receivedMessageBorderRadius: BorderRadiuses = {
topLeft: 4,
topRight: 8,
bottomLeft: 8,
bottomRight: 8
}
config.setReceivedMessageBorderRadius(receivedMessageBorderRadius);
RongIM.getInstance().conversationService().setConversationConfig(config);
修改边框色
边框色支持按消息方向来设置:
- 设置/获取接收的消息气泡边框色:
setReceivedMessageBorderColor
、getReceivedMessageBorderColor
。 - 设置/获取发送的消息气泡边框色:
setSentMessageBorderColor
、getSentMessageBorderColor
。
- 通过指定消息的
objectName
仅修改文本消息类型的边框色为灰色,其他消息类型不修改。
示例代码
let config = RongIM.getInstance().conversationService().getConversationConfig();
config.setReceivedMessageBorderColor("RC:TxtMsg", Color.Gray);
RongIM.getInstance().conversationService().setConversationConfig(config);
- 修改全部消息类型的边框色为灰色。
示例代码
let config = RongIM.getInstance().conversationService().getConversationConfig();
config.setReceivedMessageBorderColor("", Color.Gray);
RongIM.getInstance().conversationService().setConversationConfig(config);
- 通过指定消息的
objectName
仅修改文本消息类型的边框色为灰色,同时修改其余消息类型的边框色为蓝色,与接口调用顺序无关。
示例代码
let config = RongIM.getInstance().conversationService().getConversationConfig();
config.setReceivedMessageBorderColor("RC:TxtMsg", Color.Gray);
config.setReceivedMessageBorderColor("", Color.Blue);
RongIM.getInstance().conversationService().setConversationConfig(config);
修改背景色
背景色支持按消息方向来设置:
- 设置/获取接收的消息气泡背景色:
setReceivedMessageBackgroundColor
、getReceivedMessageBackgroundColor
。 - 设置/获取发送的消息气泡背景色:
setSentMessageBackgroundColor
、getSentMessageBackgroundColor
。
- 通过指定消息的
objectName
仅修改文本消息类型的背景色为灰色,其他消息类型不修改。
示例代码
let config = RongIM.getInstance().conversationService().getConversationConfig();
config.setReceivedMessageBackgroundColor("RC:TxtMsg", Color.Gray);
RongIM.getInstance().conversationService().setConversationConfig(config);
- 修改全部消息类型的背景色为灰色。
示例代码
let config = RongIM.getInstance().conversationService().getConversationConfig();
config.setReceivedMessageBackgroundColor("", Color.Gray);
RongIM.getInstance().conversationService().setConversationConfig(config);
- 通过指定消息的
objectName
仅修改文本消息类型的背景色为灰色,同时修改其余消息类型的背景色为蓝色,,与接口调用顺序无关。
示例代码
let config = RongIM.getInstance().conversationService().getConversationConfig();
config.setReceivedMessageBackgroundColor("RC:TxtMsg", Color.Gray);
config.setReceivedMessageBackgroundColor("", Color.Blue);
RongIM.getInstance().conversationService().setConversationConfig(config);
自定义输入框按钮UI
从 1.5.1 版本开始,IMKit 默认允许配置会话页面输入框的一些UI组件。可通过 setInputAreaComponentConfig(InputAreaComponentConfig)
接口设置自定义组件配置。
export interface InputAreaComponentConfig {
/**
* 组件标识
*/
identifier: ComponentIdentifier,
/**
* 组件WrappedBuilder
* @since 1.6.0
*/
component: WrappedBuilder<[InputAreaComponentData]> | null,
}
/**
* 输入区域自定义组件数据,封装必要的参数透传给自定义 组件
* @since 1.6.0
*/
export class InputAreaComponentData {
/**
* 上下文
*/
context: Context | undefined;
/**
* 会话标识
*/
convId: ConversationIdentifier | undefined;
/**
* 透传参数
*
*```
* 当 `identifier` 为某些枚举类型的情况下有值,其余情况下为空。详细说明如下
* 1. ComponentIdentifier.InputBarVoiceButton: "Voice" 语音类型、"Text" 文本类型。
* 2. ComponentIdentifier.InputBarEmoticonButton: "Emoticon" 表情类型、"Text" 文本类型。
* 3. ComponentIdentifier.DestructBarVoiceButton: "Voice" 语音类型、"Text" 文本类型。
*```
*/
data: string = "";
}
identifier
支持的组件类型说明:
组件类型 | 说明 |
---|---|
InputBarVoiceButton | 输入框左侧语音按钮 |
InputBarEmoticonButton | 输入框表情按钮 |
InputBarSendButton | 输入框发送按钮 |
InputBarPluginButton | 输入框插件加号按钮 |
// 设置接口
let InputBarPluginButton: InputAreaComponentConfig = {
identifier: ComponentIdentifier.InputBarPluginButton,
component: wrapBuilder(buildCustomInputBarPluginView),
}
RongIM.getInstance().conversationService().setInputAreaComponentConfig(InputBarPluginButton)
// 组件
@Builder
export function buildCustomInputBarPluginView(componentData: InputAreaComponentData) {
CustomInputBarPluginView({ context: componentData.context, convId: componentData.convId, type: componentData.data })
}
@Component
export struct CustomInputBarPluginView {
@Prop context: Context;
@Prop convId: ConversationIdentifier;
@Prop type: string;
aboutToAppear(): void {
console.log("CustomInputBarPluginView aboutToAppear " + this.type)
}
build() {
Image($r('app.media.default_fmessage'))
.size({ width: 30, height: 30 })
.onTouch(() => {
promptAction.showToast({ message: `点击了按钮` })
})
}
}
自定义会话页面按钮UI
从 1.6.0 版本开始,IMKit 默认允许配置会话页面的一些UI组件。可通过 setConversationContentComponentConfig(ConversationContentComponentConfig)
接口设置自定义组件配置。
ConversationContentComponentConfig
相关接口说明:
export interface ConversationContentComponentConfig {
/**
* 组件标识
*
*```
* 注意:
* ConversationContentComponentConfig 支持的类型:
* - ConversationUnreadMessageButton;
* - ConversationUnreadMentionedMessageButton;
* - ConversationNewReceivedUnreadMessageButton
*```
*/
identifier: ComponentIdentifier,
/**
* 组件WrappedBuilder。
*/
component: WrappedBuilder<[ConversationContentComponentData]> | null,
}
// 会话自定义组件数据
export class ConversationContentComponentData {
/**
* 上下文
*/
context: Context | undefined;
/**
* 会话标识
*/
convId: ConversationIdentifier | undefined;
/**
* 透传参数
*
*```
* 与 `ConversationContentComponentConfig` 的 identifier` 参数具备对应关系,使用说明如下:
* 1. 当 `identifier` 是 ConversationNewReceivedUnreadMessageButton, 代表在会话中新收到的未读消息的数量;
* 2. 当 `identifier` 是 ConversationUnreadMessageButton, 代表会话中的未读消息数量;
* 3. 当 `identifier` 是 ConversationUnreadMentionedMessageButton, 代表当前@自己的未读消息的数量;
*```
*/
data: number = 0;
/**
* 会话页面ViewModel,用来执行后续的事件
*
*```
* 与 `ConversationContentComponentConfig` 的 identifier` 参数具备对应关系,使用说明如下:
* 1. 当 `identifier` 是 ConversationNewReceivedUnreadMessageButton, 调用 `onClickNewReceivedUnreadMessageButton` 执行新收到未读消息的点击事件;
* 2. 当 `identifier` 是 ConversationUnreadMessageButton,调用 `onClickUnreadMessageButton` 执行未读消息的点击事件;
* 3. 当 `identifier` 是 ConversationUnreadMentionedMessageButton, 调用 `onClickUnreadMentionedMessageButton` 执行未读@我的消息的点击事件;
*```
*
*/
conversationViewModel: IConversationViewModel | undefined
}
// ConversationViewModel的能力接口
export interface IConversationViewModel {
/**
* 进入会话时展示的未读消息的组件点击事件
*/
onClickUnreadMessageButton(): void;
/**
* 进入会话时展示的未读@我的消息的组件点击事件
*/
onClickUnreadMentionedMessageButton(): void;
/**
* 在进入会话后收到未读新消息的组件点击事件
*/
onClickNewReceivedUnreadMessageButton(): void;
}
以下展示了进入会话后收到未读新消息的组件的自定义示例:
- 使用
alignRules
控制在屏幕中的位置。 - 使用
ConversationContentComponentData#data
观察未读消息数,具体描述见注释。 - 使用
ConversationContentComponentData#conversationViewModel
暴露会话页面能力,用来开发者处理点击事件,具体描述见注释。
@Builder
export function buildCustomConversationTopUnreadMessageButton(data: ConversationContentComponentData) {
CustomConversationTopUnreadMessageButton({ context: data.context, convId: data.convId, unreadMessageCount: data.data, viewModel:data.conversationViewModel })
}
@Component
export struct CustomConversationTopUnreadMessageButton {
@Prop context: Context;
@Prop convId: ConversationIdentifier;
@Prop unreadMessageCount: number;
@Prop viewModel: IConversationViewModel;
build() {
if (this.unreadMessageCount > 10) {
Row() {
Image($r('app.media.rc_arrow')).width(12).height(9).objectFit(ImageFit.Contain)
Text((this.unreadMessageCount > 99 ? "99+" : this.unreadMessageCount) + "条新消息")
.fontSize(14)
.fontColor($r('app.color.rc_color_111F2C'))
.margin({ left: 6 })
}
.borderRadius({ topLeft: 24, bottomLeft: 24 })
.height(48)
.padding({ left: 10, right: 10 })
.backgroundColor($r('app.color.rc_color_FFFFFF'))
.alignRules({
center: { anchor: "__container__", align: VerticalAlign.Center },
right: { anchor: "__container__", align: HorizontalAlign.End }
})
.margin({ top: 14 })
.onClick(() => {
this.viewModel.onClickUnreadMessageButton()
})
}
}
}
// 设置UI组件
let ConversationUnreadMessageButton: ConversationContentComponentConfig = {
identifier: ComponentIdentifier.ConversationUnreadMessageButton,
component: wrapBuilder(buildCustomConversationTopUnreadMessageButton),
}
RongIM.getInstance().conversationService().setConversationContentComponentConfig(ConversationUnreadMessageButton)
进入会话后收到未读新消息的组件、顶部未读@我的消息的组件设置如下
// 自定义收到新的未读消息的UI组件
let ConversationNewReceivedUnreadMessageButton: ConversationContentComponentConfig = {
identifier: ComponentIdentifier.ConversationNewReceivedUnreadMessageButton,
component: wrapBuilder(buildCustomConversationBottomUnreadMessageButton),
}
RongIM.getInstance().conversationService().setConversationContentComponentConfig(ConversationNewReceivedUnreadMessageButton)
// 自定义顶部未读@我的消息的UI组件
let ConversationUnreadMentionedMessageButton: ConversationContentComponentConfig = {
identifier: ComponentIdentifier.ConversationUnreadMentionedMessageButton,
component: wrapBuilder(buildCustomConversationTopUnreadMentionedMessageButton),
}
RongIM.getInstance().conversationService().setConversationContentComponentConfig(ConversationUnreadMentionedMessageButton)
增加 + 号扩展栏插件
内置插件说明
IMKit 内置插件列表如下所示。其中位置插件 SDK 仅定义,实际需要 App 侧来实现。
插件 | 插件名称 | 说明 |
---|---|---|
图片插件 | ImagePlugin | ImagePluginName "RC:ImagePlugin" |