From fb2fd4c6f69460f8b9f3aba3b2720e13368155e5 Mon Sep 17 00:00:00 2001 From: qyy <444800064@qq.com> Date: Fri, 12 Sep 2025 15:12:00 +0800 Subject: [PATCH] =?UTF-8?q?fix=20=E4=BF=AE=E6=94=B9=E5=8A=A8=E7=94=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../moduleutil/widget/AvatarFrameView.java | 159 ++-------------- .../moduleroom/activity/RoomActivity.java | 178 +++++++++++++----- 2 files changed, 149 insertions(+), 188 deletions(-) diff --git a/moduleUtil/src/main/java/com/xscm/moduleutil/widget/AvatarFrameView.java b/moduleUtil/src/main/java/com/xscm/moduleutil/widget/AvatarFrameView.java index fd3a0a1..e95d8c9 100644 --- a/moduleUtil/src/main/java/com/xscm/moduleutil/widget/AvatarFrameView.java +++ b/moduleUtil/src/main/java/com/xscm/moduleutil/widget/AvatarFrameView.java @@ -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); } // 添加统一的播放完成处理方法 diff --git a/moduleroom/src/main/java/com/example/moduleroom/activity/RoomActivity.java b/moduleroom/src/main/java/com/example/moduleroom/activity/RoomActivity.java index ac2a425..afed34c 100644 --- a/moduleroom/src/main/java/com/example/moduleroom/activity/RoomActivity.java +++ b/moduleroom/src/main/java/com/example/moduleroom/activity/RoomActivity.java @@ -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() { +// +// @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 playQueue = new ArrayList(); + private Queue 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