Compare commits

...

2 Commits

Author SHA1 Message Date
qyy
a3b689c17e Merge branch 'master' of http://132.232.166.92:8089/MIDI/midi-android 2025-09-12 15:12:11 +08:00
qyy
fb2fd4c6f6 fix 修改动画 2025-09-12 15:12:00 +08:00
2 changed files with 149 additions and 188 deletions

View File

@@ -1,18 +1,12 @@
package com.xscm.moduleutil.widget;
import android.content.Context;
import android.graphics.SurfaceTexture;
import android.net.Uri;
import android.opengl.GLES11Ext;
import android.opengl.GLES20;
import android.opengl.GLSurfaceView;
import android.os.Handler;
import android.os.Looper;
import android.util.AttributeSet;
import android.util.Log;
import android.util.LruCache;
import android.view.LayoutInflater;
import android.view.Surface;
import android.view.View;
import android.widget.FrameLayout;
@@ -21,13 +15,7 @@ import androidx.annotation.Nullable;
import androidx.databinding.DataBindingUtil;
import com.blankj.utilcode.util.LogUtils;
import com.blankj.utilcode.util.PathUtils;
import com.blankj.utilcode.util.ThreadUtils;
import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.MediaItem;
import com.google.android.exoplayer2.ui.PlayerView;
import com.liulishuo.okdownload.DownloadTask;
import com.liulishuo.okdownload.StatusUtil;
import com.liulishuo.okdownload.core.cause.EndCause;
import com.liulishuo.okdownload.core.cause.ResumeFailedCause;
import com.liulishuo.okdownload.core.listener.DownloadListener1;
@@ -38,20 +26,12 @@ import com.opensource.svgaplayer.SVGADynamicEntity;
import com.opensource.svgaplayer.SVGAImageView;
import com.opensource.svgaplayer.SVGAParser;
import com.opensource.svgaplayer.SVGAVideoEntity;
import com.tencent.imsdk.v2.V2TIMSimpleMsgListener;
import com.tencent.qgame.animplayer.AnimConfig;
import com.tencent.qgame.animplayer.inter.IAnimListener;
import com.tencent.qgame.animplayer.inter.IFetchResource;
import com.xscm.moduleutil.R;
import com.xscm.moduleutil.bean.GiftAvatarBean;
import com.xscm.moduleutil.databinding.RoomViewSvgaAnimBinding;
import com.xscm.moduleutil.utils.Md5Utils;
import com.xscm.moduleutil.utils.MemoryOptimizationUtils;
import com.xscm.moduleutil.utils.SpUtil;
import com.xscm.moduleutil.utils.logger.Logger;
import org.greenrobot.eventbus.EventBus;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
@@ -73,52 +53,9 @@ import okhttp3.Response;
import okhttp3.ResponseBody;
public class AvatarFrameView extends FrameLayout implements IAnimListener {
public class AvatarFrameView extends FrameLayout {
private PlaybackManager playbackManager;
@Override
public void onFailed(int i, @Nullable String s) {
LogUtils.e("@@@@" + "onFailed");
}
@Override
public boolean onVideoConfigReady(@NonNull AnimConfig animConfig) {
return true;
}
@Override
public void onVideoStart() {
LogUtils.e("@@@@" + "onVideoStart");
}
@Override
public void onVideoRender(int i, @Nullable AnimConfig animConfig) {
}
@Override
public void onVideoComplete() {
// if (mType == 1) {
// mBinding.playView.startPlay(mFile); // 循环播放
// } else {
// isPlaying = false;
// playNextFromQueue(); // 播放下一项
// }
// if (isDestroyed) return;
// 确保在主线程中执行
// EventBus.getDefault().post(new GiftAvatarBean());
LogUtils.e("@@@@" + "EventBus onVideoComplete");
// if (Looper.myLooper() == Looper.getMainLooper()) {
// handleVideoComplete();
// } else {
// mainHandler.post(() -> {
//// if (!isDestroyed) {
// handleVideoComplete();
//// }
// });
// }
}
private void handleVideoComplete() {
// if (isDestroyed) return;
@@ -172,11 +109,6 @@ public class AvatarFrameView extends FrameLayout implements IAnimListener {
}
}
@Override
public void onVideoDestroy() {
}
public enum RenderType {SVGA, MP4}
private RenderType renderType;
@@ -239,10 +171,10 @@ public class AvatarFrameView extends FrameLayout implements IAnimListener {
playbackManager = new PlaybackManager(mainHandler);
// 获取 MP4PlaybackCallback 单例实例并设置引用
MP4PlaybackCallback callback = MP4PlaybackCallback.getInstance();
callback.setAvatarFrameView(this);
// MP4PlaybackCallback callback = MP4PlaybackCallback.getInstance();
// callback.setAvatarFrameView(this);
// 设置播放完成监听
mBinding.playView.setAnimListener(callback);
// mBinding.playView.setAnimListener(callback);
// if (mBinding != null) {
// mBinding.playView.setAnimListener(this);
@@ -327,7 +259,7 @@ public class AvatarFrameView extends FrameLayout implements IAnimListener {
}
// 添加统一的播放完成处理方法
private void onPlaybackComplete() {
public void onPlaybackComplete() {
mainHandler.post(() -> {
if (isDestroyed) return;
@@ -338,9 +270,9 @@ public class AvatarFrameView extends FrameLayout implements IAnimListener {
isPlaying = false;
// 内存清理检查
if (playQueue.size() % 5 == 0) {
performLightMemoryCleanup();
}
// if (playQueue.size() % 5 == 0) {
// performLightMemoryCleanup();
// }
// 继续处理队列中的下一个项目
playNextFromQueue();
});
@@ -381,6 +313,10 @@ public class AvatarFrameView extends FrameLayout implements IAnimListener {
}
return false;
}
public boolean isPlaying(){
return mBinding.playView.isRunning();
}
// 在 AvatarFrameView 类中添加以下代码
private static final int MAX_CONCURRENT_PROCESSING = 3; // 同时处理的最大动画数
@@ -401,11 +337,11 @@ public class AvatarFrameView extends FrameLayout implements IAnimListener {
// return;
// }
// 检查特效是否开启
if (SpUtil.getOpenEffect() != 1) {
// 特效关闭时清空队列并停止播放
clearQueue();
return;
}
// if (SpUtil.getOpenEffect() != 1) {
// // 特效关闭时清空队列并停止播放
// clearQueue();
// return;
// }
// 添加到播放队列
playQueue.add(new PlayItem(url, type2));
@@ -1408,66 +1344,9 @@ public class AvatarFrameView extends FrameLayout implements IAnimListener {
// private IAnimListener MP4PlaybackCallback;
// 在 AvatarFrameView 类的成员变量区域添加单例实例
private static volatile MP4PlaybackCallback sInstance;
private static class MP4PlaybackCallback implements IAnimListener {
private AvatarFrameView avatarFrameView;
private MP4PlaybackCallback() {
// 私有构造函数
}
// 获取单例实例的方法
public static MP4PlaybackCallback getInstance() {
if (sInstance == null) {
synchronized (MP4PlaybackCallback.class) {
if (sInstance == null) {
sInstance = new MP4PlaybackCallback();
}
}
}
return sInstance;
}
// 设置外部引用的方法
public void setAvatarFrameView(AvatarFrameView view) {
this.avatarFrameView = view;
}
@Override
public void onFailed(int i, @Nullable String s) {
LogUtils.e(AvatarFrameView.TAG, "MP4 playback failed: " + s);
if (avatarFrameView != null) {
avatarFrameView.onPlaybackComplete();
}
}
@Override
public boolean onVideoConfigReady(@NonNull AnimConfig animConfig) {
return true;
}
@Override
public void onVideoStart() {
// 播放开始
}
@Override
public void onVideoRender(int i, @Nullable AnimConfig animConfig) {
// 视频渲染中
}
@Override
public void onVideoComplete() {
if (avatarFrameView != null) {
avatarFrameView.onPlaybackComplete();
}
}
@Override
public void onVideoDestroy() {
// 视频销毁
}
public void setAnimListener(IAnimListener mInstance) {
mBinding.playView.setAnimListener(mInstance);
}
// 添加统一的播放完成处理方法

View File

@@ -2,14 +2,12 @@ package com.example.moduleroom.activity;
import static android.app.PendingIntent.getActivity;
import static android.view.View.GONE;
import static android.view.View.INVISIBLE;
import static android.view.View.VISIBLE;
import static com.liulishuo.okdownload.OkDownloadProvider.context;
import android.Manifest;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.AlertDialog;
import android.content.Context;
@@ -22,15 +20,11 @@ import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.StrictMode;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.TextUtils;
import android.text.style.ForegroundColorSpan;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.GestureDetector;
import android.view.Gravity;
@@ -40,7 +34,6 @@ import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.view.ViewStub;
import android.view.Window;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
@@ -62,7 +55,6 @@ import androidx.recyclerview.widget.LinearLayoutManager;
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.BuildConfig;
import com.blankj.utilcode.util.GsonUtils;
import com.blankj.utilcode.util.LogUtils;
import com.blankj.utilcode.util.ThreadUtils;
@@ -72,30 +64,25 @@ import com.chad.library.adapter.base.BaseQuickAdapter;
import com.example.moduleroom.R;
import com.example.moduleroom.contacts.RoomContacts;
import com.example.moduleroom.databinding.ActivityRoomBinding;
import com.example.moduleroom.dialog.CardRelationshipFragment;
import com.example.moduleroom.dialog.CustomCenterDialogFragment;
import com.example.moduleroom.dialog.ExitRoomBottomSheet;
import com.example.moduleroom.dialog.FriendsDialogFragment;
import com.example.moduleroom.dialog.PublishCommentDialogFragment;
import com.example.moduleroom.dialog.RequestDialogFragment;
import com.example.moduleroom.dialog.RoomConcernDialogFragment;
import com.example.moduleroom.dialog.RoomGiftDialogFragment;
import com.example.moduleroom.dialog.RoomMessageDialogFragment;
import com.example.moduleroom.dialog.RoomOnlineDialogFragment;
import com.example.moduleroom.dialog.RoomPkDialogFragment;
import com.example.moduleroom.dialog.RoomSettingFragment;
import com.example.moduleroom.dialog.SoundEffectsDialogFragment;
import com.example.moduleroom.fragment.FriendshipRoomFragment;
import com.example.moduleroom.fragment.PublicScreenEaseChatFragment;
import com.example.moduleroom.fragment.RoomAuctionFragment;
import com.example.moduleroom.fragment.RoomCabinFragment;
import com.example.moduleroom.fragment.RoomChartsFragment;
import com.example.moduleroom.fragment.RoomKtvFragment;
import com.example.moduleroom.fragment.RoomNoticeDialogFragment;
import com.example.moduleroom.fragment.SingSongFragment;
import com.petterp.floatingx.assist.helper.FxScopeHelper;
import com.petterp.floatingx.listener.control.IFxControl;
import com.tencent.imsdk.v2.V2TIMValueCallback;
import com.tencent.qgame.animplayer.AnimConfig;
import com.tencent.qgame.animplayer.inter.IAnimListener;
import com.xscm.moduleutil.base.CommonAppContext;
import com.xscm.moduleutil.bean.GiftAvatarBean;
import com.xscm.moduleutil.bean.GiftBean;
@@ -106,11 +93,9 @@ import com.xscm.moduleutil.bean.UserInfo;
import com.xscm.moduleutil.bean.UserOnlineStatusBean;
import com.xscm.moduleutil.bean.room.FriendInfo;
import com.xscm.moduleutil.bean.room.FriendUserBean;
import com.xscm.moduleutil.bean.room.RoomApplyListBean;
import com.xscm.moduleutil.bean.room.RoomAuction;
import com.xscm.moduleutil.bean.room.RoomOnline;
import com.xscm.moduleutil.color.ThemeableDrawableUtils;
import com.xscm.moduleutil.databinding.RoomDialogMusicWindowOpenBinding;
import com.xscm.moduleutil.dialog.RechargeDialogFragment;
import com.xscm.moduleutil.event.ColoseCardEvent;
import com.xscm.moduleutil.event.EffectEvent;
@@ -157,7 +142,6 @@ import com.xscm.moduleutil.widget.CustomMusicFloatingView;
import com.xscm.moduleutil.widget.SilentCountDownTimer;
import com.xscm.moduleutil.widget.ViewUtils;
import com.xscm.moduleutil.widget.floatingView.Floa;
import com.tencent.imsdk.v2.V2TIMCallback;
import com.tencent.imsdk.v2.V2TIMManager;
import org.greenrobot.eventbus.EventBus;
@@ -174,11 +158,11 @@ import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Queue;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import io.agora.musiccontentcenter.Music;
import io.reactivex.disposables.Disposable;
import lombok.Synchronized;
import pub.devrel.easypermissions.AppSettingsDialog;
import pub.devrel.easypermissions.EasyPermissions;
@@ -458,7 +442,35 @@ public class RoomActivity extends BaseMvpActivity<RoomPresenter, ActivityRoomBin
isSave = false;
sDestroied = false;
isMinimized = false;
// ThreadUtils.executeBySingleAtFixRate(new ThreadUtils.Task<String>() {
//
// @Override
// public String doInBackground() throws Throwable {
// LogUtils.e("@@@@" + "doInBackground"+"playQueue.size()===="+playQueue.size());
// if(!playQueue.isEmpty()){
// return playQueue.poll();
// }
// return "";
// }
//
// @Override
// public void onSuccess(String result) {
// LogUtils.e("@@@@" + "onSuccess"+"playQueue.size()===="+playQueue.size());
// if(!TextUtils.isEmpty(result)){
// mBinding.svgaGift.setSource(result, 2);
// }
// }
//
// @Override
// public void onCancel() {
//
// }
//
// @Override
// public void onFail(Throwable t) {
//
// }
// },2, TimeUnit.SECONDS);
overridePendingTransition(0, 0); // 关闭转场动画
@@ -1094,7 +1106,71 @@ public class RoomActivity extends BaseMvpActivity<RoomPresenter, ActivityRoomBin
}
roomFragment.updateSeatViewExchangedWithPitArray(mRoomInfoResp);
}
private List<GiftBean> playQueue = new ArrayList();
private Queue<String> playQueue = new LinkedList<>();
private static volatile MP4PlaybackCallback sInstance;
public static class MP4PlaybackCallback implements IAnimListener {
private AvatarFrameView avatarFrameView;
private MP4PlaybackCallback() {
// 私有构造函数
}
// 获取单例实例的方法
public static MP4PlaybackCallback getInstance() {
if (sInstance == null) {
synchronized (MP4PlaybackCallback.class) {
if (sInstance == null) {
sInstance = new MP4PlaybackCallback();
}
}
}
return sInstance;
}
// 设置外部引用的方法
public void setAvatarFrameView(AvatarFrameView view) {
this.avatarFrameView = view;
}
@Override
public void onFailed(int i, @Nullable String s) {
LogUtils.e("@@@", "MP4 playback failed: " + s);
if (avatarFrameView != null) {
avatarFrameView.onPlaybackComplete();
}
}
@Override
public boolean onVideoConfigReady(@NonNull AnimConfig animConfig) {
return true;
}
@Override
public void onVideoStart() {
// 播放开始
}
@Override
public void onVideoRender(int i, @Nullable AnimConfig animConfig) {
// 视频渲染中
}
@Override
public void onVideoComplete() {
LogUtils.e("@@@@" + "EventBus onVideoComplete");
if (avatarFrameView != null) {
avatarFrameView.onPlaybackComplete();
}
EventBus.getDefault().post(new GiftAvatarBean());
}
@Override
public void onVideoDestroy() {
// 视频销毁
}
}
private void handleMsgType1005(RoomMessageEvent messageEvent, RoomMessageEvent.T text) {
if (text == null || mRoomInfoResp == null || mRoomInfoResp.getRoom_info() == null) return;
@@ -1102,10 +1178,18 @@ public class RoomActivity extends BaseMvpActivity<RoomPresenter, ActivityRoomBin
GiftBean giftInfo = text.getGiftInfo();
UserInfo toUserInfo = text.getToUserInfo();
if (giftInfo == null || toUserInfo == null) return;
MP4PlaybackCallback mp4PlaybackCallback=MP4PlaybackCallback.getInstance();
mp4PlaybackCallback.setAvatarFrameView(mBinding.svgaGift);
mBinding.svgaGift.setAnimListener(mp4PlaybackCallback);
if (SpUtil.getOpenEffect() == 1) {
// 特效关闭时清空队列并停止播放
mBinding.svgaGift.setSource(giftInfo.getPlay_image(), 2);
playQueue.add(giftInfo.getPlay_image());
LogUtils.e("@@@@" + "handleMsgType1005"+"playQueue.size()===="+playQueue.size());
if(!mBinding.svgaGift.isPlaying()){
LogUtils.e("@@@@" + "handleMsgType1005"+"mBinding.svgaGift.isPlaying()===="+mBinding.svgaGift.isPlaying());
mBinding.svgaGift.setSource(playQueue.poll(), 2);
}
}
@@ -1156,35 +1240,33 @@ public class RoomActivity extends BaseMvpActivity<RoomPresenter, ActivityRoomBin
} else if ("1".equals(labelId)) {
roomFragment.SingSongEvent(messageEvent);
}
} else if ("7".equals(typeId)) {
for (RoomPitBean roomPitBean : pitList) {
if (roomPitBean.getUser_id().equals(toUserInfo.getUser_id() + "")) {
roomPitBean.setCharm(toUserInfo.getCharm());
try {
pitList.set(Integer.parseInt(roomPitBean.getPit_number()) - 1, roomPitBean);
} catch (NumberFormatException e) {
// Handle exception
}
}
}
roomFragment.updateSeatViewExchangedWithPitArray(mRoomInfoResp);
}
else if ("7".equals(typeId)) {
// for (RoomPitBean roomPitBean : pitList) {
// if (roomPitBean.getUser_id().equals(toUserInfo.getUser_id() + "")) {
// roomPitBean.setCharm(toUserInfo.getCharm());
// try {
// pitList.set(Integer.parseInt(roomPitBean.getPit_number()) - 1, roomPitBean);
// } catch (NumberFormatException e) {
// // Handle exception
// }
// }
// }
// roomFragment.updateSeatViewExchangedWithPitArray(mRoomInfoResp);
}
}
// @Subscribe(threadMode = ThreadMode.MAIN)
// public void handleGiftAvatarBean(GiftAvatarBean giftAvatarBean) {
// LogUtils.e("@@@@" + "EventBus2222222"+"playQueue.size()===="+playQueue.size());
//
// for (GiftBean giftBean : playQueue) {
// if(!giftBean.is_paly()){
// mBinding.svgaGift.setSource(giftBean.getPlay_image(), 2);
// giftBean.set_paly( true);
// return;
// }
// }
//
// }
@Subscribe(threadMode = ThreadMode.MAIN)
public void handleGiftAvatarBean(GiftAvatarBean giftAvatarBean) {
LogUtils.e("@@@@" + "EventBus2222222"+"playQueue.size()===="+playQueue.size());
if(!playQueue.isEmpty()){
String payUrl=playQueue.poll();
if(!mBinding.svgaGift.isPlaying()){
mBinding.svgaGift.setSource(payUrl, 2);
}
}
}
private void handleMsgType1014(RoomMessageEvent messageEvent, RoomMessageEvent.T text) {
if (text == null) return;