在线直播系统源码,横向无限循环滚动的单行弹幕效果实现的相关代码
实现思路分析
要实现上面的效果,我们先拆分下实现要素:

1、弹幕布局是从屏幕的右侧向左侧滚动,单个弹幕之间的间距是固定的(设计要求)
2、弹幕要支持无限滚动,出于性能要求,如果不在屏幕内的,应该移除,不能无限追加到内存里面。
拆分完需求要素之后,针对上面的需求要素,做一下思路解答:

1、对于滚动和超出屏幕后移除,可以使用动画来实现,动画从屏幕右边开始移动到屏幕左边,监听如果已经动画结束,则remove掉布局。
2、无限循环效果,可以使用两个链表实现,一个保存加入到屏幕的弹幕数据(A),另一个保存未添加到屏幕的弹幕数据(B)。让进入屏幕前将布局从B中poll出来,添加到A中。反之,屏幕移除的时候从A中poll出来,添加到B中。
代码实现
首先创建出来一个弹幕数据对象类

data class Danmu(//头像var headerUrl: String? = null,//昵称var userName: String? = null,//信息var info: String? = null,
)

要被使用的弹幕itemView

class DanmuItemView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : LinearLayoutCompat(context, attrs, defStyleAttr) {private var danmuItemView: TextView? = nullvar danmu: Danmu? = nullinit {LayoutInflater.from(context).inflate(R.layout.danmu_item, this, true)danmuItemView = findViewById(R.id.tvDanmuItem)}fun setDanmuEntity(danmu: Danmu) {this.danmu = danmudanmuItemView?.text = "我是一个弹幕~~~~~哈哈哈哈哈哈" + danmu.userNamemeasure(0, 0)}
}

接下来就是弹幕布局的容器类,用来控制动画和数据交替。注意代码中有很有用的注释

class DanmuView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : FrameLayout(context, attrs, defStyleAttr) {private var mWidth = 0//为展示在屏幕上的弹幕数据private val mDanMuList = LinkedList<Danmu>()//屏幕中展示的弹幕数据private val mVisibleDanMuList = LinkedList<Danmu>()//判断是否在运行private val mIsRunning = AtomicBoolean(false)override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {super.onMeasure(widthMeasureSpec, heightMeasureSpec)mWidth = measuredWidth}/*** 添加弹幕数据*/fun enqueueDanMuList(danMuList: ArrayList<Danmu>) {danMuList.forEach {if (this.mDanMuList.contains(it).not()) {this.mDanMuList.add(it)}}if (mWidth == 0) {viewTreeObserver.addOnGlobalLayoutListener(object :ViewTreeObserver.OnGlobalLayoutListener {override fun onGlobalLayout() {mWidth = measuredWidthviewTreeObserver.removeOnGlobalLayoutListener(this)if (mIsRunning.get().not()) {mDanMuList.poll()?.apply {//这里是用来处理布局的交替工作,前面分析有说明mVisibleDanMuList.add(this)createDanMuItemView(this)}}}})} else {if (mIsRunning.get().not()) {mDanMuList.poll()?.apply {//这里是用来处理布局的交替工作,前面分析有说明mVisibleDanMuList.add(this)createDanMuItemView(this)}}}}private fun startDanMuAnimate(danMuItemView: DanmuItemView) {var isInit = falsedanMuItemView.animate()//注意这边设置的便宜量是容器布局的宽度+弹幕item布局的宽度,这样就确保滚动值刚好是从屏幕右侧外到屏幕左侧外.translationXBy((-(mWidth + danMuItemView.measuredWidth)).toFloat()).setDuration(6000).setInterpolator(LinearInterpolator()).setUpdateListener {val danMuTranslateX =(mWidth + danMuItemView.measuredWidth) * (it.animatedValue as Float)//这里是关键,用来确保每个item布局的间距一致,判断如果滚动进入屏幕的距离刚好是自身+20dp,也就是刚好空出来了20dp之后,紧接着下一个弹幕布局开始添加并动起来。if (danMuTranslateX >= danMuItemView.measuredWidth + Utils.convertDpToPixel(20F) && isInit.not()) {isInit = truemDanMuList.poll()?.apply {mVisibleDanMuList.add(this)createDanMuItemView(this)}}}.setListener(object : AnimatorListenerAdapter() {override fun onAnimationEnd(animation: Animator?) {if (mIsRunning.get().not()) {mIsRunning.set(true)}//很重要,在动画结束,也就是布局从屏幕移除之后,切记从布局中移除掉,//并且进行一波数据交替,方便实现无线循环danMuItemView.danmu?.let {mVisibleDanMuList.remove(it)mDanMuList.add(it)}removeView(danMuItemView)}}).start()}private fun createDanMuItemView(danMu: Danmu) {val danMuItemView = DanmuItemView(context).apply {setDanmuEntity(danMu)}//这里将布局添加之后,默认便宜到屏幕右侧出屏幕,造成布局总是从右												

在线直播系统源码,横向无限循环滚动的单行弹幕效果相关推荐

