一种弹幕显示方法、装置及电子设备与流程

文档序号:20086279发布日期:2020-03-13 06:18阅读:150来源:国知局
一种弹幕显示方法、装置及电子设备与流程

本发明涉及视频播放技术领域,特别涉及一种弹幕显示方法、装置及电子设备。



背景技术:

随时网络通信技术的进步和宽带网络的提速,网络视频应用在各个行业得到了越来越广泛的开展。直观而生动的高清视频应用,可以极大地拉近用户之间的距离,并达到最好的交流效果,而且成本相对最低,所以得到了各行业用户的普遍欢迎。

弹幕是互联网视频的一大特色。弹幕指直接显现在视频上的评论,可以以滚动、停留甚至更多动作特效方式出现在视频上,是观看视频的人发送的简短评论。“弹幕视频”顾名思义即带有“弹幕”的视频。很多网站提供视频发送弹幕的功能。

在现有技术中,弹幕显示方式通常是:每条弹幕信息占用一行,然后弹幕信息从对应行的左侧出现后,滚动显示至右侧消失;或者,弹幕信息从该行的右侧出现,滚动显示至左侧消失。

但是,当弹幕内容过多时,容易影响用户对视频的正常观看。现有技术中不支持对弹幕显示的个性化定制,当弹幕内容影响观看时,用户只能选择关闭全部弹幕。



技术实现要素:

本发明实施例提供了一种弹幕显示方法、装置及电子设备,有效的保证了弹幕数据的准确性,弹幕速度的快慢对集合中的数据的准确性无任何影响。

第一方面,本申请提供了一种弹幕显示方法,该方法包括:

定义一个list集合,所述list集合用于存储当前正在运行的弹幕信息;

构建一个map变量,并在map变量的codetotextview集合内部构建弹幕textview控件与弹幕的唯一标识符之间的映射关系,所述弹幕的唯一标识符是一个string类型的数据;

当弹幕准备进入屏幕执行移动动画时,获取当前屏幕显示的textview控件对应的弹幕的唯一标识符,将当前屏幕显示的textview控件对应的弹幕的唯一标识符添加到list集合中;

将当前屏幕显示的textview控件与弹幕的唯一标识符的映射关系存储到codetotextview集合中;

当当前屏幕显示的textview控件移出屏幕时,通过codetotextview集合中的映射关系获取当前屏幕显示的textview控件所对应的弹幕的唯一标识符,并将当前屏幕显示的textview控件所对应的弹幕的唯一标识符从list集合中移除;

获取用户的弹幕显示设置指令,所述指令中包括弹幕显示区域高度设置信息;

根据所述指令从所述list集合中取出所有的当前正在显示的弹幕textview控件对应的目标唯一标识符,并通过目标唯一标识符找到对应的目标textview控件;

获取所述目标textview控件当前在所述弹幕容器对象中的高度位置信息;

根据所述弹幕显示区域高度设置信息和所述目标textview控件当前在所述弹幕容器对象中的高度位置信息,调整所述目标textview控件在所述弹幕容器对象中的高度位置信息;

根据调整后的所述目标textview控件在所述弹幕容器对象中的高度位置信息显示视频中弹幕。

第二方面,本申请提供一种弹幕显示装置,该装置包括:

定义单元,用于定义一个list集合,所述list集合用于存储当前正在运行的弹幕信息;

构建单元,用于构建一个map变量,并在map变量的codetotextview集合内部构建弹幕textview控件与弹幕的唯一标识符之间的映射关系,所述弹幕的唯一标识符是一个string类型的数据;

添加单元,用于当弹幕准备进入屏幕执行移动动画时,获取当前屏幕显示的textview控件对应的弹幕的唯一标识符,将当前屏幕显示的textview控件对应的弹幕的唯一标识符添加到list集合中;

存储单元,用于将当前屏幕显示的textview控件与弹幕的唯一标识符的映射关系存储到codetotextview集合中;

移除单元,用于当当前屏幕显示的textview控件移出屏幕时,通过codetotextview集合中的映射关系获取当前屏幕显示的textview控件所对应的弹幕的唯一标识符,并将当前屏幕显示的textview控件所对应的弹幕的唯一标识符从list集合中移除;

获取单元,用于获取用户的弹幕显示设置指令,所述指令中包括弹幕显示区域高度设置信息;根据所述指令从所述list集合中取出所有的当前正在显示的弹幕textview控件对应的目标唯一标识符,并通过目标唯一标识符找到对应的目标textview控件;获取所述目标textview控件当前在所述弹幕容器对象中的高度位置信息;

调整单元,用于根据所述弹幕显示区域高度设置信息和所述目标textview控件当前在所述弹幕容器对象中的高度位置信息,调整所述目标textview控件在所述弹幕容器对象中的高度位置信息;

显示单元,用于根据调整后的所述目标textview控件在所述弹幕容器对象中的高度位置信息显示视频中弹幕。

第三方面,本发明还提供一种电子设备,包括:存储器,处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,其中,所述处理器执行所述计算机程序时可以实现第一方面中任一所述的方法。

