From d02a359cda8d9e5d8ab2ee885a2e8f2b8abde5cc Mon Sep 17 00:00:00 2001 From: 285275534 <285275534@qq.com> Date: Thu, 26 May 2022 22:32:10 +0800 Subject: [PATCH] first submit --- README.md | 75 ++++++++++--------- app/build.gradle | 2 +- .../dq/livemessagedemo/tool/QApplication.kt | 8 +- 3 files changed, 40 insertions(+), 45 deletions(-) diff --git a/README.md b/README.md index b56649b..1f9ef59 100644 --- a/README.md +++ b/README.md @@ -2,30 +2,34 @@ ## 简介: -下拉拖拽关闭Activity,下拉返回Activity。仿大众点评、快手、小红书详情界面:可下滑关闭详情界面。 -Drag down to close activity +直播间聊天消息RecyclerView列表,直播间RecyclerView。采用3层缓存机制,一秒内收到几百条消息依然不卡顿。 +ChatRoom in LiveRoom.Using the three kind of cache strategy and async in HandlerThread.Can carry many messages ## 安装体验: -![](https://upload-images.jianshu.io/upload_images/26002059-94273eadb7cf0295.png) +![](https://upload-images.jianshu.io/upload_images/26002059-97c094d65ebedd5f.png) ## 功能(优点): -- ✅Demo包含`瀑布列表跳转到详情,带动画`+`详情可左滑进入个人主页`+`下拉拖拽关闭Activity` -- ✅到为了让Activity的xml布局层级最少,只需要把本库设置为最外层的RelativeLayout -- ✅仿大众点评:下拉过程中除了图片,别的部分随着下拉距离而半透明 -- ✅仿快手:fling快速下滑也可触发关闭 -- ✅详情界面可左滑进入个人主页,你可以自己实现懒加载 -- ✅解决下拉返回ImageView闪一下问题 -- ✅完美解耦,可轻松让你的任何Activity实现下拉关闭效果 +- ✅采用3层缓存机制 + 异步解析ImageSpan。一秒内收到几百条消息依然不卡顿 +- ✅可配置RecyclerView最短刷新时间间隔 +- ✅可配置在短时间内如果收到太多消息可选择丢弃消息 +- ✅根据缓冲区消息数量选择不同的ScrollToBottom速度 +- ✅Demo中提供"底部还有XX条未读消息"的处理方式 +- ✅Demo中提供弹幕中仿抖音的"粉丝团"标签处理方式 +- ✅内存占用控制的很好,收到再多消息帧数也控制在55以上 +- ✅完美解耦,无内存泄漏,接入很简单 -## 作者说明: -- Android系统的Activity过场动画会让shareElementImageView.setAlpha(0);然后回退动画结束再进行.setAlpha(1) -- 这样会导致一个问题:我们下拉返回的时候,由于弹回动画是我们自己做的。但是系统依然会再进行一遍.setAlpha(1),导致回弹动画结束时候图片会闪一下。参考下面的第1个gif -- 为了解决"闪一下"的问题,我用这种方法把他提前设为.setAlpha(1) +## 具体技术说明: +- 第一层缓存:消息的标签ImageSpan缓存,比如"榜1" "等级" "粉丝团等级" +- 第二层缓存:收到消息时候,检查上次刷新时间。如果刚上次刚刷新不到0.n秒,那么就插入到缓冲区。0.n秒后将全部缓冲区显示出来再清空缓冲区 +- 第三层缓存:model中的SpannableString。让用户手指滚动列表更顺畅,无需再次解析SpannableString +- 额外缓存:解析标签ImageSpan时候全程只采用一个TextView,避免每次都new,json解析也是如此 +- 异步解析:解析完整的(3个)SpannableString在低性能手机上最慢需要20-40ms。会造成丢帧。本库采用HandlerThread解析 +- 提供策略模式解析标签ImageSpan,拓展性极强 ## 效果gif图(Gif图有点卡,实际运行一点都不卡): -![](https://upload-images.jianshu.io/upload_images/26002059-96c272f540bddb21.gif) -![](https://upload-images.jianshu.io/upload_images/26002059-da019a1de650eca8.gif) +![](https://upload-images.jianshu.io/upload_images/26002059-536ebf49fa017bd3.gif) +![](https://upload-images.jianshu.io/upload_images/26002059-4809cca72bd1c551.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/640) ## 导入 ``` @@ -37,34 +41,31 @@ Drag down to close activity } dependencies { - implementation 'com.github.QDong415:QLiveMessage:v1.0.1' + implementation 'com.github.QDong415:QLiveMessageHelper:v1.0' } ``` ## 使用 ```java - QDragRelativeLayout contentLayout = findViewById(R.id.drag_layout); - contentLayout.setOnLiveMessageListener(this); - //传入列表的点击项目的ImageView的坐标 - contentLayout.setupFromImageView(fromX, fromY, fromWidth, fromHeight, transition_share_view); -``` -```xml - - - - - - - - - - - - - - +//给我们的库 liveMessageRecyclerHelper,绑定recyclerView + liveMessageRecyclerHelper.setRecyclerView(recyclerView) + liveMessageRecyclerHelper.setUnreadTipsView(unreadTipsTextView) + liveMessageRecyclerHelper.messageRecyclerHelperListener = object: LiveMessageRecyclerHelper.LiveMessageRecyclerHelperListener { + override fun unreadMessageCountUpdate(unreadCount: Int) { + unreadTipsTextView.setText("还有"+unreadCount +"条未读") + } + + override fun asyncParseSpannableString(model: LiveMessageModel) { + //这一步是在子线程中 + model.spannableString = liveMessageTextViewHelper.displaySpannableString(model) + } + } + + //RecyclerView最短刷新时间间隔(0秒 - 2.0秒) + liveMessageRecyclerHelper.diffRefreshDuration = (intent.getFloatExtra("minRefreshTime",0.6f) * 1000).toLong() + ``` diff --git a/app/build.gradle b/app/build.gradle index 0f5f2f6..ff4197f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -43,7 +43,7 @@ dependencies { implementation 'com.squareup.retrofit2:converter-moshi:2.9.0' //性能监控 kotlin编译插件为1.3.72; 支持Gradle 6.8及以下 - debugImplementation 'io.github.didi.dokit:dokitx:3.5.0.1' +// debugImplementation 'io.github.didi.dokit:dokitx:3.5.0.1' implementation project(path: ':liveMessage') diff --git a/app/src/main/java/com/dq/livemessagedemo/tool/QApplication.kt b/app/src/main/java/com/dq/livemessagedemo/tool/QApplication.kt index 6231b05..d8fa69b 100644 --- a/app/src/main/java/com/dq/livemessagedemo/tool/QApplication.kt +++ b/app/src/main/java/com/dq/livemessagedemo/tool/QApplication.kt @@ -1,12 +1,6 @@ package com.dq.livemessagedemo.tool import android.app.Application -import android.util.Log -import com.didichuxing.doraemonkit.DoKit -import com.dq.livemessagedemo.model.LiveMessageIntrinsicModel -import com.dq.livemessagedemo.model.LiveMessageModel -import com.squareup.moshi.Moshi -import java.util.* class QApplication : Application(){ @@ -24,7 +18,7 @@ class QApplication : Application(){ instance = this socketManager = SocketManager() - DoKit.Builder(this).build() +// DoKit.Builder(this).build() } } \ No newline at end of file