1:红包功能完成
This commit is contained in:
@@ -14,6 +14,7 @@ import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.media.MediaPlayer;
|
||||
import android.net.Uri;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
@@ -57,6 +58,7 @@ import com.xscm.moduleutil.base.RoomManager;
|
||||
import com.xscm.moduleutil.bean.XLHBean;
|
||||
import com.xscm.moduleutil.event.HourlyBean;
|
||||
import com.xscm.moduleutil.event.MqttBean;
|
||||
import com.xscm.moduleutil.event.RedBean;
|
||||
import com.xscm.moduleutil.utils.ARouteConstants;
|
||||
import com.xscm.moduleutil.utils.BackgroundManager;
|
||||
import com.xscm.moduleutil.utils.ColorManager;
|
||||
@@ -446,12 +448,16 @@ public abstract class BaseAppCompatActivity<VDB extends ViewDataBinding> extends
|
||||
// 在类中添加以下成员变量
|
||||
private final List<MqttBean.ListBean> mqttMessageQueue = new ArrayList<>(); // MQTT消息队列
|
||||
private final List<XLHBean> xlhMessageQueue = new ArrayList<>(); // XLH消息队列
|
||||
private final List<RedBean> redMessageQueue = new ArrayList<>(); // 红包队列
|
||||
private boolean isMqttPlaying = false; // MQTT播放状态标志
|
||||
private boolean isXlhPlaying = false; // XLH播放状态标志
|
||||
private boolean isRedPlaying = false; // XLH播放状态标志
|
||||
private final Object mqttQueueLock = new Object(); // MQTT队列同步锁
|
||||
private final Object xlhQueueLock = new Object(); // XLH队列同步锁
|
||||
private final Object RedQueueLock = new Object(); // XLH队列同步锁
|
||||
private View currentMqttView = null; // 当前正在播放的MQTT视图
|
||||
private View currentXlhView = null; // 当前正在播放的XLH视图
|
||||
private View currentRedView = null; // 当前正在播放的XLH视图
|
||||
|
||||
private final List<HourlyBean> hourlyMessageQueue = new ArrayList<>(); // 小时榜消息队列
|
||||
private final Map<Integer, View> currentHourlyViews = new HashMap<>(); // 当前显示的小时榜视图
|
||||
@@ -711,6 +717,166 @@ public abstract class BaseAppCompatActivity<VDB extends ViewDataBinding> extends
|
||||
}
|
||||
}
|
||||
|
||||
@Subscribe(threadMode = ThreadMode.MAIN)
|
||||
public void onEvent(RedBean event){
|
||||
LogUtils.e("收到红包", event);
|
||||
if (event==null) return;
|
||||
if (SpUtil.getFloatingScreen()==1){
|
||||
|
||||
synchronized (RedQueueLock) {
|
||||
redMessageQueue.add(event);
|
||||
if (!isRedPlaying) {
|
||||
isRedPlaying = true;
|
||||
processNextRedMessage();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
redMessageQueue.clear();
|
||||
}
|
||||
}
|
||||
|
||||
private void processNextRedMessage() {
|
||||
RedBean redBean;
|
||||
synchronized (RedQueueLock) {
|
||||
if (redMessageQueue.isEmpty()) {
|
||||
isRedPlaying = false;
|
||||
return;
|
||||
}
|
||||
redBean = redMessageQueue.remove(0);
|
||||
}
|
||||
showPiaoPingMessageRed(redBean);
|
||||
}
|
||||
|
||||
private void showPiaoPingMessageRed(RedBean redBean){
|
||||
try {
|
||||
// 清理之前的视图(如果存在)
|
||||
if (currentRedView != null && currentRedView.getParent() != null) {
|
||||
ViewGroup parent = (ViewGroup) currentRedView.getParent();
|
||||
parent.removeView(currentRedView);
|
||||
}
|
||||
|
||||
if (decorView2 == null) {
|
||||
decorView2 = (ViewGroup) getWindow().getDecorView();
|
||||
}
|
||||
|
||||
currentRedView = LayoutInflater.from(this).inflate(R.layout.item_piaoping_red, null);
|
||||
FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(
|
||||
FrameLayout.LayoutParams.MATCH_PARENT,
|
||||
FrameLayout.LayoutParams.WRAP_CONTENT);
|
||||
layoutParams.topMargin = com.sunfusheng.marqueeview.DisplayUtil.dip2px(this, 140);
|
||||
layoutParams.gravity = Gravity.TOP | Gravity.CENTER_HORIZONTAL;
|
||||
currentRedView.setLayoutParams(layoutParams);
|
||||
decorView2.addView(currentRedView);
|
||||
|
||||
updateRedFloatingViewData(currentRedView, redBean);
|
||||
// 播放红包音效
|
||||
playRedPacketSound();
|
||||
resetAndStartXlhAnimation(currentRedView, () -> {
|
||||
// 清理当前视图
|
||||
if (currentRedView != null && currentRedView.getParent() != null) {
|
||||
ViewGroup parent = (ViewGroup) currentRedView.getParent();
|
||||
parent.removeView(currentRedView);
|
||||
}
|
||||
currentRedView = null;
|
||||
|
||||
// 处理队列中的下一条消息
|
||||
synchronized (RedQueueLock) {
|
||||
isRedPlaying = false;
|
||||
processNextRedMessage();
|
||||
}
|
||||
});
|
||||
} catch (Exception e) {
|
||||
LogUtils.e("显示红包飘屏失败", e);
|
||||
// 出现异常时继续处理队列
|
||||
synchronized (RedQueueLock) {
|
||||
isRedPlaying = false;
|
||||
processNextRedMessage();
|
||||
}
|
||||
}
|
||||
}
|
||||
// 在类中添加成员变量
|
||||
private MediaPlayer redPacketMediaPlayer = null;
|
||||
private boolean isRedPacketMediaPrepared = false;
|
||||
// 添加播放红包音效的方法
|
||||
private void playRedPacketSound() {
|
||||
try {
|
||||
if (!isRedPacketMediaPrepared) {
|
||||
// 第一次初始化MediaPlayer
|
||||
if (redPacketMediaPlayer == null) {
|
||||
redPacketMediaPlayer = MediaPlayer.create(this, R.raw.red_packet_come); // 假设音效文件名为red_packet_sound.mp3
|
||||
redPacketMediaPlayer.setOnPreparedListener(mp -> {
|
||||
isRedPacketMediaPrepared = true;
|
||||
mp.start();
|
||||
});
|
||||
redPacketMediaPlayer.setOnCompletionListener(mp -> {
|
||||
// 播放完成后重置,以便下次重新播放
|
||||
try {
|
||||
mp.seekTo(0);
|
||||
} catch (Exception e) {
|
||||
LogUtils.e("MediaPlayer重置失败", e);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (redPacketMediaPlayer != null) {
|
||||
redPacketMediaPlayer.prepareAsync(); // 异步准备
|
||||
}
|
||||
} else {
|
||||
// 已经准备好了,直接重新播放
|
||||
if (redPacketMediaPlayer != null && !redPacketMediaPlayer.isPlaying()) {
|
||||
redPacketMediaPlayer.seekTo(0);
|
||||
redPacketMediaPlayer.start();
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
LogUtils.e("播放红包音效失败", e);
|
||||
}
|
||||
}
|
||||
|
||||
private void updateRedFloatingViewData(View view, RedBean redBean){
|
||||
TextView textView = view.findViewById(R.id.tv_name);
|
||||
|
||||
if (redBean != null) {
|
||||
String fullText = redBean.getText();
|
||||
if (redBean.getNickname() != null && redBean.getRoom_name() != null) {
|
||||
SpannableStringBuilder builder = new SpannableStringBuilder(fullText);
|
||||
|
||||
// 为用户名设置蓝色
|
||||
int userNameStart = fullText.indexOf(redBean.getNickname());
|
||||
if (userNameStart >= 0) {
|
||||
builder.setSpan(
|
||||
new ForegroundColorSpan(ContextCompat.getColor(this, R.color.colorPrimary)),
|
||||
userNameStart,
|
||||
userNameStart + redBean.getNickname().length(),
|
||||
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
|
||||
);
|
||||
}
|
||||
|
||||
// 为房间名设置蓝色
|
||||
int roomNameStart = fullText.indexOf(redBean.getRoom_name());
|
||||
if (roomNameStart >= 0) {
|
||||
builder.setSpan(
|
||||
new ForegroundColorSpan(ContextCompat.getColor(this, R.color.colorPrimary)),
|
||||
roomNameStart,
|
||||
roomNameStart + redBean.getRoom_name().length(),
|
||||
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
|
||||
);
|
||||
}
|
||||
|
||||
textView.setText(builder);
|
||||
} else {
|
||||
textView.setText(fullText);
|
||||
}
|
||||
} else {
|
||||
textView.setText("");
|
||||
}
|
||||
|
||||
view.setOnClickListener(v -> {
|
||||
// 点击时执行跳转操作
|
||||
handleRedItemClick(redBean);
|
||||
});
|
||||
}
|
||||
|
||||
// 处理下一个MQTT消息
|
||||
private void processNextMqttMessage() {
|
||||
MqttBean.ListBean mqttBean;
|
||||
@@ -737,8 +903,9 @@ public abstract class BaseAppCompatActivity<VDB extends ViewDataBinding> extends
|
||||
showPiaoPingMessageXlh(xlhBean);
|
||||
}
|
||||
|
||||
ViewGroup decorView;
|
||||
ViewGroup decorView1;
|
||||
ViewGroup decorView;//礼物的
|
||||
ViewGroup decorView1;//巡乐会的
|
||||
ViewGroup decorView2;//红包的
|
||||
|
||||
private void showFloatingMessage(MqttBean.ListBean mqttBean) {
|
||||
|
||||
@@ -977,7 +1144,7 @@ public abstract class BaseAppCompatActivity<VDB extends ViewDataBinding> extends
|
||||
LogUtils.e("XLH动画执行失败", e);
|
||||
onAnimationEnd.run();
|
||||
}
|
||||
}, 3000);
|
||||
}, 5000);
|
||||
} catch (Exception e) {
|
||||
LogUtils.e("XLH动画启动失败", e);
|
||||
onAnimationEnd.run();
|
||||
@@ -1031,6 +1198,15 @@ public abstract class BaseAppCompatActivity<VDB extends ViewDataBinding> extends
|
||||
|
||||
}
|
||||
|
||||
private void handleRedItemClick(RedBean redBean) {
|
||||
// 这里可以根据实际需求实现跳转逻辑
|
||||
// 例如:跳转到礼物详情页面、用户主页等
|
||||
// 使用缓存数据进入房间
|
||||
RoomManager.getInstance().fetchRoomDataAndEnter(getApplicationContext(), redBean.getRoom_id(), "");
|
||||
// ARouter.getInstance().build(ARouteConstants.ROOM_DETAILS).withString("from", "我的界面").withString("roomId", xlhBean.getRoom_id()).navigation();
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Subscribe(threadMode = ThreadMode.MAIN)
|
||||
public void onEvent(ChatInfo event) {
|
||||
|
||||
Reference in New Issue
Block a user