1:添加Cp动画,需调试

This commit is contained in:
2025-11-22 18:55:17 +08:00
parent 2a6d2e4709
commit a125d8d9b4
7 changed files with 271 additions and 32 deletions

View File

@@ -104,6 +104,8 @@ public class RoomMessageEvent extends BaseEvent {
private SingerInfo.SongInfo song_info; private SingerInfo.SongInfo song_info;
private SingerInfo.SongInfo next_song_info; private SingerInfo.SongInfo next_song_info;
private String rights_icon;//Cp特效
} }

View File

@@ -132,6 +132,7 @@ public class EMMessageInfo implements MultiItemEntity {
///房间内换麦 ///房间内换麦
public static final int QXRoomMessageTypehm = 1039; public static final int QXRoomMessageTypehm = 1039;
public static final int QXRoomMessageTypeCPText = 1080;//CP特效进入房间的特效

View File

@@ -28,6 +28,7 @@ import android.view.KeyEvent
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.MotionEvent import android.view.MotionEvent
import android.view.View import android.view.View
import android.view.View.GONE
import android.view.ViewGroup import android.view.ViewGroup
import android.view.WindowManager import android.view.WindowManager
import android.view.animation.Animation import android.view.animation.Animation
@@ -49,6 +50,7 @@ import com.alibaba.android.arouter.facade.annotation.Autowired
import com.alibaba.android.arouter.facade.annotation.Route import com.alibaba.android.arouter.facade.annotation.Route
import com.alibaba.android.arouter.launcher.ARouter import com.alibaba.android.arouter.launcher.ARouter
import com.blankj.utilcode.util.ActivityUtils import com.blankj.utilcode.util.ActivityUtils
import com.blankj.utilcode.util.FileUtils
import com.blankj.utilcode.util.GsonUtils import com.blankj.utilcode.util.GsonUtils
import com.blankj.utilcode.util.LogUtils import com.blankj.utilcode.util.LogUtils
import com.blankj.utilcode.util.ThreadUtils import com.blankj.utilcode.util.ThreadUtils
@@ -64,6 +66,9 @@ import com.tencent.imsdk.v2.V2TIMManager
import com.tencent.imsdk.v2.V2TIMSDKListener import com.tencent.imsdk.v2.V2TIMSDKListener
import com.tencent.imsdk.v2.V2TIMUserFullInfo import com.tencent.imsdk.v2.V2TIMUserFullInfo
import com.tencent.imsdk.v2.V2TIMValueCallback import com.tencent.imsdk.v2.V2TIMValueCallback
import com.tencent.qgame.animplayer.AnimConfig
import com.tencent.qgame.animplayer.AnimView
import com.tencent.qgame.animplayer.inter.IAnimListener
import com.xscm.modulemain.BaseMvpActivity import com.xscm.modulemain.BaseMvpActivity
import com.xscm.modulemain.R import com.xscm.modulemain.R
import com.xscm.modulemain.activity.main.activity.MainActivity import com.xscm.modulemain.activity.main.activity.MainActivity
@@ -102,6 +107,7 @@ import com.xscm.moduleutil.adapter.LikeUserAdapter
import com.xscm.moduleutil.base.AppStateListener import com.xscm.moduleutil.base.AppStateListener
import com.xscm.moduleutil.base.AppStateManager import com.xscm.moduleutil.base.AppStateManager
import com.xscm.moduleutil.base.CommonAppContext import com.xscm.moduleutil.base.CommonAppContext
import com.xscm.moduleutil.base.CommonAppContext.post
import com.xscm.moduleutil.bean.GiftBean import com.xscm.moduleutil.bean.GiftBean
import com.xscm.moduleutil.bean.HeadlineBean import com.xscm.moduleutil.bean.HeadlineBean
import com.xscm.moduleutil.bean.MqttXlhEnd import com.xscm.moduleutil.bean.MqttXlhEnd
@@ -166,6 +172,7 @@ import com.xscm.moduleutil.utils.SystemUtils
import com.xscm.moduleutil.utils.roomview.GiftDisplayManager import com.xscm.moduleutil.utils.roomview.GiftDisplayManager
import com.xscm.moduleutil.widget.CircularProgressView import com.xscm.moduleutil.widget.CircularProgressView
import com.xscm.moduleutil.widget.CustomMusicFloatingView import com.xscm.moduleutil.widget.CustomMusicFloatingView
import com.xscm.moduleutil.widget.GiftAnimView
import com.xscm.moduleutil.widget.QXGiftPlayerManager import com.xscm.moduleutil.widget.QXGiftPlayerManager
import com.xscm.moduleutil.widget.RoomKtvWheatView import com.xscm.moduleutil.widget.RoomKtvWheatView
import com.xscm.moduleutil.widget.SilentCountDownTimer import com.xscm.moduleutil.widget.SilentCountDownTimer
@@ -177,12 +184,20 @@ import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable import io.reactivex.disposables.Disposable
import io.reactivex.schedulers.Schedulers import io.reactivex.schedulers.Schedulers
import okhttp3.Call
import okhttp3.Callback
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode import org.greenrobot.eventbus.ThreadMode
import pub.devrel.easypermissions.AppSettingsDialog import pub.devrel.easypermissions.AppSettingsDialog
import pub.devrel.easypermissions.EasyPermissions import pub.devrel.easypermissions.EasyPermissions
import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks
import java.io.File
import java.io.FileOutputStream
import java.io.IOException
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
import java.nio.charset.StandardCharsets import java.nio.charset.StandardCharsets
import java.util.Arrays import java.util.Arrays
@@ -1374,7 +1389,7 @@ class RoomActivity : BaseMvpActivity<RoomPresenter?, ActivityRoomBinding?>(),
handleMsgType1054(messageEvent, text) handleMsgType1054(messageEvent, text)
} else if (msgType == EMMessageInfo.QXRoomMessageTypeHeartDid) { } else if (msgType == EMMessageInfo.QXRoomMessageTypeHeartDid) {
handleMsgType1055(messageEvent) handleMsgType1055(messageEvent)
} else if (msgType == EMMessageInfo.QXRoomMessageTypeRoomDress) { } else if (msgType == EMMessageInfo.QXRoomMessageTypeRoomDress) {//用户修改装扮
handleMsgType1035(messageEvent, text) handleMsgType1035(messageEvent, text)
} else if (msgType == EMMessageInfo.QXRoomMessageTypeRoomPKAgreeOrRefuse } else if (msgType == EMMessageInfo.QXRoomMessageTypeRoomPKAgreeOrRefuse
|| msgType == EMMessageInfo.QXRoomMessageTypeRoomPKStart || msgType == EMMessageInfo.QXRoomMessageTypeRoomPKStart
@@ -1473,11 +1488,154 @@ class RoomActivity : BaseMvpActivity<RoomPresenter?, ActivityRoomBinding?>(),
if (mRoomInfoResp != null && mRoomInfoResp!!.room_info != null) { if (mRoomInfoResp != null && mRoomInfoResp!!.room_info != null) {
roomFragment!!.handleRoomMessage(messageEvent) roomFragment!!.handleRoomMessage(messageEvent)
} }
}else if(msgType == EMMessageInfo.QXRoomMessageTypeCPText){
if(messageEvent.text.rights_icon.isNotEmpty()){
mBinding?.roomCpView?.fl!!.visibility = View.VISIBLE
ImageUtils.loadHead(messageEvent.text.fromUserInfo.avatar, mBinding?.roomCpView?.roomCpHead1)
mBinding?.roomCpView?.roomCpName1?.text = messageEvent.text.fromUserInfo.nickname
mBinding?.roomCpView?.roomCpName2?.text = messageEvent.text.toUserInfo.nickname
ImageUtils.loadHead(messageEvent.text.toUserInfo.avatar, mBinding?.roomCpView?.roomCpHead2)
playVap(messageEvent.text.rights_icon, mBinding?.roomCpView?.animCp!!, true)
}
} }
} }
fun playVap(url: String, animView: AnimView, isTxk: Boolean) {
if (!FileUtils.isFileExists(this.cacheDir.absolutePath + url.substring(url.lastIndexOf("/")))) {
LogUtils.e("无缓存")
downloadAndPlay(this, url, object : GiftAnimView.DownloadCallback {
override fun onSuccess(file: File) {
post(Runnable {
animView.startPlay(file)
})
}
override fun onFailure(e: java.lang.Exception) {
LogUtils.e("MP4下载或播放失败: " + e.message)
}
})
} else {
LogUtils.e("有缓存")
if (isTxk) {
animView.setLoop(20)
}
animView.startPlay(
File(this.cacheDir.absolutePath + url.substring(url.lastIndexOf("/")))
)
}
//情侣特效播放回调
mBinding?.roomCpView?.animCp?.setAnimListener(object : IAnimListener {
override fun onFailed(errorType: Int, errorMsg: String?) {
}
override fun onVideoComplete() {
runOnUiThread {
//播放结束后隐藏
mBinding?.roomCpView?.fl.let { view ->
if (view?.visibility == View.VISIBLE) {
// 你的代码
view?.visibility = GONE
}
}
}
}
override fun onVideoDestroy() {
}
override fun onVideoRender(frameIndex: Int, config: AnimConfig?) {
}
override fun onVideoStart() {
}
})
}
fun downloadAndPlay(
context: Context,
playImage: String,
callback: GiftAnimView.DownloadCallback?
) {
val filePath = context.cacheDir.absolutePath + playImage.substring(playImage.lastIndexOf("/"))
val file = File(filePath)
if (!FileUtils.isFileExists(this.cacheDir.absolutePath + playImage.substring(playImage.lastIndexOf("/")))) {
LogUtils.e("无缓存")
// 使用OkHttp进行下载
val client = OkHttpClient()
val request = Request.Builder()
.url(playImage)
.build()
client.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
LogUtils.e("MP4下载失败: " + e.toString())
// 在主线程中回调失败
post(Runnable {
if (callback != null) {
callback.onFailure(e)
}
})
}
@Throws(IOException::class)
override fun onResponse(call: Call, response: Response) {
if (response.isSuccessful()) {
try {
response.body().use { responseBody ->
if (responseBody != null) {
val downloadedFile = File(filePath)
val fos = FileOutputStream(downloadedFile)
fos.write(responseBody.bytes())
fos.close()
// 在主线程中回调成功
post(Runnable {
if (callback != null) {
callback.onSuccess(downloadedFile)
}
})
} else {
// 在主线程中回调失败
post(Runnable {
if (callback != null) {
callback.onFailure(IOException("Response body is null"))
}
})
}
}
} catch (e: java.lang.Exception) {
LogUtils.e("MP4文件保存失败: " + e.message)
// 在主线程中回调失败
post(Runnable {
if (callback != null) {
callback.onFailure(e)
}
})
}
} else {
LogUtils.e("MP4下载响应失败")
// 在主线程中回调失败
post(Runnable {
if (callback != null) {
callback.onFailure(IOException("Response not successful: " + response.code()))
}
})
}
}
})
} else {
// 文件已存在,直接回调成功
if (callback != null) {
callback.onSuccess(file)
}
}
}
private var endTime: Long = 0 private var endTime: Long = 0
private fun xlhDjs(endTimeStr: String?) { private fun xlhDjs(endTimeStr: String?) {
@@ -2093,7 +2251,7 @@ class RoomActivity : BaseMvpActivity<RoomPresenter?, ActivityRoomBinding?>(),
val typeId = mRoomInfoResp!!.room_info.type_id val typeId = mRoomInfoResp!!.room_info.type_id
if ("2" == typeId) { if ("2" == typeId) {
roomFragment!!.handleRoomMessage(messageEvent) roomFragment!!.handleRoomMessage(messageEvent)
} else if ("1" == typeId || "4" == typeId || "3" == typeId || "8" == typeId) { } else if ("1" == typeId || "4" == typeId || "3" == typeId || "8" == typeId || "9" == typeId) {
val labelId = mRoomInfoResp!!.room_info.label_id val labelId = mRoomInfoResp!!.room_info.label_id
if ("2" == labelId) { if ("2" == labelId) {
roomFragment!!.handleRoomMessage(messageEvent) roomFragment!!.handleRoomMessage(messageEvent)

View File

@@ -547,6 +547,7 @@ public class ChatRoomFragment extends BaseMvpFragment<ChatRoomPresenter, RoomFra
case 1072: case 1072:
case 1071: case 1071:
case 125: case 125:
case 1080:
if (getActivity() instanceof RoomActivity) { if (getActivity() instanceof RoomActivity) {
((RoomActivity) getActivity()).roomInfoEvent(message); ((RoomActivity) getActivity()).roomInfoEvent(message);
} }

View File

@@ -906,9 +906,6 @@ public class RoomFragment extends BaseMvpFragment<RoomPresenter, FragmentRoomBin
// TODO: 2025/11/17 点唱房 // TODO: 2025/11/17 点唱房
private void handleJukeboxEvent(RoomMessageEvent messageEvent) { private void handleJukeboxEvent(RoomMessageEvent messageEvent) {
switch (messageEvent.getMsgType()) { switch (messageEvent.getMsgType()) {
case 1037:
// roomJukeboxFragment.event1037(messageEvent);
break;
case 1003: case 1003:
roomJukeboxFragment.event1003(messageEvent); roomJukeboxFragment.event1003(messageEvent);
break; break;
@@ -916,31 +913,16 @@ public class RoomFragment extends BaseMvpFragment<RoomPresenter, FragmentRoomBin
roomJukeboxFragment.event1004(messageEvent); roomJukeboxFragment.event1004(messageEvent);
break; break;
case 1005: case 1005:
// roomJukeboxFragment.event1005(messageEvent); roomJukeboxFragment.event1005(messageEvent);
break;
case 1015:
// roomJukeboxFragment.event1015(messageEvent);
break;
case 1030:
break;
case 1031:
// singSongFragment.event1031(messageEvent);
break;
case 1032:
// singSongFragment.event1032(messageEvent);
break;
case 1033:
// singSongFragment.event1033(messageEvent);
break; break;
case 1035: case 1035:
// singSongFragment.event1035(messageEvent); roomJukeboxFragment.event1035(messageEvent);
break; break;
case 1021: case 1021:
// singSongFragment.event1021(messageEvent); roomJukeboxFragment.event1021(messageEvent);
break; break;
case 1059: case 1059:
// singSongFragment.event1059(messageEvent); roomJukeboxFragment.event1059(messageEvent);
break; break;
case 1058: case 1058:
// singSongFragment.event1058(messageEvent); // singSongFragment.event1058(messageEvent);

View File

@@ -36,6 +36,7 @@ import com.xscm.moduleutil.rtc.AgoraManager;
import com.xscm.moduleutil.utils.ClickUtils; import com.xscm.moduleutil.utils.ClickUtils;
import com.xscm.moduleutil.utils.ImageUtils; import com.xscm.moduleutil.utils.ImageUtils;
import com.xscm.moduleutil.utils.SpUtil; import com.xscm.moduleutil.utils.SpUtil;
import com.xscm.moduleutil.widget.RoomFriendshipWheatView;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -259,6 +260,7 @@ public class RoomJukeboxFragment extends BaseMvpFragment<JukeboxPresenter, Fragm
// 设置弹出视图中的点击事件 // 设置弹出视图中的点击事件
setPopupMenuClickListener(popupView, null); setPopupMenuClickListener(popupView, null);
} }
private void showPopupMenu(View anchorView) { private void showPopupMenu(View anchorView) {
if (popupWindow != null && !popupWindow.isShowing()) { if (popupWindow != null && !popupWindow.isShowing()) {
// 获取锚点视图的坐标 // 获取锚点视图的坐标
@@ -408,7 +410,7 @@ public class RoomJukeboxFragment extends BaseMvpFragment<JukeboxPresenter, Fragm
} }
String userId = String.valueOf(roomInfoResp.getSinger_info().getSong_info().getSinger_user_id()); String userId = String.valueOf(roomInfoResp.getSinger_info().getSong_info().getSinger_user_id());
if (userId.equals(SpUtil.getUserId()+"")){ if (userId.equals(SpUtil.getUserId() + "")) {
upMike(true); upMike(true);
} }
if (mBinding.wvZc.getUserId().equals(userId)) { if (mBinding.wvZc.getUserId().equals(userId)) {
@@ -435,7 +437,7 @@ public class RoomJukeboxFragment extends BaseMvpFragment<JukeboxPresenter, Fragm
} }
} }
if (mBinding.wvZc.getUserId()!=null && !mBinding.wvZc.getUserId().equals("0") && !mBinding.wvZc.getUserId().equals("") && mBinding.wvZc.getUserId().equals(SpUtil.getUserId()+"")) { if (mBinding.wvZc.getUserId() != null && !mBinding.wvZc.getUserId().equals("0") && !mBinding.wvZc.getUserId().equals("") && mBinding.wvZc.getUserId().equals(SpUtil.getUserId() + "")) {
mBinding.imQg.setVisibility(VISIBLE); mBinding.imQg.setVisibility(VISIBLE);
} }
} }
@@ -612,7 +614,7 @@ public class RoomJukeboxFragment extends BaseMvpFragment<JukeboxPresenter, Fragm
temp.setCharm(""); temp.setCharm("");
temp.setDress(""); temp.setDress("");
dataList.set(fromIndex, temp); dataList.set(fromIndex, temp);
adapter.notifyDataSetChanged(); adapter.notifyItemChanged(fromIndex);
return; return;
} }
@@ -635,7 +637,8 @@ public class RoomJukeboxFragment extends BaseMvpFragment<JukeboxPresenter, Fragm
// 更新数据并通知适配器 // 更新数据并通知适配器
adapter.getData().clear(); adapter.getData().clear();
adapter.getData().addAll(dataList); adapter.getData().addAll(dataList);
adapter.notifyDataSetChanged(); adapter.notifyItemChanged(fromIndex);
adapter.notifyItemChanged(toIndex);
} }
/** /**
@@ -659,7 +662,7 @@ public class RoomJukeboxFragment extends BaseMvpFragment<JukeboxPresenter, Fragm
ImageUtils.loadHead(messageEvent.getText().getNext_song_info().getSinger_avatar(), mBinding.ciGsAva); ImageUtils.loadHead(messageEvent.getText().getNext_song_info().getSinger_avatar(), mBinding.ciGsAva);
mBinding.tvGsName.setText(messageEvent.getText().getNext_song_info().getSinger_nickname()); mBinding.tvGsName.setText(messageEvent.getText().getNext_song_info().getSinger_nickname());
roomInfoResp.getSinger_info().setNext_song_info(messageEvent.getText().getNext_song_info()); roomInfoResp.getSinger_info().setNext_song_info(messageEvent.getText().getNext_song_info());
}else { } else {
mBinding.guestContainer.setVisibility(View.GONE); mBinding.guestContainer.setVisibility(View.GONE);
} }
} }
@@ -682,7 +685,7 @@ public class RoomJukeboxFragment extends BaseMvpFragment<JukeboxPresenter, Fragm
mBinding.tvNetName.setText("老板"); mBinding.tvNetName.setText("老板");
songId = messageEvent.getText().getSong_info().getId(); songId = messageEvent.getText().getSong_info().getId();
String userId = String.valueOf(messageEvent.getText().getSong_info().getSinger_user_id()); String userId = String.valueOf(messageEvent.getText().getSong_info().getSinger_user_id());
if (userId.equals(SpUtil.getUserId()+"")){ if (userId.equals(SpUtil.getUserId() + "")) {
upMike(true); upMike(true);
} }
@@ -699,7 +702,7 @@ public class RoomJukeboxFragment extends BaseMvpFragment<JukeboxPresenter, Fragm
} }
adapter.notifyDataSetChanged(); adapter.notifyDataSetChanged();
} }
}else { } else {
setUserAvaSize(32); setUserAvaSize(32);
mBinding.ciUserAva.setImageResource(R.mipmap.microphone); mBinding.ciUserAva.setImageResource(R.mipmap.microphone);
mBinding.tvPerformerName.setVisibility(VISIBLE); mBinding.tvPerformerName.setVisibility(VISIBLE);
@@ -720,10 +723,95 @@ public class RoomJukeboxFragment extends BaseMvpFragment<JukeboxPresenter, Fragm
} }
// TODO: 2025/11/22 当在演唱位的时候,显示麦克风,当上麦的时候,也展示麦克风, // TODO: 2025/11/22 当在演唱位的时候,显示麦克风,当上麦的时候,也展示麦克风,
private void upMike(boolean isBool){ private void upMike(boolean isBool) {
if (getActivity() != null) { if (getActivity() != null) {
// 假设Activity有获取麦位数据的方法 // 假设Activity有获取麦位数据的方法
((RoomActivity) getActivity()).setrlMic(isBool); ((RoomActivity) getActivity()).setrlMic(isBool);
} }
} }
public void event1035(RoomMessageEvent message) {
List<RoomPitBean> dataList = adapter.getData();
if (mBinding.wvZc.getUserId().equals(message.getText().getFromUserInfo().getUser_id() + "")) {
RoomPitBean roomPitBean = mBinding.wvZc.pitBean;
roomPitBean.setNickname(message.getText().getFromUserInfo().getNickname());
roomPitBean.setDress(message.getText().getFromUserInfo().getDress());
roomPitBean.setAvatar(message.getText().getFromUserInfo().getAvatar());
mBinding.wvZc.setData(roomPitBean);
}
for (int i = 0; i < dataList.size(); i++) {
RoomPitBean roomPitBean2 = dataList.get(i);
if (roomPitBean2.getUser_id().equals(message.getText().getFromUserInfo().getUser_id() + "")) {
dataList.set(i, roomPitBean);
adapter.notifyItemChanged(i);
}
}
}
public void event1021(RoomMessageEvent messageEvent) {
if (mBinding.wvZc.pitBean != null) {
mBinding.wvZc.setCharm("0");
}
List<RoomPitBean> dataList = adapter.getData();
for (int i = 0; i < dataList.size(); i++) {
RoomPitBean roomPitBean2 = dataList.get(i);
roomPitBean2.setCharm("0");
adapter.notifyItemChanged(adapter.getData().indexOf(roomPitBean2));
}
}
/// 1005
public void event1005(RoomMessageEvent message) {
// 检查是否有多个用户信息
if (message.getText().getToUserInfos() != null && !message.getText().getToUserInfos().isEmpty()) {
// 处理多个用户的情况
for (UserInfo userOnlineStatusBean : message.getText().getToUserInfos()) {
updateCharmForUser(userOnlineStatusBean);
}
} else {
// 处理单个用户的情况
UserInfo toUserInfo = message.getText().getToUserInfo();
if (toUserInfo != null) {
updateCharmForUser(toUserInfo);
}
}
}
/**
* 更新单个用户的魅力值
*
* @param userInfo 用户信息
*/
private void updateCharmForUser(UserInfo userInfo) {
String userId = String.valueOf(userInfo.getUser_id());
String charm = userInfo.getCharm();
if (mBinding.wvZc.getUserId()!=null && mBinding.wvZc.getUserId().equals(userId)) {
mBinding.wvZc.setCharm(charm);
}
// 更新麦位列表中的魅力值
for (RoomPitBean pitBean : adapter.getData()) {
if (pitBean.getUser_id().equals(userId))
pitBean.setCharm(charm);
adapter.notifyItemChanged(adapter.getData().indexOf(pitBean));
}
}
// TODO: 2025/11/22 清除个人魅力
public void event1059(RoomMessageEvent message) {
String userId = message.getText().getUser_id();
if (mBinding.wvZc.getUserId()!=null &&mBinding.wvZc.getUserId().equals(userId)) {
mBinding.wvZc.setCharm("0");
}
List<RoomPitBean> dataList = adapter.getData();
for (int i = 0; i < dataList.size(); i++) {
RoomPitBean roomPitBean2 = dataList.get(i);
if (roomPitBean2.getUser_id().equals(userId))
roomPitBean2.setCharm("0");
adapter.notifyItemChanged(adapter.getData().indexOf(roomPitBean2));
}
}
} }

View File

@@ -143,6 +143,13 @@
android:elevation="2dp" android:elevation="2dp"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<include
android:id="@+id/room_cp_view"
layout="@layout/room_cp_vip_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone" />
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/main_content_container" android:id="@+id/main_content_container"