From 1c4384f5d574bc3b40d0ef6b49f09125674344c7 Mon Sep 17 00:00:00 2001 From: lzl <1239365383@qq.com> Date: Wed, 7 Jan 2026 18:03:16 +0800 Subject: [PATCH] =?UTF-8?q?=E9=85=92=E5=90=A7=20=E5=AE=9A=E6=97=B6?= =?UTF-8?q?=E5=99=A8=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xscm/moduleutil/widget/BaseWheatView.java | 10 +++ .../activity/room/fragment/RoomPubFragment.kt | 76 ++++++++++++++++++- .../xscm/modulemain/utils/CountdownTimer.kt | 19 +++++ .../modulemain/widget/RoomPubWheatView.kt | 4 +- 4 files changed, 106 insertions(+), 3 deletions(-) diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/widget/BaseWheatView.java b/BaseModule/src/main/java/com/xscm/moduleutil/widget/BaseWheatView.java index 49b26e1d..756fea8c 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/widget/BaseWheatView.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/widget/BaseWheatView.java @@ -435,6 +435,16 @@ public abstract class BaseWheatView extends ConstraintLayout implements IBaseWhe } } + public void setTime(String time) { + if (TextUtils.isEmpty(time)) { + tvTime.setText(""); + tvTime.setVisibility(View.INVISIBLE); + } else { + tvTime.setText(time); + tvTime.setVisibility(View.VISIBLE); + } + } + public void setOnlineStatus() { if (pitBean.getUser_id() != null && !pitBean.getUser_id().equals("0") && !pitBean.getUser_id().isEmpty()) { if (pitBean.getIs_online() == 1) { diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/RoomPubFragment.kt b/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/RoomPubFragment.kt index 763bdff3..2aa0c690 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/RoomPubFragment.kt +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/RoomPubFragment.kt @@ -1,6 +1,8 @@ package com.xscm.modulemain.activity.room.fragment import android.os.Bundle +import android.text.TextUtils +import android.view.View import com.blankj.utilcode.util.ActivityUtils import com.blankj.utilcode.util.LogUtils import com.xscm.modulemain.R @@ -15,6 +17,7 @@ import com.xscm.modulemain.dialog.barRoom.RoomAboutDialog import com.xscm.modulemain.dialog.barRoom.RoomDurationDialog import com.xscm.modulemain.dialog.barRoom.SetupCustomGiftDialog import com.xscm.modulemain.dialog.barRoom.WishGiftDialog +import com.xscm.modulemain.utils.CountdownTimer import com.xscm.modulemain.widget.RoomPubWheatView import com.xscm.moduleutil.base.BaseMvpFragment import com.xscm.moduleutil.base.CommonAppContext @@ -24,6 +27,11 @@ import com.xscm.moduleutil.bean.room.RoomInfoResp import com.xscm.moduleutil.bean.room.RoomUserBean import com.xscm.moduleutil.utils.ClickUtils import com.xscm.moduleutil.utils.SpUtil +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.cancel +import kotlinx.coroutines.launch /** * @Author @@ -58,6 +66,41 @@ class RoomPubFragment(var mRoomInfoResp: RoomInfoResp?) : private val indexList: MutableList = mutableListOf("9", "10", "1", "2", "3", "4", "5", "6") + + private val timer = CountdownTimer() + private val scope = CoroutineScope(Dispatchers.Main + SupervisorJob()) + + + // 在需要开始计时的地方调用 + private fun startTimer(milliseconds: Long) { + LogUtils.e("startTimer: $milliseconds") + // 启动计时器 + timer.startCountdown(milliseconds, scope) + // 观察时间变化 + scope.launch { + timer.timeLeft.collect { time -> + viewList.forEach { it -> + if (it.pitNumber != "9" && it.pitNumber != "10") { + if (!TextUtils.isEmpty(it.pitBean.user_id) && !it.pitBean.user_id.equals("0")) { + val time = + it.pitBean.end_time.toLong() * 1000 - System.currentTimeMillis() + if (time <= 0) { + it.setTime("00:00") + } else { + it.setTime(timer.formatTime2(time)) + } + } + } + } + } + } + } + + private fun stopTimer() { + timer.stop() + } + + override fun initData() { } @@ -80,6 +123,12 @@ class RoomPubFragment(var mRoomInfoResp: RoomInfoResp?) : val bean = mRoomInfoResp?.room_info?.pit_list!![indexList[idx].toInt() - 1] view.setData(bean) + if (idx != 0 && idx != 1) { + if (!TextUtils.isEmpty(bean.user_id) && !bean.user_id.equals("0")) { + startTimer(bean.end_time.toLong()) + } + } + view.iv_custom_gift?.setOnClickListener { GiftGivingDialog( ActivityUtils.getTopActivity(), @@ -145,7 +194,7 @@ class RoomPubFragment(var mRoomInfoResp: RoomInfoResp?) : } else { if (view.pitBean.user_id == "0" || view.pitBean.user_id.isEmpty()) { // TODO: 这是展示设置心愿礼物的,这里有个点,要考虑,当前用户在麦位上,点击的时候,直接走上麦按钮,如果不在麦上,就直接选择心愿礼物 - WishGiftDialog(ActivityUtils.getTopActivity(),mRoomId).show() + WishGiftDialog(ActivityUtils.getTopActivity(), mRoomId).show() // MvpPre!!.applyPit(mRoomInfoResp?.room_info?.room_id!!, view.pitNumber) } else { RoomUserInfoFragment.show( @@ -223,8 +272,10 @@ class RoomPubFragment(var mRoomInfoResp: RoomInfoResp?) : if (indexList.contains(pitNumber)) { val viewPos = indexList.indexOf(pitNumber) val pitBean = mRoomInfoResp?.room_info?.pit_list!![pitNumber.toInt() - 1] + pitBean.end_time = messageEvent.text.end_time viewList[viewPos].setData(pitBean) } + startTimer(messageEvent.text.end_time.toLong()) } fun event1004(messageEvent: RoomMessageEvent) { @@ -234,6 +285,17 @@ class RoomPubFragment(var mRoomInfoResp: RoomInfoResp?) : val pitBean = mRoomInfoResp?.room_info?.pit_list!![pitNumber.toInt() - 1] viewList[viewPos].setData(pitBean) } + var isMaiPit = false + viewList.forEach { it -> + if (it.pitNumber != "9" && it.pitNumber != "10") { + if (!TextUtils.isEmpty(it.pitBean.user_id) && !it.pitBean.user_id.equals("0")) { + isMaiPit = true + } + } + } + if (!isMaiPit) { + stopTimer() + } } fun event1035(messageEvent: RoomMessageEvent) { @@ -320,4 +382,16 @@ class RoomPubFragment(var mRoomInfoResp: RoomInfoResp?) : } } + + override fun onDestroyView() { + super.onDestroyView() + viewList.clear() + } + + // 在Fragment销毁时记得清理资源 + override fun onDestroy() { + super.onDestroy() + timer.stop() + scope.cancel() + } } \ No newline at end of file diff --git a/MainModule/src/main/java/com/xscm/modulemain/utils/CountdownTimer.kt b/MainModule/src/main/java/com/xscm/modulemain/utils/CountdownTimer.kt index 48607406..2b8dc01d 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/utils/CountdownTimer.kt +++ b/MainModule/src/main/java/com/xscm/modulemain/utils/CountdownTimer.kt @@ -52,5 +52,24 @@ class CountdownTimer { // 4. 格式化:HH/MM/SS 均补0为2位(如 1小时1分5秒 → 01:01:05) return String.format("%02d:%02d:%02d", hours, minutes, seconds) } + + /** + * 将毫秒数格式化为 MM:SS 格式的时间字符串 + * @param milliseconds 毫秒数(支持 0、负数、超大数值) + * @return 格式化结果,如 3670000 毫秒 → 01:01:10,125000 毫秒 → 00:02:05 + */ + fun formatTime2(milliseconds: Long): String { + // 1. 处理负数/0:转为非负,避免时间为负 + val nonNegativeMs = if (milliseconds < 0) 0 else milliseconds + // 2. 计算总秒数(向下取整,不足1秒按0算) + val totalSeconds = (nonNegativeMs / 1000).toInt() + // 3. 拆分 小时、分钟、秒 + val hours = totalSeconds / 3600 // 1小时=3600秒 + val remainingSecondsAfterHour = totalSeconds % 3600 // 小时剩余秒数 + val minutes = remainingSecondsAfterHour / 60 // 分钟 + val seconds = remainingSecondsAfterHour % 60 // 秒 + // 4. 格式化:HH/MM/SS 均补0为2位(如 1小时1分5秒 → 01:01:05) + return String.format("%02d:%02d", minutes, seconds) + } } diff --git a/MainModule/src/main/java/com/xscm/modulemain/widget/RoomPubWheatView.kt b/MainModule/src/main/java/com/xscm/modulemain/widget/RoomPubWheatView.kt index e7d5c375..991ff271 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/widget/RoomPubWheatView.kt +++ b/MainModule/src/main/java/com/xscm/modulemain/widget/RoomPubWheatView.kt @@ -101,7 +101,7 @@ class RoomPubWheatView : BaseWheatView { } else -> { - tv_time?.visibility = View.GONE + tv_time?.visibility = View.INVISIBLE ll_bottom?.visibility = View.GONE iv_custom_gift?.visibility = View.GONE } @@ -134,7 +134,7 @@ class RoomPubWheatView : BaseWheatView { tv_time?.visibility = View.VISIBLE ll_bottom?.visibility = View.VISIBLE iv_custom_gift?.visibility = View.VISIBLE - tv_time?.text = "12:34" + tv_time?.text = "00:00" } if (TextUtils.isEmpty(bean.dress)) {