Files
yusheng-android/BaseModule/src/main/java/com/xscm/moduleutil/widget/BaseWheatView.java

692 lines
21 KiB
Java
Raw Normal View History

2025-10-20 10:16:44 +08:00
package com.xscm.moduleutil.widget;
import android.content.Context;
import android.os.CountDownTimer;
import android.text.TextUtils;
import android.util.AttributeSet;
2025-10-31 15:18:32 +08:00
import android.util.Log;
2025-10-20 10:16:44 +08:00
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.DrawableRes;
2025-10-31 15:18:32 +08:00
import androidx.annotation.Nullable;
2025-10-20 10:16:44 +08:00
import androidx.constraintlayout.widget.ConstraintLayout;
2025-10-31 15:18:32 +08:00
import com.blankj.utilcode.util.LogUtils;
2025-10-20 10:16:44 +08:00
import com.opensource.svgaplayer.SVGAImageView;
2025-10-31 15:18:32 +08:00
import com.opensource.svgaplayer.SVGAParser;
import com.opensource.svgaplayer.SVGAVideoEntity;
2025-10-20 10:16:44 +08:00
import com.xscm.moduleutil.R;
2025-10-24 17:52:11 +08:00
import com.xscm.moduleutil.base.CommonAppContext;
2025-10-20 10:16:44 +08:00
import com.xscm.moduleutil.base.RoomRollModel;
import com.xscm.moduleutil.bean.FaceBean;
import com.xscm.moduleutil.bean.room.ClosePhone;
import com.xscm.moduleutil.bean.room.RoomClearCardiacAllModel;
import com.xscm.moduleutil.bean.room.RoomClearCardiacModel;
import com.xscm.moduleutil.bean.room.RoomClosePitModel;
import com.xscm.moduleutil.bean.room.RoomCountDownModel;
import com.xscm.moduleutil.bean.room.RoomDownWheatModel;
import com.xscm.moduleutil.bean.room.RoomGiveGiftModel;
import com.xscm.moduleutil.bean.room.RoomPitBean;
import com.xscm.moduleutil.bean.room.RoomWheatModel;
import com.xscm.moduleutil.event.RoomBanWheatEvent;
import com.xscm.moduleutil.event.RoomBeckoningEvent;
import com.xscm.moduleutil.event.RoomFaceEvent;
import com.xscm.moduleutil.interfaces.IBaseWheat;
import com.xscm.moduleutil.interfaces.SoundLevelUpdateListener;
import com.xscm.moduleutil.rtc.AgoraManager;
import com.xscm.moduleutil.utils.SpUtil;
import com.xscm.moduleutil.utils.logger.Logger;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
public abstract class BaseWheatView extends ConstraintLayout implements IBaseWheat {
public ImageView mRiv;
public ImageView mIvGift;
public WheatCharmView mCharmView;
public TextView mTvName;
public ImageView mIvSex;
public AvatarFrameView mIvFrame;
public SVGAImageView mIvRipple;
public ExpressionImgView mIvFace;
public ImageView mIvShutup;
public TextView tvTime;
public TextView mTvNo;
public TextView tv_time_pk;
public RoomPitBean pitBean;//麦位数据
public String roomId;//房间id
CountDownTimer mCountDownTimer;
public static final String WHEAT_BOSS = "8";//老板位
public static final String WHEAT_HOST = "9";//主持位
public float oX;
public float oY;
boolean closePhone = false;//自己麦位关闭话筒,用于判断声纹显示
public String pitNumber;
public int pitImageVId;
public ImageView iv_on_line;
private boolean showGiftAnim = true;//显示麦位动画
private ImageView iv_tag_type;
private TextView tv_zhul;
2025-10-31 15:18:32 +08:00
private SVGAParser parser = new SVGAParser(getContext());
2025-10-20 10:16:44 +08:00
public BaseWheatView(Context context) {
this(context, null, 0);
}
public BaseWheatView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public BaseWheatView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
inflate(context, getLayoutId(), this);
mRiv = findViewById(R.id.riv);
mIvGift = findViewById(R.id.iv_gift);
mCharmView = findViewById(R.id.charm_view);
mTvName = findViewById(R.id.tv_name);
mIvSex = findViewById(R.id.iv_sex);
mIvFrame = findViewById(R.id.iv_frame);
mIvRipple = findViewById(R.id.iv_ripple);
mIvFace = findViewById(R.id.iv_face);
mIvShutup = findViewById(R.id.iv_shutup);
tvTime = findViewById(R.id.tv_time);
tv_time_pk = findViewById(R.id.tv_time_pk);
mTvNo = findViewById(R.id.tv_no);
2025-10-24 17:52:11 +08:00
iv_on_line = findViewById(R.id.iv_online);/**/
2025-10-20 10:16:44 +08:00
iv_tag_type = findViewById(R.id.iv_tag_type);
2025-10-31 15:18:32 +08:00
tv_zhul = findViewById(R.id.tv_zhul);
2025-10-20 10:16:44 +08:00
setClipChildren(false);
setClipToPadding(false);
oX = mIvGift.getX();
oY = mIvGift.getY();
initPit(context, attrs);
}
protected abstract void initPit(Context context, AttributeSet attrs);
protected abstract int getLayoutId();
protected abstract void setPitData(RoomPitBean bean);
protected float getTzbl() {
return 0.0f;
}
private @DrawableRes int mOriginImage = 0;
private @DrawableRes int mOriginNoImage = 0;
public @DrawableRes int getOriginImage() {
return mOriginImage;
}
public @DrawableRes int getOriginNoImage() {
return mOriginNoImage;
}
public void setImageResource(@DrawableRes int image, @DrawableRes int noImage, CharSequence no) {
mOriginImage = image;
mOriginNoImage = noImage;
mRiv.setImageResource(mOriginImage);
if (mTvNo != null) {
mTvNo.setText(no);
mTvNo.setBackgroundResource(mOriginNoImage);
mTvNo.setVisibility(VISIBLE);
}
}
/**
* 设置麦位数据
*
* @param bean
*/
2025-10-31 15:18:32 +08:00
2025-10-20 10:16:44 +08:00
public void setData(RoomPitBean bean) {
if (!pitNumber.equals(bean.getPit_number())) {
return;
}
this.pitBean = bean;
this.roomId = bean.getRoom_id();
countDownTime(bean.getCount_down());
setCardiac(pitBean.getCharm(), getTzbl());
2025-10-24 17:52:11 +08:00
2025-10-31 15:18:32 +08:00
if (bean.getUser_id() != null && !bean.getUser_id().equals("0") && !bean.getUser_id().isEmpty()) {
if (CommonAppContext.getInstance().getOnlineMap() != null && CommonAppContext.getInstance().getOnlineMap().get(bean.getUser_id()) != null) {
2025-10-24 17:52:11 +08:00
iv_on_line.setVisibility(CommonAppContext.getInstance().getOnlineMap().get(bean.getUser_id()) == 1 ? GONE : VISIBLE);
2025-10-31 15:18:32 +08:00
} else {
2025-10-24 17:52:11 +08:00
iv_on_line.setVisibility(GONE);
}
2025-10-31 15:18:32 +08:00
} else {
2025-10-24 17:52:11 +08:00
iv_on_line.setVisibility(GONE);
}
2025-10-31 15:18:32 +08:00
parser.decodeFromAssets("ripple3695.svga", new SVGAParser.ParseCompletion() {
@Override
public void onComplete(@Nullable SVGAVideoEntity videoItem) {
if (videoItem != null) {
mIvRipple.setVideoItem(videoItem);
}
}
@Override
public void onError() {
Log.e("SVGA", "解析 ripple.svga 失败");
}
});
2025-10-20 10:16:44 +08:00
setPitData(bean);
2025-10-24 17:52:11 +08:00
2025-10-20 10:16:44 +08:00
//心动值
//显示心动
if ("1".equals(pitBean.getShutup())) {
mIvShutup.setVisibility(VISIBLE);
} else {
mIvShutup.setVisibility(GONE);
}
//自动调节麦位波纹
2025-10-31 15:18:32 +08:00
if (mIvRipple != null) {
mIvRipple.setScaleX(1.1f);
mIvRipple.setScaleY(1.1f);
}
2025-10-20 10:16:44 +08:00
if (pitNumber.equals("9")) {
iv_tag_type.setImageResource(R.mipmap.zc);
if (mRiv.getLayoutParams() instanceof ConstraintLayout.LayoutParams) {
ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) mRiv.getLayoutParams();
params.matchConstraintPercentWidth = 0.66f; // 设置为 52%
params.width = 0; // 必须设为 0dpMATCH_CONSTRAINT
mRiv.setLayoutParams(params);
}
} else if (pitNumber.equals("10")) {
iv_tag_type.setImageResource(R.mipmap.jb);
if (mRiv.getLayoutParams() instanceof ConstraintLayout.LayoutParams) {
ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) mRiv.getLayoutParams();
params.matchConstraintPercentWidth = 0.66f; // 设置为 52%
params.width = 0; // 必须设为 0dpMATCH_CONSTRAINT
mRiv.setLayoutParams(params);
}
} else if (pitNumber.equals("-1")) {
iv_tag_type.setImageResource(R.mipmap.mu_yc);
if (mRiv.getLayoutParams() instanceof ConstraintLayout.LayoutParams) {
ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) mRiv.getLayoutParams();
params.matchConstraintPercentWidth = 0.66f; // 设置为 52%
params.width = 0; // 必须设为 0dpMATCH_CONSTRAINT
mRiv.setLayoutParams(params);
}
} else if (pitNumber.equals("0")) {
iv_tag_type.setVisibility(GONE);
mIvShutup.setVisibility(VISIBLE);
} else if (pitNumber.equals("888")) {
iv_tag_type.setVisibility(GONE);
mIvShutup.setVisibility(GONE);
} else {
iv_tag_type.setVisibility(GONE);
}
AgoraManager.getInstance(getContext()).addSoundLevelListener(new SoundLevelUpdateListener() {
@Override
public void onRemoteSoundLevelUpdate(String userId, int soundLevel) {
2025-10-31 15:18:32 +08:00
if (mIvRipple == null)
return;
2025-10-31 15:18:32 +08:00
2025-10-20 10:16:44 +08:00
if (userId.equals(pitBean.getUser_id())) {
if (soundLevel == 0) {
2025-10-31 15:18:32 +08:00
mIvRipple.pauseAnimation();
CommonAppContext.getInstance().onlineMap.put(pitBean.getUser_id(), 1);
2025-10-27 09:43:19 +08:00
mIvRipple.setVisibility(INVISIBLE);
2025-10-20 10:16:44 +08:00
} else {
mIvRipple.setVisibility(VISIBLE);
2025-10-31 15:18:32 +08:00
mIvRipple.startAnimation();
CommonAppContext.getInstance().onlineMap.put(pitBean.getUser_id(), 1);
iv_on_line.setVisibility(GONE);
2025-10-20 10:16:44 +08:00
}
}
}
@Override
public void onLocalSoundLevelUpdate(int volume) {
if (mIvRipple == null)
return;
2025-10-20 10:16:44 +08:00
if (volume == 0) {
2025-10-31 15:18:32 +08:00
mIvRipple.setVisibility(GONE);
2025-10-20 10:16:44 +08:00
} else {
mIvRipple.setVisibility(VISIBLE);
2025-10-31 15:18:32 +08:00
if (!mIvRipple.isAnimating()) {
mIvRipple.startAnimation();
CommonAppContext.getInstance().onlineMap.put(pitBean.getUser_id(), 1);
iv_on_line.setVisibility(GONE);
}
2025-10-20 10:16:44 +08:00
}
}
@Override
public void userJoined(int userId, int elapsd) {
2025-10-31 15:18:32 +08:00
2025-10-20 10:16:44 +08:00
}
@Override
public void userOffline(int userId, int reason) {
2025-10-31 15:18:32 +08:00
2025-10-20 10:16:44 +08:00
}
});
}
2025-10-31 15:18:32 +08:00
public void setCharm(String charm) {
2025-10-24 17:52:11 +08:00
mCharmView.setSex(pitBean.getSex(), pitBean.getUser_id(), charm, false);
}
2025-10-20 10:16:44 +08:00
/**
* 开始倒计时
*
* @param time
*/
public void countDownTime(int time) {
try {
if (time <= 0) {
setTime(0);
releaseCountDownTimer();
return;
}
releaseCountDownTimer();
mCountDownTimer = new CountDownTimer(time * 1000L, 1000L) {
@Override
public void onTick(long millisUntilFinished) {
int time1 = (int) (millisUntilFinished / 1000);
pitBean.setCount_down(time1);
setTime(time1);
}
@Override
public void onFinish() {
setTime(0);
}
};
mCountDownTimer.start();
} catch (Exception e) {
Logger.e("countDownTime", e);
}
}
public void setTime(int time) {
if (time == 0) {
tvTime.setText("");
tvTime.setVisibility(View.INVISIBLE);
} else {
tvTime.setText(String.format("%s'%s", time / 60, time % 60));
tvTime.setVisibility(View.VISIBLE);
}
}
2025-10-24 17:52:11 +08:00
public void setOnlineStatus() {
2025-10-31 15:18:32 +08:00
if (pitBean.getUser_id() != null && !pitBean.getUser_id().equals("0") && !pitBean.getUser_id().isEmpty()) {
if (CommonAppContext.getInstance().getOnlineMap() != null && CommonAppContext.getInstance().getOnlineMap().get(pitBean.getUser_id()) != null) {
2025-10-24 17:52:11 +08:00
iv_on_line.setVisibility(CommonAppContext.getInstance().getOnlineMap().get(pitBean.getUser_id()) == 1 ? GONE : VISIBLE);
2025-10-31 15:18:32 +08:00
} else {
2025-10-24 17:52:11 +08:00
iv_on_line.setVisibility(GONE);
2025-10-20 10:16:44 +08:00
}
2025-10-31 15:18:32 +08:00
} else {
2025-10-24 17:52:11 +08:00
iv_on_line.setVisibility(GONE);
2025-10-20 10:16:44 +08:00
}
}
@Override
protected void onAttachedToWindow() {
showGiftAnim = true;
super.onAttachedToWindow();
}
@Override
protected void onDetachedFromWindow() {
showGiftAnim = false;
releaseCountDownTimer();
super.onDetachedFromWindow();
}
/**
* 释放倒计时
*/
private void releaseCountDownTimer() {
if (mCountDownTimer != null) {
mCountDownTimer.cancel();
mCountDownTimer = null;
}
}
/**
* 麦位是否有人
*
* @return
*/
@Override
public boolean isOn() {
return pitBean != null && !TextUtils.isEmpty(pitBean.getUser_id()) && !"0".equals(pitBean.getUser_id());
}
/**
* 显示麦位礼物动画
*
* @param listBean
*/
@Subscribe(threadMode = ThreadMode.MAIN)
@Override
public void showGift(RoomGiveGiftModel.GiftListBean listBean) {
if (!showGiftAnim) {
mIvGift.setVisibility(GONE);
return;
}
if (listBean.getUser_id() == null || !listBean.getUser_id().equals(pitBean.getUser_id())) {
return;
}
WheatGiftAnim.addGift(mIvGift, listBean.getPicture());
}
/**
* 设置心动值
*
* @param rough_number
*/
@Override
public void setCardiac(String rough_number, float bl) {
if (mCharmView != null) {
pitBean.setCharm((rough_number != null && !rough_number.isEmpty()) ? rough_number : "0");
if (pitBean.getUser_id() == null || pitBean.getUser_id().equals("0") || pitBean.getUser_id().equals("")) {
mCharmView.setSex(pitBean.getSex(), pitBean.getUser_id(), pitBean.getCharm(), false);
} else {
mCharmView.setVisibility(VISIBLE);
mCharmView.setSex(pitBean.getSex(), pitBean.getUser_id(), pitBean.getCharm(), false);
}
}
}
/**
* 清空心动值
*/
@Override
public void clearCardiac() {
if (mCharmView != null) {
pitBean.setCharm("0");
mCharmView.setSex(pitBean.getSex(), pitBean.getUser_id(), pitBean.getCharm(), true);
}
}
public int getCardiac() {
if (pitBean == null) {
return 0;
} else {
try {
return Integer.parseInt(pitBean.getCharm());
} catch (Throwable e) {
return 0;
}
}
}
public String getUserId() {
if (pitBean != null && pitBean.getUser_id() != null && !pitBean.getUser_id().equals("0")) {
return pitBean.getUser_id();
}
return "";
}
@Override
public void register(Object obj) {
}
@Override
public void unRegister(Object obj) {
AgoraManager.getInstance(getContext()).removeSoundLevelListener(this);
}
/**
* 心动值显示开关
*
* @param roomBeckoningEvent
*/
@Subscribe(threadMode = ThreadMode.MAIN)
@Override
public void subscribeMessages(RoomBeckoningEvent roomBeckoningEvent) {
2025-10-24 17:52:11 +08:00
if (roomId != null && roomId.equals(roomBeckoningEvent.getRoomId())) {
2025-10-20 10:16:44 +08:00
mCharmView.setVisibility(roomBeckoningEvent.isOpen() ? VISIBLE : INVISIBLE);
}
}
/**
* 心动值变化
*
* @param cardiacListBean
*/
@Subscribe(threadMode = ThreadMode.MAIN)
@Override
public void subscribeMessages(RoomGiveGiftModel.CardiacListBean cardiacListBean) {
if (!roomId.equals(cardiacListBean.getRoom_id())) {
return;
}
if (this.pitNumber.equals(cardiacListBean.getPit_number())) {
this.setCardiac(cardiacListBean.getXin_dong(), getTzbl());
}
}
/**
* 清空单个麦位心动值
*
* @param roomClearCardiacModel
*/
@Subscribe(threadMode = ThreadMode.MAIN)
@Override
public void subscribeMessages(RoomClearCardiacModel roomClearCardiacModel) {
if (!roomId.equals(roomClearCardiacModel.getRoom_id())) {
return;
}
if (this.pitNumber.equals(roomClearCardiacModel.getPit_number())) {
clearCardiac();
}
}
/**
* 清空所有心动值
*
* @param roomClearCardiacAllModel
*/
@Subscribe(threadMode = ThreadMode.MAIN)
@Override
public void subscribeMessages(RoomClearCardiacAllModel roomClearCardiacAllModel) {
if (!roomId.equals(roomClearCardiacAllModel.getRoom_id())) {
return;
}
clearCardiac();
}
/**
* 上麦
*
* @param roomWheatModel
*/
@Subscribe(threadMode = ThreadMode.MAIN)
@Override
public void subscribeMessages(RoomWheatModel roomWheatModel) {
if (!roomId.equals(roomWheatModel.getRoom_id()) || !pitNumber.equals(roomWheatModel.getPit_number())) {
return;
}
pitBean.setNickname(roomWheatModel.getNickname());
pitBean.setHead_picture(roomWheatModel.getHead_picture());
pitBean.setBanned(roomWheatModel.getBanned());
pitBean.setUser_id(roomWheatModel.getUser_id());
pitBean.setDress_picture(roomWheatModel.getDress_picture());
pitBean.setSex(roomWheatModel.getSex());
pitBean.setBall_state(roomWheatModel.getBall_state());
pitBean.setPit_number(roomWheatModel.getPit_number());
pitBean.setCharm(roomWheatModel.getXin_dong());
setData(pitBean);
}
/**
* 下麦
*
* @param roomDownWheatModel
*/
@Subscribe(threadMode = ThreadMode.MAIN)
@Override
public void subscribeMessages(RoomDownWheatModel roomDownWheatModel) {
if (!roomId.equals(roomDownWheatModel.getRoom_id()) || !pitNumber.equals(roomDownWheatModel.getPit_number())) {
return;
}
closePhone = SpUtil.getUserId() == roomDownWheatModel.getUser_id();
pitBean.setUser_id("0");
pitBean.setPit_number(roomDownWheatModel.getPit_number());
setData(pitBean);
}
/**
* 倒计时
*
* @param roomCountDownModel
*/
@Subscribe(threadMode = ThreadMode.MAIN)
@Override
public void subscribeMessages(RoomCountDownModel roomCountDownModel) {
if (!roomId.equals(roomCountDownModel.getRoom_id()) || !pitNumber.equals(roomCountDownModel.getPit_number())) {
return;
}
pitBean.setCount_down(roomCountDownModel.getSeconds());
countDownTime(roomCountDownModel.getSeconds());
}
/**
* 禁麦
*
* @param roomBanWheatEvent
*/
@Subscribe(threadMode = ThreadMode.MAIN)
@Override
public void subscribeMessages(RoomBanWheatEvent roomBanWheatEvent) {
if (!roomId.equals(roomBanWheatEvent.getRoomId()) || !pitNumber.equals(roomBanWheatEvent.getPit_number())) {
return;
}
pitBean.setShutup(roomBanWheatEvent.isBanWheat() ? "1" : "2");
setData(pitBean);
}
/**
* 锁麦
*
* @param roomClosePitModel
*/
@Subscribe(threadMode = ThreadMode.MAIN)
@Override
public void subscribeMessages(RoomClosePitModel roomClosePitModel) {
if (!roomId.equals(roomClosePitModel.getRoom_id()) || !pitNumber.equals(roomClosePitModel.getPit_number())) {
return;
}
pitBean.setState(roomClosePitModel.getAction());
//麦位上锁
setData(pitBean);
}
/**
* 用户关闭麦克风
*
* @param closePhone
*/
@Subscribe(threadMode = ThreadMode.MAIN)
public void subscribeMessages(ClosePhone closePhone) {
if (pitBean.getUser_id().equals(SpUtil.getUserId())) {
this.closePhone = closePhone.isClosePhone();
}
}
/**
* 麦位是否被锁
*
* @return
*/
@Override
public boolean isLocked() {
return "1".equals(pitBean.getIs_lock());
}
public boolean isMute() {
if (pitBean != null) {
if (pitBean.getUser_id() != null && !pitBean.getUser_id().isEmpty() && "1".equals(pitBean.getIs_mute())) {
return true;
} else {
return false;
}
} else {
return false;
}
}
/**
* 表情
*
* @param roomFaceEvent
*/
@Subscribe(threadMode = ThreadMode.MAIN)
@Override
public void subscribeMessages(RoomFaceEvent roomFaceEvent) {
if (!roomId.equals(roomFaceEvent.getRoom_id()) || !pitNumber.equals(roomFaceEvent.getPit_number())) {
return;
}
mIvFace.addData(new FaceBean(roomFaceEvent.getSpecial(), roomFaceEvent.getTime(), 1));
}
/**
* 抽签
*
* @param roomRollModel
*/
@Subscribe(threadMode = ThreadMode.MAIN)
@Override
public void subscribeMessages(RoomRollModel roomRollModel) {
if (!roomId.equals(roomRollModel.getRoom_id()) || !pitNumber.equals(roomRollModel.getPit_number())) {
return;
}
mIvFace.addData(new FaceBean(roomRollModel.getNumber(), 2));
}
/**
* 是否主持
*
* @return
*/
@Override
public boolean isHost() {
return WHEAT_HOST.equals(pitNumber);
}
}