本发明实施例通过定义一个list集合;构建一个map变量,并在map变量的codetotextview集合内部构建弹幕textview控件与弹幕的唯一标识符之间的映射关系;当弹幕准备进入屏幕执行移动动画时,获取当前屏幕显示的textview控件对应的弹幕的唯一标识符,将当前屏幕显示的textview控件对应的弹幕的唯一标识符添加到list集合中;将当前屏幕显示的textview控件与弹幕的唯一标识符的映射关系存储到codetotextview集合中;当当前屏幕显示的textview控件移出屏幕时,通过codetotextview集合中的映射关系获取当前屏幕显示的textview控件所对应的弹幕的唯一标识符,并将当前屏幕显示的textview控件所对应的弹幕的唯一标识符从list集合中移除;获取用户的弹幕显示设置指令;根据指令从list集合中取出所有的当前正在显示的弹幕textview控件对应的目标唯一标识符,并通过目标唯一标识符找到对应的目标textview控件;获取所述目标textview控件当前在所述弹幕容器对象中的高度位置信息;根据所述弹幕显示区域高度设置信息和所述目标textview控件当前在所述弹幕容器对象中的高度位置信息,调整所述目标textview控件在所述弹幕容器对象中的高度位置信息;根据调整后的所述目标textview控件在所述弹幕容器对象中的高度位置信息显示视频中弹幕。本发明实施例采用了集合list来存储当前正在运行的弹幕信息,从而有效的保证了listdanmu集合中的数据的准确性,弹幕速度的快慢对集合中的数据的准确性无任何影响。

附图说明

图1是本发明实施例中弹幕显示方法的一个实施例示意图;

图2是本发明是实施例中弹幕显示方法的另一个实施例示意图;

图3是本发明是实施例中弹幕显示方法的另一个实施例示意图;

图4是本发明是实施例中弹幕显示方法的另一个实施例示意图;

图5是本发明是实施例中弹幕显示方法的另一个实施例示意图;

图6是本发明实施例中弹幕显示装置的一个实施例示意图;

图7是本发明实施例中弹幕显示装置的另一个实施例示意图;

图8是本发明实施例中弹幕显示装置的另一个实施例示意图;

图9是本发明实施例中电子设备的一个实施例示意图。

具体实施方式

本发明实施例中弹幕显示方法应用于弹幕显示装置,该装置位于电子设备中,该电子设备可以是手机、平板电脑或者个人电脑等电子设备,也可以是未来出现有显示屏的电子设备等。

请参阅图1,本发明实施例中弹幕显示方法的一个实施例包括:

s101、构建视图控件;

在实现屏幕弹幕的时候首先需要动态构建一个视图控件,弹幕通常是一个文本信息,因此本发明在动态构建该弹幕文本信息的时候可以是通过android系统中的textview控件来进行构建的,即调用textview构建一个空的textview控件,具体的,调用textviewtextview=newtextview()构建一个空的textview控件。

s102、在视图控件填充弹幕相关的样式信息。

在构建视图控件之后,接下来需要对该新构建的视图控件填充弹幕相关的样式信息,进一步的,所述在所述视图控件填充弹幕相关的样式信息,包括:通过调用textview控件中的textview.settextcolor(color.white)将弹幕信息的文本信息设置成白色;通过调用textview.setsize(15sp)设置字体为15sp大小;通过调用textview.settext来设置具体的弹幕内容信息。这样给就完成了动态构建的弹幕信息textview控件的样式信息填充。构建完成上述textview控件后我们需要将该控件添加到弹幕区域中,为了方便描述我们将弹幕内容的容器标记为danmucontainer,danmucontainer中后续是容纳了具体的弹幕信息内容的。

s103、对视图控件的位置信息进行初始化操作。

在danmucontainer容器中添加textview控件之前首先需要对textview控件的位置信息进行相应的初始化操作。

s104、获取布局参数对象。

所述获取布局参数对象包括:通过调用viewgroup.layoutparamsparams=newviewgroup.layoutparams()方法来得到一个viewgroup的布局参数对象params。

s105、根据布局参数对象设置弹幕布局位置信息。

具体的,所述根据所述布局参数对象设置弹幕布局位置信息,包括:调用params对象中的params.width=viewgroup.layoutparams.wrap_content将宽度信息设置成包裹内容大小,也就是说宽度能够随着字体的长度动态变;同理,通过params对象中的params.height=viewgroup.layoutparams.wrap_content将高度信息设置成包裹内容,动态适配文字的高度信息。

s106、将弹幕布局位置信息添加到视图控件中。

设置弹幕布局位置信息之后,通过调用textview.setlayoutparams(params)方法将设置好的弹幕布局位置信息应用到动态构建的textview控件上,这样textview控件就具备了位置相关的信息了。

s107、将视图控件添加到预设的弹幕容器对象中。

具体的,通过调用danmucontainer对象中的danmucontainer.addview(textview)将动态构建好的textview控件添加到弹幕容器对象danmucontainer中。

s108、获取用户的弹幕显示设置指令。

具体的,该指令中包括弹幕显示区域高度设置信息,弹幕显示区域高度设置信息中包括设置弹幕显示区域高度的信息,以弹幕显示由全屏切换到半屏为例,弹幕全屏高度为danmuheight,则弹幕显示区域高度设置信息中弹幕显示区域高度信息为danmuheight/2。

本发明实施例中,通过调用danmucontainer容器中的danmucontainer.getheight()来获取到弹幕容器的整个高度信息,通常情况下danmucontainer容器的高度信息和视频窗口的高度信息是完全相同的,本发明实施例中将danmucontainer.getheight()的值标记为danmuheight;接下来通过调用一个随机函数来获取一个随机高度信息,具体是通过调用randomrandom=newrandom()来构建一个随机数生成器random,通过调用random对象中的random.netfloat(danmuheight)来获取0到danmuheight之间的一个高度信息,我们将获取的该高度信息标记为randomheight。接下来需要动态改变上述生成的textview控件在父布局danmucontainer中的高度位置信息,具体是通过调用params.margintop=randomheight来设置textview控件在父布局中距顶部的位置信息。后续就是通用的动画效果,将控件从屏幕一侧移动到另外一侧,本发明实施例中可以认为该动画效果的实现是一个现有技术,此处不做过多描述。

s109、根据指令调整视图控件在弹幕容器对象中的高度位置信息,根据高度位置信息显示视频中弹幕。

