5_5-手机开播场景-聊天室
更新時間:2023-04-17 15:27:57
1 功能概述
聊天室模組包含發言、麥克風控制、攝影機控制等功能。聊天室模組在 UI、互動、功能上,相較於其他模組,會更複雜且更龐大。因此設計、建置、維護一個聊天室,也是一件較為耗時費力的事情。我們推薦直接使用保利威封裝好的聊天室模組,該部分程式碼完全開源,支援直接使用以及二次開發。
2 使用演示
聊天室在手機開播場景中對應的實作佈局為 PLVLSChatroomLayout,以下範例說明如何建立聊天室佈局以及初始化,程式碼如下:
// 聊天室布局
private IPLVLSChatroomLayout plvlsChatroomLy;
// findView
plvlsChatroomLy = findViewById(R.id.plvls_chatroom_ly);
// 初始化聊天室布局
plvlsChatroomLy.init(liveRoomDataManager);
上述方法的使用範例可以在 polyv demo 專案中的 PLVLSLiveStreamerActivity 找到。
3 接口介紹
手機開播場景下,針對聊天室佈局進行封裝的接口。定義了:
1、外部直接呼叫的方法 2、需要外部回應的事件監聽器
public interface IPLVLSChatroomLayout {
// <editor-fold defaultstate="collapsed" desc="1、外部直接调用的方法">
/**
* 初始化
*
* @param liveRoomDataManager 直播间数据管理器
*/
void init(IPLVLiveRoomDataManager liveRoomDataManager);
/**
* 设置view交互事件监听器
*
* @param listener 监听器
*/
void setOnViewActionListener(OnViewActionListener listener);
/**
* 添加聊天室在线人数变化监听器
*
* @param listener 监听器
*/
void addOnOnlineCountListener(IPLVOnDataChangedListener<Integer> listener);
/**
* 设置麦克风开关按钮状态
*
* @param isOpen true:打开,false:关闭
*/
void setOpenMicViewStatus(boolean isOpen);
/**
* 设置摄像头开关按钮状态
*
* @param isOpen true:打开,false:关闭
*/
void setOpenCameraViewStatus(boolean isOpen);
/**
* 设置前置摄像头按钮状态
*
* @param isFront true:前置,false:后置
*/
void setFrontCameraViewStatus(boolean isFront);
/**
* 改变聊天室布局可见性
*
* @param visibility 可见性
*/
void setVisibility(int visibility);
/**
* 是否拦截返回事件
*
* @return true:拦截,false:不拦截
*/
boolean onBackPressed();
/**
* 销毁,释放资源
*/
void destroy();
// </editor-fold>
// <editor-fold defaultstate="collapsed" desc="2、需要外部响应的事件监听器">
/**
* view交互事件监听器
*/
interface OnViewActionListener {
/**
* 麦克风控制
*
* @param isMute true:禁用,false:启用
*/
boolean onMicControl(boolean isMute);
/**
* 摄像头控制
*
* @param isMute true:禁用,false:启用
*/
boolean onCameraControl(boolean isMute);
/**
* 前置摄像头控制
*
* @param isFront true:前置,false:后置
*/
boolean onFrontCameraControl(boolean isFront);
}
// </editor-fold>
}
4、實作介紹
4.1 PLVLSChatroomLayout
該類別是手機開播場景下的聊天室佈局,實作 IPLVLSChatroomLayout 接口。
該佈局包含聊天資訊列表、傳送資訊輸入框、聊天室工具列佈局等相關的 UI。
下面會列舉介紹該佈局中涉及到的主要方法。
4.1.1 初始化 view 方法
PLVLSChatroomLayout 繼承於 FrameLayout,在建構子中使用 initView 方法對 view 進行了初始化處理。
public PLVLSChatroomLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView();
}
private void initView() {
//填充布局到该view中
LayoutInflater.from(getContext()).inflate(R.layout.plvls_chatroom_layout, this);
//findView
plvlsChatroomChatMsgLy = findViewById(R.id.plvls_chatroom_chat_msg_ly);
plvlsChatroomSwipeLoadView = findViewById(R.id.plvls_chatroom_swipe_load_view);
plvlsChatroomChatMsgRv = findViewById(R.id.plvls_chatroom_chat_msg_rv);
plvlsChatroomUnreadMsgTv = findViewById(R.id.plvls_chatroom_unread_msg_tv);
plvlsChatroomControlIv = findViewById(R.id.plvls_chatroom_control_iv);
plvlsChatroomToolbarMicControlIv = findViewById(R.id.plvls_chatroom_toolbar_mic_control_iv);
plvlsChatroomToolbarCameraControlIv = findViewById(R.id.plvls_chatroom_toolbar_camera_control_iv);
plvlsChatroomToolbarFrontCameraControlIv = findViewById(R.id.plvls_chatroom_toolbar_front_camera_control_iv);
plvlsChatroomToolbarOpenInputWindowTv = findViewById(R.id.plvls_chatroom_toolbar_open_input_window_tv);
//初始化按钮点击事件
plvlsChatroomControlIv.setOnClickListener(this);
plvlsChatroomToolbarMicControlIv.setOnClickListener(this);
plvlsChatroomToolbarCameraControlIv.setOnClickListener(this);
plvlsChatroomToolbarFrontCameraControlIv.setOnClickListener(this);
plvlsChatroomToolbarOpenInputWindowTv.setOnClickListener(this);
//初始化控件...
}
4.1.2 初始化資料方法
PLVLSChatroomLayout 的 init 方法是對外 API,需要外部傳入 IPLVLiveRoomDataManager 後進行初始化。
//聊天室presenter
private IPLVChatroomContract.IChatroomPresenter chatroomPresenter;
@Override
public void init(IPLVLiveRoomDataManager liveRoomDataManager) {
this.liveRoomDataManager = liveRoomDataManager;
//创建聊天室mvp-presenter
this.chatroomPresenter = new PLVChatroomPresenter(liveRoomDataManager);
//注册聊天室mvp-view
this.chatroomPresenter.registerView(chatroomView);
//初始化聊天室mvp-presenter
this.chatroomPresenter.init();
//请求一次历史记录
chatroomPresenter.requestChatHistory(chatroomPresenter.getViewIndex(chatroomView));
//初始化socket登录管理器
initSocketLoginManager();
}
//创建聊天室的mvp-view
private PLVAbsChatroomView chatroomView = new PLVAbsChatroomView() {
//...
}
這裡的 PLVChatroomPresenter 是使用 mvp 模式封裝的聊天室 presenter,用 presenter 將 view 和 mode 隔離開來,一切業務邏輯都是透過 presenter 來進行操作,也就是說 presenter 是視圖與資料的橋樑,視圖和資料相隔兩端。
