From 46b0a856fe584fbacb19de615b2f542b6fe53daf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A2=81=E5=B0=8F=E6=B1=9F?= <461355754@qq.com> Date: Thu, 4 Dec 2025 15:20:05 +0800 Subject: [PATCH] =?UTF-8?q?1=EF=BC=9A=E4=BF=AE=E6=94=B9=E5=AE=B6=E6=97=8F?= =?UTF-8?q?=E5=B1=95=E7=A4=BA=E7=BB=AD=E7=AD=BE=E6=8C=89=E9=92=AE=E4=BD=8D?= =?UTF-8?q?=E7=BD=AE=202=EF=BC=9A=E4=BF=AE=E6=94=B9=E8=B4=AD=E4=B9=B0?= =?UTF-8?q?=E7=88=B5=E4=BD=8D=E5=89=8D=EF=BC=8C=E5=85=88=E8=AF=B7=E6=B1=82?= =?UTF-8?q?=E4=B8=80=E6=AC=A1=E6=8E=A5=E5=8F=A3=203=EF=BC=9A=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E6=89=80=E6=9C=89CP=E6=9B=B4=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=E5=BF=83=E5=8A=A8=204=EF=BC=9A=E4=BF=AE=E6=94=B9=E6=8C=9A?= =?UTF-8?q?=E5=8F=8B=EF=BC=8C=E5=88=9D=E5=A7=8B=E8=8E=B7=E5=8F=96=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=8F=98=E6=9B=B4=E6=88=9040=E6=9D=A1=205=EF=BC=9A?= =?UTF-8?q?=E6=9C=AA=E5=AE=9E=E5=90=8D=E8=AE=A4=E8=AF=81=E4=B8=8D=E8=83=BD?= =?UTF-8?q?=E8=BF=9B=E8=A1=8C=E6=AD=8C=E6=89=8B=E8=AE=A4=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xscm/moduleutil/bean/MyFamilyBean.kt | 4 +- .../moduleutil/utils/roomview/RoomCPView.java | 214 ++++++++---------- .../user/activity/NobleDetailsActivity.java | 12 +- .../user/activity/NobleTitleActivity.java | 12 +- .../activity/ui/main/BosomFriendFragment.kt | 14 +- .../user/fragment/VocalRangeFragment.java | 8 + .../modulemain/adapter/BosomFriendAdapter.kt | 12 +- .../modulemain/adapter/MyFamilyAdapter.kt | 11 +- .../main/res/layout/fragment_bosom_friend.xml | 6 +- .../main/res/layout/item_family_members.xml | 19 +- MainModule/src/main/res/layout/user_top.xml | 2 +- 11 files changed, 155 insertions(+), 159 deletions(-) diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/bean/MyFamilyBean.kt b/BaseModule/src/main/java/com/xscm/moduleutil/bean/MyFamilyBean.kt index 5ffebeb5..125f02d4 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/bean/MyFamilyBean.kt +++ b/BaseModule/src/main/java/com/xscm/moduleutil/bean/MyFamilyBean.kt @@ -41,8 +41,8 @@ class MyFamilyBean { var nobility_image: String = "" //贵族 var nickname_color: String = "" //贵族颜色 var free_renewal: Int = 0 //免费续签次数 - var today_earnings: String = "" //今日收礼收益 - var yesterday_earnings: String = "" //昨日收礼收益 + var today_earnings: Double = 0.0 //今日收礼收益 + var yesterday_earnings: Double = 0.0 //昨日收礼收益 var is_online: Int = 0 //是否在线 1在线 0离线 var is_show_sign: Int = 0 //是否显示续约按钮 1:显示 0:不显示 diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/utils/roomview/RoomCPView.java b/BaseModule/src/main/java/com/xscm/moduleutil/utils/roomview/RoomCPView.java index c78c52b3..c35f473b 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/utils/roomview/RoomCPView.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/utils/roomview/RoomCPView.java @@ -228,6 +228,9 @@ public class RoomCPView extends FrameLayout { isLoadEffect = false; // 标记动画已停止运行 isAnimationRunning = false; + + // 清除播放器缓存 + clearPlayerCache(); } finally { lock.unlock(); } @@ -237,7 +240,7 @@ public class RoomCPView extends FrameLayout { } // 继续播放下一个动画 - loadStartAnimation(); + processNextAnimation(); }, 100); // 添加100毫秒的延迟 } }); @@ -295,7 +298,7 @@ public class RoomCPView extends FrameLayout { } // 继续播放下一个 - loadStartAnimation(); + processNextAnimation(); }); } }); @@ -352,10 +355,9 @@ public class RoomCPView extends FrameLayout { } /** - * 加载并开始播放动画 - * 从动画队列中取出下一个动画进行播放 + * 处理并播放队列中的下一个动画 */ - private void loadStartAnimation() { + private void processNextAnimation() { // 检查是否开启特效 if (!isShow) { return; @@ -368,75 +370,68 @@ public class RoomCPView extends FrameLayout { return; } - String animationPath = null; - - // 对动画列表加锁 - lock.lock(); - try { - // 检查动画队列是否为空 - if (!animationArray.isEmpty()) { - // 获取队列中的第一个动画路径 - animationPath = animationArray.get(0); - // 从队列中移除已获取的动画 - animationArray.remove(0); - - // 设置状态标记 - isLoadEffect = true; - isAnimationRunning = true; - } else { - // 队列为空,重置状态并释放资源 - isLoadEffect = false; - post(() -> { - destroyEffectView(); - }); - } - } finally { - // 解锁 - lock.unlock(); + // 检查动画队列是否为空 + if (animationQueue.isEmpty()) { + // 队列为空,重置状态并释放资源 + isLoadEffect = false; + post(() -> { + destroyEffectView(); + }); + return; } - // 如果有动画需要播放 - if (isLoadEffect && animationPath != null && !TextUtils.isEmpty(animationPath)) { - String finalAnimationPath = animationPath; - post(new Runnable() { - @Override - public void run() { - // 处理MP4动画文件(可能是网络URL) - handleMP4File(finalAnimationPath, new DownloadCallback() { - @Override - public void onSuccess(String localPath) { - post(() -> { - // 设置当前播放路径 - currPlayPath = localPath; - // 启动从底部弹起动画 - startBottomUpAnimation(); - // 设置播放次数为1次 - anim_cp.setLoop(1); - }); - } + // 获取并移除队列中的第一个动画任务 + AnimationTask task = animationQueue.poll(); + if (task == null) { + return; + } - @Override - public void onError(String error) { - LogUtils.e("MP4下载或播放失败: " + error); - // 处理失败情况,继续播放下一个 - post(() -> { - // 使用动画队列锁确保线程安全 - synchronized (animationLock) { - lock.lock(); - try { - // 重置状态标记 - isLoadEffect = false; - isAnimationRunning = false; - } finally { - lock.unlock(); - } - } - // 尝试播放下一个动画 - loadStartAnimation(); - }); + // 设置状态标记 + isLoadEffect = true; + isAnimationRunning = true; + + // 设置CP数据 + setCPTextData(task.room_head1, task.room_head2, task.room_cp_name1, task.room_cp_name2); + + // 确保视图可见 + setVisibility(View.VISIBLE); + + // 处理动画文件 + String animationPath = task.mp4Path; + if (animationPath != null && !TextUtils.isEmpty(animationPath)) { + post(() -> { + // 处理MP4动画文件(可能是网络URL) + handleMP4File(animationPath, new DownloadCallback() { + @Override + public void onSuccess(String localPath) { + post(() -> { + // 设置当前播放路径 + currPlayPath = localPath; + // 启动从底部弹起动画 + startBottomUpAnimation(); + // 设置播放次数为1次 + anim_cp.setLoop(1); + }); + } + + @Override + public void onError(String error) { + LogUtils.e("MP4下载或播放失败: " + error); + // 处理失败情况,继续播放下一个 + synchronized (animationLock) { + lock.lock(); + try { + // 重置状态标记 + isLoadEffect = false; + isAnimationRunning = false; + } finally { + lock.unlock(); + } } - }); - } + // 尝试播放下一个动画 + processNextAnimation(); + } + }); }); } } @@ -457,58 +452,18 @@ public class RoomCPView extends FrameLayout { // 确保视图已初始化 reinitView(); - // 设置CP数据 - setCPTextData(room_head1, room_head2, room_name1, room_name2); + // 创建动画任务并添加到队列 + AnimationTask task = new AnimationTask(room_head1, room_head2, room_name1, room_name2, mp4Path, null); - // 注释:确保头像初始为隐藏状态(如需要可取消注释) - // room_cp_head1.setVisibility(View.GONE); - // room_cp_head2.setVisibility(View.GONE); - // room_cp_name1.setVisibility(View.GONE); - // room_cp_name2.setVisibility(View.GONE); + // 使用动画队列锁确保线程安全 + synchronized (animationLock) { + animationQueue.offer(task); - // 确保视图可见 - setVisibility(View.VISIBLE); - - // 检查队列是否已初始化 - if (queue == null) { - queue = Executors.newSingleThreadExecutor(); - } - - // 在后台线程中处理动画 - queue.execute(new Runnable() { - @Override - public void run() { - // 检查动画路径是否有效 - if (mp4Path == null || mp4Path.isEmpty()) { - return; - } - - // 获取文件扩展名并转为小写 - String playImage = mp4Path; - String pathExtension = getFileExtension(playImage).toLowerCase(); - - // 检查文件格式是否支持(仅支持svga和mp4) - if (!("svga".equals(pathExtension) || "mp4".equals(pathExtension))) { - return; - } - - // 对动画列表加锁 - lock.lock(); - try { - // 将动画路径添加到队列 - animationArray.add(playImage); - - // 如果当前没有动画在加载,则开始加载新动画 - if (!isLoadEffect) { - isLoadEffect = true; - loadStartAnimation(); - } - } finally { - // 解锁 - lock.unlock(); - } + // 如果当前没有动画在播放,则开始播放队列中的第一个动画 + if (!isAnimationRunning) { + processNextAnimation(); } - }); + } } @@ -805,7 +760,7 @@ public class RoomCPView extends FrameLayout { synchronized (animationLock) { lock.lock(); try { - animationArray.clear(); + animationQueue.clear(); isLoadEffect = false; // 重置动画运行状态 isAnimationRunning = false; @@ -1011,6 +966,19 @@ public class RoomCPView extends FrameLayout { } } + /** + * 清除播放器缓存 + * 清除当前播放的视频缓存,但不删除已下载的文件 + */ + private void clearPlayerCache() { + if (anim_cp != null) { + // 停止当前播放 + anim_cp.stopPlay(); + // 重置当前播放路径 + currPlayPath = ""; + } + } + /** * 重新初始化视图,以便再次播放 */ @@ -1030,6 +998,7 @@ public class RoomCPView extends FrameLayout { // 重置状态 isLoadEffect = false; + isAnimationRunning = false; isShow = true; } @@ -1057,6 +1026,11 @@ public class RoomCPView extends FrameLayout { queue = null; } + // 清空动画队列 + synchronized (animationLock) { + animationQueue.clear(); + } + // 隐藏并移除整个视图 setVisibility(View.GONE); if (getParent() != null) { diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/NobleDetailsActivity.java b/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/NobleDetailsActivity.java index ecd7a097..a6a9a314 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/NobleDetailsActivity.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/NobleDetailsActivity.java @@ -61,11 +61,7 @@ public class NobleDetailsActivity extends BaseMvpActivity { - Intent intent = new Intent(this, NoblePaymentActivity.class); - Bundle bundle = new Bundle(); - bundle.putString("lid",xlid); - intent.putExtras( bundle); - startActivity(intent); + MvpPre.getNobilityPrice(xlid); }); } @@ -152,7 +148,11 @@ public class NobleDetailsActivity extends BaseMvpActivity?) { diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/user/fragment/VocalRangeFragment.java b/MainModule/src/main/java/com/xscm/modulemain/activity/user/fragment/VocalRangeFragment.java index a444730d..ca425929 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/user/fragment/VocalRangeFragment.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/user/fragment/VocalRangeFragment.java @@ -17,7 +17,9 @@ import android.widget.LinearLayout; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import com.alibaba.android.arouter.launcher.ARouter; import com.blankj.utilcode.util.LogUtils; +import com.hjq.toast.ToastUtils; import com.stx.xhb.xbanner.XBanner; import com.tencent.mm.opensdk.modelbiz.WXOpenCustomerServiceChat; import com.tencent.mm.opensdk.openapi.IWXAPI; @@ -45,6 +47,7 @@ import com.xscm.modulemain.activity.user.presenter.MePresenter; import com.xscm.modulemain.activity.WebViewActivity; import com.xscm.modulemain.dialog.UserNetWorthDialog; import com.xscm.moduleutil.base.WebUrlConstants; +import com.xscm.moduleutil.utils.ARouteConstants; import com.xscm.moduleutil.widget.ShineTextView; import com.xscm.moduleutil.base.BaseMvpFragment; import com.xscm.moduleutil.base.CommonAppContext; @@ -271,6 +274,11 @@ public class VocalRangeFragment extends BaseMvpFragment) : BaseMultiItemQuic if (remainingSeconds > 0) { val days = remainingSeconds / (24 * 60 * 60) - val hours = (remainingSeconds % (24 * 60 * 60)) / (60 * 60) + val remainingHours = (remainingSeconds % (24 * 60 * 60)) / (60 * 60) + val hasRemainingMinutes = (remainingSeconds % (60 * 60)) > 0 + + val hours = if (days > 0) { + remainingHours + } else { + // 当天数小于等于0时,如果有剩余分钟,则小时数+1 + if (hasRemainingMinutes) remainingHours + 1 else remainingHours + }.coerceAtLeast(1) // 确保至少显示1小时 + val timeText = if (days > 0) { "${days}天${hours}小时" } else { @@ -136,6 +145,7 @@ class BosomFriendAdapter(data: MutableList) : BaseMultiItemQuic } holder.setText(R.id.tv_cp_num, timeText) } + } catch (e: NumberFormatException) { // 时间戳格式错误 holder.setVisible(R.id.tv_cp_num, false) diff --git a/MainModule/src/main/java/com/xscm/modulemain/adapter/MyFamilyAdapter.kt b/MainModule/src/main/java/com/xscm/modulemain/adapter/MyFamilyAdapter.kt index bfb8a816..11c9360f 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/adapter/MyFamilyAdapter.kt +++ b/MainModule/src/main/java/com/xscm/modulemain/adapter/MyFamilyAdapter.kt @@ -1,5 +1,6 @@ package com.xscm.modulemain.adapter +import android.annotation.SuppressLint import android.content.Context import android.graphics.Color import android.view.View @@ -18,6 +19,7 @@ import com.xscm.moduleutil.utils.ImageUtils import com.xscm.moduleutil.utils.MeHeadView import com.xscm.moduleutil.utils.SpUtil import com.xscm.moduleutil.widget.ShineTextView +import java.text.DecimalFormat /** * 项目名称:羽声语音 @@ -41,6 +43,7 @@ class MyFamilyAdapter( fun setOnItemClickListener(listener: OnItemClickListener) { onItemClickListener = listener } + @SuppressLint("DefaultLocale") override fun convert( helper: BaseViewHolder, item: MyFamilyBean.GroupMembersListsBean @@ -75,8 +78,12 @@ class MyFamilyAdapter( helper.setText(R.id.tv_time, "剩余租期"+item.end_day) helper.setText(R.id.tv_num, "免费续约次数"+ item.free_renewal) - helper.setText(R.id.tv_today, item.today_earnings) - helper.setText(R.id.tv_yesterday, item.yesterday_earnings) + val decimalFormat = DecimalFormat("#.####") + helper.setText(R.id.tv_today, decimalFormat.format(item.today_earnings.toDouble())) + helper.setText(R.id.tv_yesterday, decimalFormat.format(item.yesterday_earnings.toDouble())) + + +// helper.setText(R.id.tv_yesterday, item.yesterday_earnings) tvName.setText(item.nickname) if (item.nickname_color.isNotEmpty()){ tvName.startColor = Color.parseColor(item.nickname_color) diff --git a/MainModule/src/main/res/layout/fragment_bosom_friend.xml b/MainModule/src/main/res/layout/fragment_bosom_friend.xml index 9cf50680..02614b06 100644 --- a/MainModule/src/main/res/layout/fragment_bosom_friend.xml +++ b/MainModule/src/main/res/layout/fragment_bosom_friend.xml @@ -82,7 +82,7 @@ android:layout_height="wrap_content" android:background="@mipmap/icon_dialog_u_cp_left_top" android:gravity="center" - android:text="CP" + android:text="心动" android:textColor="@color/white" /> - - + - + android:visibility="gone"/> diff --git a/MainModule/src/main/res/layout/user_top.xml b/MainModule/src/main/res/layout/user_top.xml index 8c698b73..7881d925 100644 --- a/MainModule/src/main/res/layout/user_top.xml +++ b/MainModule/src/main/res/layout/user_top.xml @@ -330,7 +330,7 @@ android:layout_height="wrap_content" android:background="@mipmap/icon_dialog_u_cp_left_top" android:gravity="center" - android:text="CP" + android:text="心动" android:textColor="@color/white" />