同样以切换全屏和半屏为例,切换全屏和半屏的按钮假设定义为button,通过为button设置点击的监听器,具体是通过调用button.setonclicklistener方法来为button设置了一个监听器信息。当用户点击按钮的时候回触发监听器的回调函数。本发明在回调函数中动态修改上述danmuheight的值信息,具体是通过调用danmuheight=danmuheight/2,这样danmuheight的值信息就是原来的一半了。再次执行上述逻辑的时候,弹幕的位置信息就只能占用为原来屏幕一半以内的一个随机值,这样就完成了半屏弹幕的切换工作。如果用户在半屏弹幕的时候再次点击该按钮,仅仅需要通过调用danmuheight=danmuheight*2的方法来将其进行还原到全屏幕的状态。这样就完成了全屏到半屏弹幕和半屏弹幕到全屏弹幕的切换方法,实现根据所述高度位置信息显示视频中弹幕。

本发明实施例能够有效的将弹幕内容显示高度进行自由切换,支持弹幕显示的个性化设置,通过这样的切换可以使得屏幕上的视频信息得以正常的展示出来,使得弹幕显示更加合理。

上述弹幕切换过程存在这样一个中间态的问题那就是如果一条弹幕已经在屏幕的下设定部分执行动画的时候,给用户的感觉就是点击了半屏弹幕不能够马上生效,而是需要过一段时间才能生效的错觉。

本发明实施例中针对上述问题给出了一套解决方法,通过该方法能够有效的解决切换速度慢的问题,能够当用户点击半屏弹幕的时候自动将当前正在显示的内容全部切换到设定的显示范围以内。具体请参阅图2,本发明实施例中弹幕显示方法的另一个实施例包括:

s201、构建一个显示弹幕的管理队列。

具体的,构建一个显示弹幕的管理队列,该管理队列用于维护当前正屏幕中间显示的弹幕信息,构建的管理队列信息是一个queue<string>danmushowqueue,接下来需要对该当前正在显示的弹幕队列danmushowqueue进行初始化操作,具体的初始化方法是danmushowqueue=newqueue<string>()。

s202、建立弹幕textview控件与弹幕的唯一标识符之间的对应关系。

上述构建的管理队列danmushowqueue中存储的是string类型的数据,传统方案中弹幕信息是一个textview控件,如果在管理队列中去缓存真实的弹幕textview控件信息的话,由于textview控件的内存开销较大,这样就会导致danmushowqueue队列的内存开销会非常大,但是又为了确保弹幕信息的维护,因此本发明实施例中存储的是弹幕的唯一标识符hashcode,该唯一标识符hashcode是一个string类型的数据。由于弹幕的唯一标识符hashcode的内存开销非常小,这样就能够有效的建立弹幕textview控件与唯一标识符hashcode之间的对应关系。

s203、当弹幕准备进入屏幕执行移动动画的时,获取当前屏幕显示的textview控件对应的弹幕的唯一标识符;

具体的当弹幕准备进入屏幕执行移动动画的时候,获取该textview对象中的hashcode,具体是通过调用textview.hashcode()方法来获取到当前屏幕显示的textview控件对应的弹幕唯一标识符tvhashcode。

s204、将当前屏幕显示的textview控件对应的弹幕的唯一标识符存储到管理队列中。

调用danmushowqueue队列中的danmushowqueue.add(tvhashcode)将当前屏幕显示的textview控件对应的弹幕的唯一标识符存储到danmushowqueue队列中。

s205、当当前屏幕显示的textview控件移出屏幕时,将当前屏幕显示的textview控件对应的弹幕的唯一标识符移出管理队列。

具体的,当当前屏幕显示的textview控件移出屏幕时,通过调用danmushowqueue.poll()将当前屏幕显示的textview控件对应的弹幕的唯一标识符从danmushowqueue队列中移除出去。

本发明实施例中,当多条弹幕在屏幕上显示的时候按照先后顺序往danmushowqueue队列中添加数据和移除数据,由于基本的弹幕信息都是匀速运行的,因此先进来的数据会先从屏幕上消失掉。通过动态的添加和删除,最终danmushowqueue中的数据永远都是当前屏幕中正在显示的弹幕内容。

s206、获取用户的弹幕显示设置指令,所述指令中包括弹幕显示区域高度设置信息。

本步骤的实施过程具体可参照步骤s108中描述的内容。

s207、根据指令从管理队列中取出所有的当前正在显示的弹幕textview控件对应的目标唯一标识符,并通过目标唯一标识符找到对应的目标textview控件。

具体的,即从danmushowqueue队列中取出所有的当前正在显示的textview控件对应的目标唯一标识符信息,通过弹幕的唯一标识符信息找到对应的目标textview控件。

s208、获取所述目标textview控件当前在所述弹幕容器对象中的高度位置信息。

具体的,获取所述目标textview控件当前在所述弹幕容器对象中的高度位置信息包括:调用目标textview控件中的textview.getlayoutparams()获取到该目标textview控件的布局参数信息params;通过调用params中的params.getheight()获取所述目标textview控件在所述弹幕容器对象中的高度位置信息。

s209、根据所述弹幕显示区域高度设置信息和所述目标textview控件当前在所述弹幕容器对象中的高度位置信息,调整所述目标textview控件在所述弹幕容器对象中的高度位置信息;

s210、根据调整后的所述目标textview控件在所述弹幕容器对象中的高度位置信息显示视频中弹幕。