  1. 实现一个横向无限循环滚动的单行弹幕效果

    本期将带领大家实现一个这样的效果,支持无限循环的单行弹幕效果. 实现思路分析 要实现上面的效果,我们先拆分下实现要素: 1.弹幕布局是从屏幕的右侧向左侧滚动,单个弹幕之间的间距是固定的(设计要求) 2 ...

  2. 在线直播系统源码,多图加载成动画的形式如何实现

    在线直播系统源码,多图加载成动画的形式如何实现 1.设置 animationDrawable.addFrame(drawable, 1000);//添加图片生成的drawable,时间为1000ms ...

  3. 在线直播系统源码,自定义底部 BottomNavigationBar

    在线直播系统源码,自定义底部 BottomNavigationBar 一.封装viewmodel 在 viewmodel 中,我们需要定义一个当前选中下标,所有tabItem 的数组,还需要一个选中下 ...

  4. 在线直播系统源码功能设计方案

    在现代数字化时代,线上直播成为越来越流行的传媒方式,这也使得在线直播系统源码越来越受到人们的关注.在线直播系统源码不仅能够满足个人.团队.企业等多种需求,还可以为线上媒体提供有效的营销手段.本文将介绍 ...

  5. 基于Java毕业设计在线直播平台源码+系统+mysql+lw文档+部署软件

    基于Java毕业设计在线直播平台源码+系统+mysql+lw文档+部署软件 基于Java毕业设计在线直播平台源码+系统+mysql+lw文档+部署软件 本源码技术栈: 项目架构:B/S架构 开发语言: ...

  6. 一对一直播系统源码,一对一直播系统开发

    做为移动互联网下的新型娱乐模式,直播系统的开发平台可谓是异常的火热,大大小小的直播平台相继出现.经过这两年的发展,很多人早已经对直播行业没有太大的兴趣,.移动互联网时代里,虽然传统的直播仍旧占据了直播 ...

  7. 基于ssm jsp在线教育系统源码

    演示视频: 基于ssm jsp在线教育系统源码 范围 系统主要目标设计 随着互联网发展,在线教学成为一种支持知识共享,无距离知识交流的一种方式,我们的系统主要完成在线视频观看,在线教学,在线知识交流, ...

  8. 犹抱琵琶半遮面--探究直播系统源码的真面目

    犹抱琵琶半遮面--探究直播系统源码的真面目 复制代码 随着各种直播平台的相继出现,直播系统源码也慢慢浮出水面.直播系统源码主要功能和技术难点在于视频流的推送和播放过程,下面我们就简单了解一下呆萌直播的 ...

  9. 一对一直播系统源码开发,礼物打赏中追加、连击等功能的实现

    在一对一直播系统源码开发中,多种礼物打赏方式,才更能吸引用户的眼球,所在礼物打赏功能开发时,要实现追加.连击等功能. 一对一直播系统源码的礼物追加.连击功能是如何实现的呢?首先礼物从左边滑出,做一个连 ...

最新文章

  1. 2009全国公共英语五级(PETS-5)考试大纲概述
  2. 孩子有必要学python吗_不学就落后了?孩子都能学得Python编程,究竟是什么?
  3. android 调用.h文件,[Android Studio / NDK] 如何使用javah生成.h文件
  4. 有了它,从此走上炫酷的编码之路!
  5. 【jvm】java jvm 报错 OutOfMemoryError: GC overhead limit exceeded
  6. 蓝桥杯 ADV-120算法提高 6-17复数四则运算
  7. [转]5个JavaScript面试题
  8. 4 EDA实用技术与教程【基本语句1】
  9. Matlab mapminmax函数使用及原理
  10. 2020家用千兆路由器哪款好_企业级千兆路由器哪个牌子好?2020排名
  11. VS(visual studio)中使用ReportViewer控件和报表设计器 RDLC
  12. Prometheus监控学习笔记之Prometheus普罗米修斯监控入门
  13. mtk audio笔记
  14. 一键复制 html,最简单js代码实现一键复制文字
  15. 项目实训——2022
  16. FAQ 检索式问答系统学习记录
  17. 细胞培养常见问题分析
  18. 充电1分钟续航800km?揭秘菲斯科固态电池“神话”
  19. jersey (RESTful Web Service框架)
  20. 2021微信红包封面制作!人人都可以拥有自己的红包封面!安卓苹果都可!

热门文章

  1. javascript入门知识点总结(一)
  2. 使用git 换电脑以后解决不能提交或者更新问题
  3. python遍历字符串存入列表_Python遍历字符串的4种方式
  4. Vivado仿真卡在executing analysis and compilation step阶段
  5. 程序开发中:什么是前后端分离?你搞清楚了吗?
  6. WPS右键菜单添加自定义菜单
  7. solrj高亮功能简单应用
  8. python获取当前时间并格式化显示
  9. listagg字符串连接的结果过长
  10. 计算机毕设(附源码)JAVA-SSM家政服务预约小程序