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 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 QXRoomMessageTypeCPText = 1080;//CP特效进入房间的特效

View File

@@ -28,6 +28,7 @@ import android.view.KeyEvent
import android.view.LayoutInflater
import android.view.MotionEvent
import android.view.View
import android.view.View.GONE
import android.view.ViewGroup
import android.view.WindowManager
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.launcher.ARouter
import com.blankj.utilcode.util.ActivityUtils
import com.blankj.utilcode.util.FileUtils
import com.blankj.utilcode.util.GsonUtils
import com.blankj.utilcode.util.LogUtils
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.V2TIMUserFullInfo
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.R
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.AppStateManager
import com.xscm.moduleutil.base.CommonAppContext
import com.xscm.moduleutil.base.CommonAppContext.post
import com.xscm.moduleutil.bean.GiftBean
import com.xscm.moduleutil.bean.HeadlineBean
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.widget.CircularProgressView
import com.xscm.moduleutil.widget.CustomMusicFloatingView
import com.xscm.moduleutil.widget.GiftAnimView
import com.xscm.moduleutil.widget.QXGiftPlayerManager
import com.xscm.moduleutil.widget.RoomKtvWheatView
import com.xscm.moduleutil.widget.SilentCountDownTimer
@@ -177,12 +184,20 @@ import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
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.Subscribe
import org.greenrobot.eventbus.ThreadMode
import pub.devrel.easypermissions.AppSettingsDialog
import pub.devrel.easypermissions.EasyPermissions
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.nio.charset.StandardCharsets
import java.util.Arrays
@@ -1374,7 +1389,7 @@ class RoomActivity : BaseMvpActivity<RoomPresenter?, ActivityRoomBinding?>(),
handleMsgType1054(messageEvent, text)
} else if (msgType == EMMessageInfo.QXRoomMessageTypeHeartDid) {
handleMsgType1055(messageEvent)
} else if (msgType == EMMessageInfo.QXRoomMessageTypeRoomDress) {
} else if (msgType == EMMessageInfo.QXRoomMessageTypeRoomDress) {//用户修改装扮
handleMsgType1035(messageEvent, text)
} else if (msgType == EMMessageInfo.QXRoomMessageTypeRoomPKAgreeOrRefuse
|| msgType == EMMessageInfo.QXRoomMessageTypeRoomPKStart
@@ -1473,11 +1488,154 @@ class RoomActivity : BaseMvpActivity<RoomPresenter?, ActivityRoomBinding?>(),
if (mRoomInfoResp != null && mRoomInfoResp!!.room_info != null) {
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 fun xlhDjs(endTimeStr: String?) {
@@ -2093,7 +2251,7 @@ class RoomActivity : BaseMvpActivity<RoomPresenter?, ActivityRoomBinding?>(),
val typeId = mRoomInfoResp!!.room_info.type_id
if ("2" == typeId) {
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
if ("2" == labelId) {
roomFragment!!.handleRoomMessage(messageEvent)

View File

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

View File

@@ -906,9 +906,6 @@ public class RoomFragment extends BaseMvpFragment<RoomPresenter, FragmentRoomBin
// TODO: 2025/11/17 点唱房
private void handleJukeboxEvent(RoomMessageEvent messageEvent) {
switch (messageEvent.getMsgType()) {
case 1037:
// roomJukeboxFragment.event1037(messageEvent);
break;
case 1003:
roomJukeboxFragment.event1003(messageEvent);
break;
@@ -916,31 +913,16 @@ public class RoomFragment extends BaseMvpFragment<RoomPresenter, FragmentRoomBin
roomJukeboxFragment.event1004(messageEvent);
break;
case 1005:
// 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);
roomJukeboxFragment.event1005(messageEvent);
break;
case 1035:
// singSongFragment.event1035(messageEvent);
roomJukeboxFragment.event1035(messageEvent);
break;
case 1021:
// singSongFragment.event1021(messageEvent);
roomJukeboxFragment.event1021(messageEvent);
break;
case 1059:
// singSongFragment.event1059(messageEvent);
roomJukeboxFragment.event1059(messageEvent);
break;
case 1058:
// 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.ImageUtils;
import com.xscm.moduleutil.utils.SpUtil;
import com.xscm.moduleutil.widget.RoomFriendshipWheatView;
import java.util.ArrayList;
import java.util.List;
@@ -259,6 +260,7 @@ public class RoomJukeboxFragment extends BaseMvpFragment<JukeboxPresenter, Fragm
// 设置弹出视图中的点击事件
setPopupMenuClickListener(popupView, null);
}
private void showPopupMenu(View anchorView) {
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());
if (userId.equals(SpUtil.getUserId()+"")){
if (userId.equals(SpUtil.getUserId() + "")) {
upMike(true);
}
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);
}
}
@@ -612,7 +614,7 @@ public class RoomJukeboxFragment extends BaseMvpFragment<JukeboxPresenter, Fragm
temp.setCharm("");
temp.setDress("");
dataList.set(fromIndex, temp);
adapter.notifyDataSetChanged();
adapter.notifyItemChanged(fromIndex);
return;
}
@@ -635,7 +637,8 @@ public class RoomJukeboxFragment extends BaseMvpFragment<JukeboxPresenter, Fragm
// 更新数据并通知适配器
adapter.getData().clear();
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);
mBinding.tvGsName.setText(messageEvent.getText().getNext_song_info().getSinger_nickname());
roomInfoResp.getSinger_info().setNext_song_info(messageEvent.getText().getNext_song_info());
}else {
} else {
mBinding.guestContainer.setVisibility(View.GONE);
}
}
@@ -682,7 +685,7 @@ public class RoomJukeboxFragment extends BaseMvpFragment<JukeboxPresenter, Fragm
mBinding.tvNetName.setText("老板");
songId = messageEvent.getText().getSong_info().getId();
String userId = String.valueOf(messageEvent.getText().getSong_info().getSinger_user_id());
if (userId.equals(SpUtil.getUserId()+"")){
if (userId.equals(SpUtil.getUserId() + "")) {
upMike(true);
}
@@ -699,7 +702,7 @@ public class RoomJukeboxFragment extends BaseMvpFragment<JukeboxPresenter, Fragm
}
adapter.notifyDataSetChanged();
}
}else {
} else {
setUserAvaSize(32);
mBinding.ciUserAva.setImageResource(R.mipmap.microphone);
mBinding.tvPerformerName.setVisibility(VISIBLE);
@@ -720,10 +723,95 @@ public class RoomJukeboxFragment extends BaseMvpFragment<JukeboxPresenter, Fragm
}
// TODO: 2025/11/22 当在演唱位的时候,显示麦克风,当上麦的时候,也展示麦克风,
private void upMike(boolean isBool){
private void upMike(boolean isBool) {
if (getActivity() != null) {
// 假设Activity有获取麦位数据的方法
((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"
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
android:id="@+id/main_content_container"