以弹幕显示由全屏切换到半屏显示为例,当检测到用户点击切换半屏的状态的时候,即接收到用户的弹幕显示设置指令,就需要从danmushowqueue对内中取出所有的当前正在显示的弹幕textview的hashcode信息,通过hashcode找到对应的textview控件,然后调用textview控件中的textview.getlayoutparams()来获取到该textview控件的布局参数信息params,接下来我们通过调用params中的params.getheight()方法来获取到textview所在的高度信息,并将该高度信息标记为tvheight。

然后通过tvheight=tvheight/2来将tvheight的值信息变为原来的一半。通过调用上述获取的params对象中的params.height=tvheight方法将新的tvheight的值信息存储到params中,在调用该textview对象中的textview.setlayoutparams(params)来将新的布局信息设置到textview控件中,这样该textview控件的高度信息就变为原来的一半了,因此整个弹幕就变成了半屏弹幕的目标了。

本发明实施例中通过唯一标识符找到对应的textview控件,实现弹幕快速切换生效,能够有效的解决切换速度慢的问题,当用户点击设置弹幕高度之后自动将当前正在显示的内容全部切换到设置高度范围之内进行显示,弹幕显示切换效率高。

图2所示实施例中实现的时候默认条件是弹幕是匀速运行的,这样才能够保证danmushowqueue队列中数据的准确性。但是需求总是变化的,当弹幕的运动速度是非匀速的时候上述方案就无法正常执行了。因此本发明实施例中还提供一种弹幕显示方法,解决上述方案中非匀速情况下弹幕数据是如何进行维护的。

请参阅图3,为本发明实施例中弹幕显示方法的另一个实施例示意图,该方法包括:

s301、定义一个list集合。

由于上述方案中danmushowqueue是一个队列,队列的数据结构有一个顺序性,对于本实施例中方案算法的实施与开展不是非常适合,因此本实施例中在设计数据集合的时候不采用队列danmushowqueue的方式来进行实现,而是采用了集合list来存储当前正在运行的弹幕信息,即所述list集合用于存储当前正在运行的弹幕信息。

定义一个list集合,具体的定义方法是list<string>listdanmu,其中,listdanmu即为该list集合,接下来需要对listdanmu集合进行初始化操作,具体的初始化方法是通过调用listdanmu=newlist<string>()方法来对集合listdanmu进行初始化操作。

s302、构建一个map变量,并在map变量的codetotextview集合内部构建弹幕textview控件与弹幕的唯一标识符之间的映射关系。

其中,所述弹幕的唯一标识符是一个string类型的数据。

构建一个map变量:privatemap<textview,string>codetotextview;

在map变量codetotextview集合内部构建一个textview控件与弹幕的唯一标识符hashcode之间的映射关系。

另外,在对codetotextview集合使用之前,首先需要对codetotextview集合进行初始化操作,具体对codetotextview集合初始化的方法是通过调用codetotextview=newhashmap<textview,string>()实现。

s303、当弹幕准备进入屏幕执行移动动画时,获取当前屏幕显示的textview控件对应的弹幕的唯一标识符,将当前屏幕显示的textview控件对应的弹幕的唯一标识符添加到list集合中。

当弹幕准备进入屏幕执行移动动画时,即textview控件需要在屏幕上显示的时候,首先通过调用textview.hashcode()方法来获取当前屏幕显示的textview控件对应的弹幕的唯一标识符hashcode值信息tvhashcode。

所述将当前屏幕显示的textview控件对应的弹幕的唯一标识符添加到list集合中,包括:通过调用listdanmu.add(tvhashcode)将当前屏幕显示的textview控件对应的弹幕的唯一标识符添加到list集合中。

s304、将当前屏幕显示的textview控件与弹幕的唯一标识符的映射关系存储到codetotextview集合中。

具体的,所述将当前屏幕显示的textview控件与弹幕的唯一标识符的映射关系存储到codetotextview集合中,包括:通过调用codetotextview.put(textview,tvhashcode)方法将当前屏幕显示的textview控件与弹幕的唯一标识符的映射关系存储到codetotextview集合中。

s305、当当前屏幕显示的textview控件移出屏幕时,通过codetotextview集合中的映射关系获取当前屏幕显示的textview控件所对应的弹幕的唯一标识符,并将当前屏幕显示的textview控件所对应的弹幕的唯一标识符从list集合中移除。

具体的,所述当当前屏幕显示的textview控件移出屏幕时,通过codetotextview集合中的映射关系获取当前屏幕显示的textview控件所对应的弹幕的唯一标识符,并将当前屏幕显示的textview控件所对应的弹幕的唯一标识符从list集合中移除,包括:当当前屏幕显示的textview控件移出屏幕时,通过调用codetotextview.get(textview)获取当前屏幕显示的textview控件所对应的弹幕的唯一标识符;

通过调用listdanmu.remove(hashcode)将当前屏幕显示的textview控件所对应的弹幕的唯一标识符从list集合中移除。

通过上述的实现方式可以看出,无论哪个textview控件移出,都是从集合listdanmu移出该textview控件对应的hashcode,这样就避免了上述方案中管理队里的顺序性问题,从而有效的保证了listdanmu集合中的数据的准确性,弹幕速度的快慢对listdanmu集合中的数据的准确性无任何影响。

s306、获取用户的弹幕显示设置指令,所述指令中包括弹幕显示区域高度设置信息。

具体可以参照上述实施例中描述的内容。

s307、根据所述指令从所述list集合中取出所有的当前正在显示的弹幕textview控件对应的目标唯一标识符,并通过目标唯一标识符找到对应的目标textview控件;

具体的,所述根据所述指令从所述list集合中取出所有的当前正在显示的弹幕textview控件对应的目标唯一标识符,并通过目标唯一标识符找到对应的目标textview控件,包括:从list集合中取出所有的当前正在显示的textview控件对应的目标唯一标识符信息,通过弹幕的唯一标识符信息找到对应的目标textview控件。

