在线直播系统源码,横向无限循环滚动的单行弹幕效果
在线直播系统源码,横向无限循环滚动的单行弹幕效果实现的相关代码
实现思路分析
要实现上面的效果,我们先拆分下实现要素:
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.弹幕布局是从屏幕的右侧向左侧滚动,单个弹幕之间的间距是固定的(设计要求) 2 ...
- 在线直播系统源码,多图加载成动画的形式如何实现
在线直播系统源码,多图加载成动画的形式如何实现 1.设置 animationDrawable.addFrame(drawable, 1000);//添加图片生成的drawable,时间为1000ms ...
- 在线直播系统源码,自定义底部 BottomNavigationBar
在线直播系统源码,自定义底部 BottomNavigationBar 一.封装viewmodel 在 viewmodel 中,我们需要定义一个当前选中下标,所有tabItem 的数组,还需要一个选中下 ...
- 在线直播系统源码功能设计方案
在现代数字化时代,线上直播成为越来越流行的传媒方式,这也使得在线直播系统源码越来越受到人们的关注.在线直播系统源码不仅能够满足个人.团队.企业等多种需求,还可以为线上媒体提供有效的营销手段.本文将介绍 ...
- 基于Java毕业设计在线直播平台源码+系统+mysql+lw文档+部署软件
基于Java毕业设计在线直播平台源码+系统+mysql+lw文档+部署软件 基于Java毕业设计在线直播平台源码+系统+mysql+lw文档+部署软件 本源码技术栈: 项目架构:B/S架构 开发语言: ...
- 一对一直播系统源码,一对一直播系统开发
做为移动互联网下的新型娱乐模式,直播系统的开发平台可谓是异常的火热,大大小小的直播平台相继出现.经过这两年的发展,很多人早已经对直播行业没有太大的兴趣,.移动互联网时代里,虽然传统的直播仍旧占据了直播 ...
- 基于ssm jsp在线教育系统源码
演示视频: 基于ssm jsp在线教育系统源码 范围 系统主要目标设计 随着互联网发展,在线教学成为一种支持知识共享,无距离知识交流的一种方式,我们的系统主要完成在线视频观看,在线教学,在线知识交流, ...
- 犹抱琵琶半遮面--探究直播系统源码的真面目
犹抱琵琶半遮面--探究直播系统源码的真面目 复制代码 随着各种直播平台的相继出现,直播系统源码也慢慢浮出水面.直播系统源码主要功能和技术难点在于视频流的推送和播放过程,下面我们就简单了解一下呆萌直播的 ...
- 一对一直播系统源码开发,礼物打赏中追加、连击等功能的实现
在一对一直播系统源码开发中,多种礼物打赏方式,才更能吸引用户的眼球,所在礼物打赏功能开发时,要实现追加.连击等功能. 一对一直播系统源码的礼物追加.连击功能是如何实现的呢?首先礼物从左边滑出,做一个连 ...
最新文章
- 2009全国公共英语五级(PETS-5)考试大纲概述
- 孩子有必要学python吗_不学就落后了?孩子都能学得Python编程,究竟是什么?
- android 调用.h文件,[Android Studio / NDK] 如何使用javah生成.h文件
- 有了它,从此走上炫酷的编码之路!
- 【jvm】java jvm 报错 OutOfMemoryError: GC overhead limit exceeded
- 蓝桥杯 ADV-120算法提高 6-17复数四则运算
- [转]5个JavaScript面试题
- 4 EDA实用技术与教程【基本语句1】
- Matlab mapminmax函数使用及原理
- 2020家用千兆路由器哪款好_企业级千兆路由器哪个牌子好?2020排名
- VS(visual studio)中使用ReportViewer控件和报表设计器 RDLC
- Prometheus监控学习笔记之Prometheus普罗米修斯监控入门
- mtk audio笔记
- 一键复制 html,最简单js代码实现一键复制文字
- 项目实训——2022
- FAQ 检索式问答系统学习记录
- 细胞培养常见问题分析
- 充电1分钟续航800km?揭秘菲斯科固态电池“神话”
- jersey (RESTful Web Service框架)
- 2021微信红包封面制作!人人都可以拥有自己的红包封面!安卓苹果都可!
热门文章