保利威文档中心

幫助中心

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 初始化資料方法

PLVLSChatroomLayoutinit 方法是對外 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,用 presenterviewmode 隔離開來,一切業務邏輯都是透過 presenter 來進行操作,也就是說 presenter 是視圖與資料的橋樑,視圖和資料相隔兩端。

联系客服,在线咨询