s308、获取所述目标textview控件当前在所述弹幕容器对象中的高度位置信息。

具体的,所述获取所述目标textview控件当前在所述弹幕容器对象中的高度位置信息,包括:调用目标textview控件中的textview.getlayoutparams()获取到该目标textview控件的布局参数信息params;通过调用params中的params.getheight()获取所述目标textview控件在所述弹幕容器对象中的高度位置信息。

s309、根据所述弹幕显示区域高度设置信息和所述目标textview控件当前在所述弹幕容器对象中的高度位置信息,调整所述目标textview控件在所述弹幕容器对象中的高度位置信息。

s310、根据调整后的所述目标textview控件在所述弹幕容器对象中的高度位置信息显示视频中弹幕。

步骤s309和s310具体可以参照上面实施例中描述的内容,此处不再赘述。

本发明实施例采用了集合list来存储当前正在运行的弹幕信息,从而有效的保证了listdanmu集合中的数据的准确性,弹幕速度的快慢对集合中的数据的准确性无任何影响。

上述图2所示实施例和图3所示实施例在弹幕切换速度上有明显的提升,但是也存在一些问题,那就是切换过于突兀,突然一下全屏弹幕直接闪屏一下变成半屏弹幕效果,这样给人的感觉有点突然,看起来显示屏幕闪烁了一下,给用户的用户体验非常不友好,本发明实施例中还提供一个更加友好的切换过度方式,在保证切换速度的情况下,提供一种更加自然的过度切换方法,具体请参阅图4,为本发明实施例中弹幕显示方法的另一个实施例示意图,该方法包括:

s401、构建一个显示弹幕的管理队列。

其中,该管理队列用于维护当前正屏幕中间显示的弹幕信息;构建的管理队列信息是一个queue<string>danmushowqueue,接下来需要对该当前正在显示的弹幕队列danmushowqueue进行初始化操作,具体的初始化方法是danmushowqueue=newqueue<string>()。

s402、建立弹幕textview控件与弹幕的唯一标识符之间的对应关系。

上述构建的管理队列danmushowqueue中存储的是string类型的数据,传统方案中弹幕信息是一个textview控件,如果在管理队列中去缓存真实的弹幕textview控件信息的话,由于textview控件的内存开销较大,这样就会导致danmushowqueue队列的内存开销会非常大,但是又为了确保弹幕信息的维护,因此本发明实施例中存储的是弹幕的唯一标识符hashcode,该唯一标识符hashcode是一个string类型的数据。

由于弹幕的唯一标识符hashcode的内存开销非常小,这样就能够有效的建立弹幕textview控件与唯一标识符hashcode之间的对应关系。

s403、当弹幕准备进入屏幕执行移动动画的时,获取当前屏幕显示的textview控件对应的弹幕的唯一标识符。

具体的当弹幕准备进入屏幕执行移动动画的时候,获取该textview对象中的hashcode,具体是通过调用textview.hashcode()方法来获取到当前屏幕显示的textview控件对应的弹幕唯一标识符tvhashcode。

s404、将当前屏幕显示的textview控件对应的弹幕的唯一标识符存储到管理队列中。

具体的当弹幕准备进入屏幕执行移动动画的时候,获取该textview对象中的hashcode,具体是通过调用textview.hashcode()方法来获取到当前屏幕显示的textview控件对应的弹幕唯一标识符tvhashcode。

s405、当当前屏幕显示的textview控件移出屏幕时,将当前屏幕显示的textview控件对应的弹幕的唯一标识符移出管理队列。

具体的,当当前屏幕显示的textview控件移出屏幕时,通过调用danmushowqueue.poll()将当前屏幕显示的textview控件对应的弹幕的唯一标识符从danmushowqueue队列中移除出去。

本发明实施例中,当多条弹幕在屏幕上显示的时候按照先后顺序往danmushowqueue队列中添加数据和移除数据,由于基本的弹幕信息都是匀速运行的,因此先进来的数据会先从屏幕上消失掉。通过动态的添加和删除,最终danmushowqueue中的数据永远都是当前屏幕中正在显示的弹幕内容。

s406、获取用户的弹幕显示设置指令;根据所述指令从所述管理队列中取出所有的当前正在显示的弹幕textview控件对应的目标唯一标识符,并通过目标唯一标识符找到对应的目标textview控件;

具体的,可以参照步骤s206和s207中的描述内容,此处不再赘述。

s407、设定所述目标textview控件在屏幕水平移动距离sx。

为了实现平滑切换成半屏弹幕,在设计的时候预期在水平移动sx的距离的时候完成整个切换过程。其中sx是一个阈值该阈值一定是小于屏幕的宽度的,通过调整sx的距离大小可以间接的调整过度的平滑度。

s408、将弹幕的水平移动速度标记为vx,通过sx/vx计算弹幕平滑变化的时间dt。

具体的,弹幕的移动速度通常是确定的,将弹幕的水平移动速度标记为vx,因此就可以通过sx/vx的方式来计算出平滑变化的时间dt。

s409、根据所述弹幕显示区域高度设置信息,计算在dt时间内运动的垂直距离和垂直速度vy。

以弹幕由全屏切换到半屏为例,对于垂直方向需要变换的距离是tvheight-tvheight/2=tvheight/2,也就是说需要在dt的时间内完成的垂直距离的为tvheight/2,因此就可以计算出垂直的运动速度为tvheight/2dt,我们将该速度标记为vy。

根据物理的速度的关系,将速度分解成vx和vy这样2个方向,那么整个textview控件运动的真实方向将会是斜线方向。即最终textview控件的运动轨迹将会是一条匀速斜线的运动,这样就不会出现直接切换到高度的1/2的闪屏的问题了。

s410、获取目标textview控件预设的水平动画,根据dt和vy为所述目标textview控件构建一个垂直动画;定义一个组合动画,并将所述水平动画和所述垂直动画添加到组合动画的对象中。

本实施例中,获取目标textview控件预设的水平动画,具体获取的方式是通过调用textview控件中的textview.getanimation()就可以得到当前的水平动画animx。

由于得到了vy和和dt,因此可以对textview控件添加一个纵向运动的动画,具体的动画构建过程是定义一个objectanimator类型的manimatortranslatey对象。具体的,根据dt和vy为所述目标textview控件构建一个垂直动画包括:

定义一个objectanimator类型的manimatortranslatey对象;

调用objectanimator.offloat(textview,"translationy",tvheight,tvheight’)构建运动速度为vy的垂直动画,其中,该objectanimator.offloat函数是对目标textview控件执行垂直动画,该垂直动画的起始点是tvheight,目标结束点是tvheight’,返回值的是manimatortranslatey对象信息;

调用manimatortranslatey对象中的manimatortranslatey.setduration(dt)将垂直动画的执行周期dt设置到对象manimatortranslatey中。

本发明实施例中,需要定义一个组合动画animationsetanimset,并且通过调用animationset中的构造函数来对animset进行初始化,具体是通过调用animset=newanimationset()来进行初始化。然后调用animset.add(animx)和调用animset.add(manimatortranslatey),这样就将水平动画和垂直动画都添加到了animset对象中。

s411、通过调用组合动画开启水平动画和垂直动画的执行,在视频中实现基于所述目标textview控件的弹幕显示。

由于将水平动画和垂直动画都添加到了animset对象中,最终通过调用animset对象中的animset.startanim()方法开启水平和垂直动画的执行,在视频中实现基于所述目标textview控件的弹幕显示。

本发明实施例通过调整sx的大小来调整整个切换的平滑程度,进而实现了平滑切换的目标,通过这样的切换可以使得弹幕切换更加平滑,弹幕显示更加合理。

上述定义的sx是一个固定值信息,当弹幕信息移动到屏幕的靠近结束为止的时候,此时就会出现一个问题那就是剩余距离比sx要小,此时如果按照上述的实现方式来执行就会导致该弹幕无法移动到设定范围内就已经移出屏幕了,这样的效果给人的感觉就是控制逻辑存在异常,本发明实施例中针对该问题提供了一种解决方案,使得这种特殊场景下的时候弹幕依旧可以移动到范围内再移出。具体的,请参阅图5,为本发明实施例中弹幕显示方法的另一个实施例示意图,该方法包括:

s501、构建一个显示弹幕的管理队列。

s502、建立弹幕textview控件与弹幕的唯一标识符之间的对应关系。

其中,所述弹幕的唯一标识符是一个string类型的数据。

s503、当弹幕准备进入屏幕执行移动动画的时,获取当前屏幕显示的textview控件对应的弹幕的唯一标识符。

s504、将当前屏幕显示的textview控件对应的弹幕的唯一标识符存储到管理队列中。

s505、当当前屏幕显示的textview控件移出屏幕时,将当前屏幕显示的textview控件对应的弹幕的唯一标识符移出管理队列。

s506、获取用户的弹幕显示设置指令,根据所述指令从所述管理队列中取出所有的当前正在显示的弹幕textview控件对应的目标唯一标识符,并通过目标唯一标识符找到对应的目标textview控件。

s507、设定目标textview控件在屏幕水平移动距离sx。

本实施例中步骤s501~s507具体可以参照图4所示实施例中步骤s401~s407中的具体实施过程,此处不再赘述。

s508、计算目标textview控件完全移出屏幕所需要移动的距离reallydistance。

当用户点击弹幕切换按钮的时候,首先获取textview控件当前所在的位置信息,具体的获取方法是通过调用textview控件中的textview.getlayoutparams()来获取到当前的textview控件的布局参数信息layoutparams,接下来调用layoutparams中的layoutparams.getwidth获取到的是当前textview控件所在的x轴的坐标信息,此处将该值标记为textviewx。

textview控件本身是有一个自身的宽度信息的,上述获取到的位置信息通常都是textview控件的左上角所在的位置信息,因此视图完全移除出去的举例是需要加上textview控件本身的长度信息的,获取textview控件的长度信息的是通过调用textview控件中的textview.getwidth()来获取到textview自身的长度信息,此处将该长度信息标记为textviewwidth。

因此当前textview控件完全移出屏幕所需要移动的距离是textviewx+textviewwidth,此处将该具体标记为reallydistance。

s509、比较sx和reallydistance之间的大小,若sx的值比reallydistance的值大,将弹幕的水平移动速度标记为vx,通过reallydistance/vx计算弹幕平滑变化的时间dt。

具体的,就需要比较reallydistance和sx的大小信息,如果sx的值比reallydistance的值大,此时我们就以sx的值为准,具体的实现方式如图4实施例中所示中所述。即若sx的值比reallydistance的值小,通过sx/vx计算弹幕平滑变化的时间dt’;根据所述弹幕显示区域高度设置信息,计算在dt’时间内运动的垂直距离和垂直速度vy’;获取所述目标textview控件预设的水平动画;根据dt’和vy’为所述目标textview控件构建一个第二垂直动画;定义组合动画,并将所述水平动画和第二垂直动画添加到组合动画的对象中;通过调用组合动画开启水平动画和第二垂直动画的执行,在视频中实现基于所述目标textview控件的弹幕显示。具体实施过程可参照图4所示实施例。

如果sx的值比reallydistance的值大,此时就说明剩余距离不足以将视图移动到屏幕内部,因此需要对该种情况做特殊处理,即将弹幕的水平移动速度标记为vx,通过reallydistance/vx计算弹幕平滑变化的时间dt。

s510、根据弹幕显示区域高度设置信息,计算在dt’时间内运动的垂直距离和垂直速度vy。

本实施例中,同样以半屏为例,获取到垂直移动距离tvheight/2(具体获取方法如上述图4实施例中描述一致),如果垂直速度为tvheight/2dt,将该速度标记为为vy就会出现刚好移除出去的时候达到半屏以内,起始这种情况下就已经失去了进入半屏的意义了,为了能够保证视图textview控件在没有移出前到达半屏内,因此需要对vy做一个特殊的处理,需要将vy的速度提高到原来的1.5倍,也就是1.5vy,这样就能够保证纵向的速度更快的运动,从而就能够在视图还没有移动出去情况下确保视图能够到达在半屏内部。

除了上述增加y轴速度一位,还可以采取将vx的速度降低的方式来达到上述效果,例如可以将vx的速度降低到原来的一半,也就是1/2vx,这样达到的效果也是一致的,甚至是可以将上述两个效果进行叠加来达到一种更友好的过度体验。

s511、获取目标textview控件预设的水平动画;根据dt和1.5vy为目标textview控件构建一个第一垂直动画;定义组合动画,并将水平动画和第一垂直动画添加到组合动画的对象中。

本实施例中,获取目标textview控件预设的水平动画,具体获取的方式是通过调用textview控件中的textview.getanimation()就可以得到当前的水平动画animx。

所述根据dt和1.5vy为所述目标textview控件构建一个第一垂直动画,包括:

定义一个objectanimator类型的manimatortranslatey对象;

调用objectanimator.offloat(textview,"translationy",tvheight,tvheight’)构建运动速度为1.5vy的第一垂直动画,其中,该objectanimator.offloat函数是对目标textview控件执行第一垂直动画,该第一垂直动画的起始点是tvheight,目标结束点是tvheight’,返回值的是manimatortranslatey对象信息;

调用manimatortranslatey对象中的manimatortranslatey.setduration(dt)将第一垂直动画的执行周期dt设置到对象manimatortranslatey中。

本发明实施例中,需要定义一个组合动画animationsetanimset,并且通过调用animationset中的构造函数来对animset进行初始化,具体是通过调用animset=newanimationset()来进行初始化。然后调用animset.add(animx)和调用animset.add(manimatortranslatey),这样就将水平动画和第一垂直动画都添加到了animset对象中。

s512、通过调用组合动画开启水平动画和第一垂直动画的执行,在视频中实现基于所述目标textview控件的弹幕显示。

由于将水平动画和第一垂直动画都添加到了animset对象中,最终通过调用animset对象中的animset.startanim()方法开启水平和第一垂直动画的执行,在视频中实现基于所述目标textview控件的弹幕显示。

本发明实施例中通过比较textview控件完全移除屏幕的移动距离reallydistance和sx的大小,在reallydistance小于sx时,调整垂直移动速度到1.5vy,鼻毛弹幕无法移动到设定范围内就已经移出屏幕的情况,在支持弹幕显示的个性化设置的同时使得弹幕显示更加合理。

下面介绍本发明实施例中弹幕显示装置的实施例。

请参阅图6,为本发明实施例中弹幕显示装置的一个实施例示意图,该装置包括:

构建单元601,用于构建视图控件;

填充单元602,用于在所述视图控件填充弹幕相关的样式信息;

初始化单元603,用于对所述视图控件的位置信息进行初始化操作;

第一获取单元604,用于获取布局参数对象;

设置单元605,用于根据所述布局参数对象设置弹幕布局位置信息;

添加单元606,用于将所述弹幕布局位置信息添加到所述视图控件中,并将所述视图控件添加到预设的弹幕容器对象中;

第二获取单元607,用于获取用户的弹幕显示设置指令,所述指令中包括弹幕显示区域高度设置信息;

显示单元608,用于根据所述指令调整所述视图控件在所述弹幕容器对象中的高度位置信息,根据所述高度位置信息显示视频中弹幕。

可选的,所述构建单元601具体用于:

调用textview构建一个空的textview控件;

所述填充单元602具体用于:

通过调用textview对象中的textview.settextcolor(color.white)将弹幕信息的文本信息设置成白色;

通过调用textview.setsize(15sp)设置字体为15sp大小;

通过调用textview.settext来设置具体的弹幕内容信息。

可选的,所述第一获取单元604具体用于:

通过调用viewgroup.layoutparamsparams=newviewgroup.layoutparams()方法来得到一个viewgroup的布局参数对象params;

所述设置单元605具体用于:

调用params对象中的params.width=viewgroup.layoutparams.wrap_content将宽度信息设置成包裹内容大小;

通过params对象中的params.height=viewgroup.layoutparams.wrap_content将高度信息设置成包裹内容,动态适配文字的高度信息。

可选的,所述添加单元606具体用于:

通过调用textview.setlayoutparams(params)将设置好的弹幕布局位置信息params应用到textview控件上;

调用danmucontainer对象中的danmucontainer.addview(textview将textview控件添加到弹幕容器对象danmucontainer中。

可选的,所述显示单元608具体用于:

通过调用danmucontainer容器中的danmucontainer.getheight()获取到弹幕容器的整个高度信息danmuheight;

通过调用randomrandom=newrandom()构建一个随机数生成器random;

通过调用random对象中的random.netfloat(danmuheight)获取0到danmuheight之间的高度信息randomheigh;

根据所述弹幕显示区域高度设置信息,通过调用params.margintop=randomheight方法设置textview控件在父布局中距顶部的位置信息,实现调整弹幕的高度位置信息,根据所述高度位置信息显示视频中弹幕。

请参阅图7,为本发明实施例中弹幕显示装置的另一个实施例示意图,该装置包括:

构建单元701,用于构建一个显示弹幕的管理队列,所述管理队列用于维护当前正屏幕中间显示的弹幕信息;

建立单元702,用于建立弹幕textview控件与弹幕的唯一标识符之间的对应关系,所述弹幕的唯一标识符是一个string类型的数据;

第一获取单元703,用于当弹幕准备进入屏幕执行移动动画的时,获取当前屏幕显示的textview控件对应的弹幕的唯一标识符;

队列管理单元704,用于将当前屏幕显示的textview控件对应的弹幕的唯一标识符存储到所述管理队列中;当当前屏幕显示的textview控件移出屏幕时,将当前屏幕显示的textview控件对应的弹幕的唯一标识符移出所述管理队列;

第二获取单元705,用于获取用户的弹幕显示设置指令,所述指令中包括弹幕显示区域高度设置信息;

第三获取单元706,用于根据所述指令从所述管理队列中取出所有的当前正在显示的弹幕textview控件对应的目标唯一标识符,并通过目标唯一标识符找到对应的目标textview控件;获取所述目标textview控件当前在所述弹幕容器对象中的高度位置信息;

调整单元707,用于根据所述弹幕显示区域高度设置信息和所述目标textview控件当前在所述弹幕容器对象中的高度位置信息,调整所述目标textview控件在所述弹幕容器对象中的高度位置信息;

显示单元708,用于根据调整后的所述目标textview控件在所述弹幕容器对象中的高度位置信息显示视频中弹幕。

可选的,所述第一获取单元703具体用于:通过调用textview.hashcode()获取当前屏幕显示的textview控件对应的弹幕的唯一标识符tvhashcode。

可选的,所述管理队列为danmushowqueue队列,所述队列管理单元704具体用于:

调用danmushowqueue队列中的danmushowqueue.add(tvhashcode)将当前屏幕显示的textview控件对应的弹幕的唯一标识符存储到danmushowqueue队列中;

当当前屏幕显示的textview控件移出屏幕时,通过调用danmushowqueue.poll()将当前屏幕显示的textview控件对应的弹幕的唯一标识符从danmushowqueue队列中移除出去。

可选的,所述第三获取单元706具体用于:

从danmushowqueue队列中取出所有的当前正在显示的textview控件对应的目标唯一标识符信息,通过弹幕的唯一标识符信息找到对应的目标textview控件;

所述获取所述目标textview控件当前在所述弹幕容器对象中的高度位置信息,包括:

调用目标textview控件中的textview.getlayoutparams()获取到该目标textview控件的布局参数信息params;

通过调用params中的params.getheight()获取所述目标textview控件在所述弹幕容器对象中的高度位置信息。

请参阅图8,为本发明实施例中弹幕显示装置的另一个实施例示意图,该装置包括:

定义单元801,用于定义一个list集合,所述list集合用于存储当前正在运行的弹幕信息;

构建单元802,用于构建一个map变量,并在map变量的codetotextview集合内部构建弹幕textview控件与弹幕的唯一标识符之间的映射关系,所述弹幕的唯一标识符是一个string类型的数据;

添加单元803,用于当弹幕准备进入屏幕执行移动动画时,获取当前屏幕显示的textview控件对应的弹幕的唯一标识符,将当前屏幕显示的textview控件对应的弹幕的唯一标识符添加到list集合中;

存储单元804,用于将当前屏幕显示的textview控件与弹幕的唯一标识符的映射关系存储到codetotextview集合中;

移除单元805,用于当当前屏幕显示的textview控件移出屏幕时,通过codetotextview集合中的映射关系获取当前屏幕显示的textview控件所对应的弹幕的唯一标识符,并将当前屏幕显示的textview控件所对应的弹幕的唯一标识符从list集合中移除;

获取单元806,用于获取用户的弹幕显示设置指令,所述指令中包括弹幕显示区域高度设置信息;根据所述指令从所述list集合中取出所有的当前正在显示的弹幕textview控件对应的目标唯一标识符,并通过目标唯一标识符找到对应的目标textview控件;获取所述目标textview控件当前在所述弹幕容器对象中的高度位置信息;

调整单元807,用于根据所述弹幕显示区域高度设置信息和所述目标textview控件当前在所述弹幕容器对象中的高度位置信息,调整所述目标textview控件在所述弹幕容器对象中的高度位置信息;

显示单元808,用于根据调整后的所述目标textview控件在所述弹幕容器对象中的高度位置信息显示视频中弹幕。

可选的,所述添加单元803具体用于:

通过调用textview.hashcode()获取当前屏幕显示的textview控件对应的弹幕的唯一标识符。

可选的,所述添加单元803具体还用于:

通过调用listdanmu.add(tvhashcode)将当前屏幕显示的textview控件对应的弹幕的唯一标识符添加到list集合中;

所述存储单元804具体用于:通过调用codetotextview.put(textview,tvhashcode)方法将当前屏幕显示的textview控件与弹幕的唯一标识符的映射关系存储到codetotextview集合中。

可选的,所述移除单元805具体用于:当当前屏幕显示的textview控件移出屏幕时,通过调用codetotextview.get(textview)获取当前屏幕显示的textview控件所对应的弹幕的唯一标识符;

通过调用listdanmu.remove(hashcode)将当前屏幕显示的textview控件所对应的弹幕的唯一标识符从list集合中移除。

本发明实施例中还提供一种电子设备,请参见图9,所述电子设备包括:

存储器901,处理器902及存储在所述存储器上并可在所述处理器上运行的计算机程序903,其中,所述处理器902执行所述计算机程序903时可以实现上述弹幕显示方法。

以上所述,以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1