一种弹幕效果的实现方法与流程

文档序号:15568834发布日期:2018-09-29 03:58阅读:431来源:国知局

本发明涉及弹幕效果交互技术领域,具体说是一种弹幕效果的实现方法。



背景技术:

现有的直播平台,为了提高播主和直播用户的互动,都提供弹幕效果供播主和直播用户使用。在android原生系统中,没有提供弹幕相关的控件,需要开发人员自定义。常见的解决方案是:自定义view在主线程对控件进行平移动画来实现弹幕效果,这种方案缺点在于:view的刷新会使整个界面都重新绘制,造成系统资源的大量浪费,cpu使用率高,耗电等问题。



技术实现要素:

针对现有技术中存在的缺陷,本发明的目的在于提供一种弹幕效果的实现方法,采用自定义类来绘制弹幕条目,自定义类中通过子线程对弹幕信息进行局部渲染绘制更新,对整个界面影响较小,提升流畅性,减少卡顿,增强用户体验,同时也节省内存和cpu占用。

为达到以上目的,本发明采取的技术方案是:

一种弹幕效果的实现方法,其特征在于,包括如下步骤:

步骤1,自定义弹幕元数据类danmakubean,为android系统提供的object类型,用来存放弹幕的元数据;

步骤2,自定义弹幕布局类danmakuitem,继承android系统提供的线性布局linearlayout,用来显示弹幕;

所述自定义弹幕布局类danmakuitem最终返回一个位图,其中包括用户的头像和发表的弹幕内容;

步骤3,自定义弹幕数据类drawerbean,继承android系统提供的object类型,用来提供弹幕移动相关计算;

步骤4,自定义类danmakuitemdrawer,继承android系统提供的object类型,用来绘制弹幕条目;

在自定义类danmakuitemdrawer中,定义方法initwaitbean,用来把弹幕数据集合添加到等待展示的弹幕链表中;

在自定义类danmakuitemdrawer中,定义方法draw,用来对正在显示移动的弹幕进行绘制;其中,通过lock方法来加锁,对多线程进行控制,每次只能一个线程进行绘制;通过unlock方法来释放锁资源;

步骤5,自定义类danmakuview,继承android系统提供的textureview,用来在线程中绘制和渲染;

在danmakuview类中实现textureview.surfacetexturelistener接口,在onsurfacetextureavailable回调方法中清空画布;

在自定义类danmakuview中,定义方法start,用来控制开始加载显示弹幕信息;其中,通过内部类danmakudrawthread在子线程中绘制弹幕信息。

在上述技术方案的基础上,在自定义弹幕布局类danmakuitem中,定义方法createitem,用来创建弹幕布局、获取头像文字和背景内容相应的view对象;

在自定义弹幕布局类danmakuitem中,定义静态方法createbitmapfromview,用来创建bitmap位图。

在上述技术方案的基础上,在自定义弹幕数据类drawerbean中,定义方法createbitmap,用来创建弹幕位图,把用户头像和内容绘制到位图中;

在自定义弹幕数据类drawerbean中,定义方法clean,用来对bitmap位图资源及时进行回收,节约内存防止内存溢出。

在上述技术方案的基础上,步骤1中,所述自定义弹幕元数据类danmakubean具体包括:

枚举source,用来标记弹幕来源,里面有两个常量my和others,

变量msource,用来区分弹幕所发的用户,为枚举source类型,

变量mwords,用来代表弹幕的内容,为android系统提供的string类型,

变量mimgurl,用来代表用户头像的地址,为android系统提供的string类型。

在上述技术方案的基础上,步骤2中,所述自定义弹幕布局类danmakuitem具体包括:

变量mtext,用来显示弹幕的文字内容,用来显示文字颜色设定选项,为android系统提供文字展示控件textview类型,

变量mheadimage,用来显示用户头像,用来显示用户头像大小设定选项,为android系统提供的图片展示控件imageview类型,

变量mdanmakubean,用来提供弹幕数据,为自定义的danmakubean类型,

变量mtextsize,用来控制弹幕字体的大小,为android系统提供的int类型,

变量mready,用来标识弹幕头像是否加载成功,为android系统提供的布尔boolean类型。

在上述技术方案的基础上,步骤3中,所述自定义弹幕数据类drawerbean具体包括:

变量mx、my、mtargetx和mstartx,mx用来记录弹幕移动位置的x轴坐标,my用来记录弹幕移动位置的y轴坐标,mtargetx用来记录弹幕最大移动的位置,mstartx用来记录弹幕的起始点x轴坐标,均为android系统提供的浮点型类型,

变量mspeed,用来提供每次移动的距离,为android系统提供的浮点类型,

变量mbitmap,用来存储弹幕中的头像和内容,为android系统提供的bitmap位图类型。

在上述技术方案的基础上,步骤4中,所述自定义类danmakuitemdrawer具体包括:

链表变量mwaitingdanmakubean,用来存放弹幕数据集,为android系统提供的linkedlist类型,

链表变量mrunningbean,用来存放自定义弹幕控件集,为android系统提供的linkedlist类型,

变量mcontext,用来初始化弹幕控件,为android系统提供的上下文context类型,

变量mlock,用来进行多线程数据的同步,为android系统提供reentrantlock类型。

在上述技术方案的基础上,步骤5中,所述自定义类danmakuview具体包括:

内部类danmakudrawthread,继承android系统提供的线程类thread,用来进行刷新绘制,

计时器类型的变量mtimer,是android系统提供的timer类型的变量用来,执行定时任务,设置间隔一定时间添加弹幕信息。

本发明所述的弹幕效果的实现方法,采用自定义类(自定义textureview)来绘制弹幕条目,自定义类中通过子线程对弹幕信息进行局部渲染绘制更新,对整个界面影响较小,提升流畅性,减少卡顿,增强用户体验,同时也节省内存和cpu占用。

附图说明

本发明有如下附图:

图1本发明的流程图。

具体实施方式

以下结合附图对本发明作进一步详细说明。

如图1所示,本发明所述的弹幕效果的实现方法,包括如下步骤:

步骤1,自定义弹幕元数据类danmakubean,为android系统提供的object类型,用来存放弹幕的元数据;

步骤2,自定义弹幕布局类danmakuitem,继承android系统提供的线性布局linearlayout,用来显示弹幕;

所述自定义弹幕布局类danmakuitem最终返回一个位图,其中包括用户的头像和发表的弹幕内容;

在自定义弹幕布局类danmakuitem中,定义方法createitem,用来创建弹幕布局、获取头像文字和背景内容相应的view对象;

方法createitem可采用以下代码实现:

privatevoidcreateitem(contextcontext){

viewview=layoutinflater.from(context).inflate(r.layout.danmu_ksing_danmuku_item,this,true);

mheadimage=(circleimageview)view.findviewbyid(r.id.header_image);

mitembg=(relativelayout)view.findviewbyid(r.id.danmaku_item_bg);

mtext=(textview)view.findviewbyid(r.id.comment);

}

其中:

context是android系统提供的上下文context类型的对象,用来初始画布,

layoutinflater是android系统服务中布局服务,用来实例化xml布局文件对应的view对象,from是layoutinflater中的静态方法用来获取系统布局服务对象,inflate是layoutinflater对象中方法,用来加载布局文件实例化其中的对象,

r.layout.danmu_ksing_danmuku_item是在项目中layout文件夹下定义好的布局文件,

findviewbyid是android系统提供的view类型对象中的方法,根据id查找父布局容器中相应的子布局对象;

在自定义弹幕布局类danmakuitem中,定义静态方法createbitmapfromview,用来创建bitmap位图;

静态方法createbitmapfromview可采用以下代码实现:

publicstaticbitmapcreatebitmapfromview(viewv){

if(v.getmeasuredheight()==0||v.getmeasuredwidth()==0){

v.measure(measurespec.makemeasurespec(deviceinfo.height/2,measurespec.at_most),

measurespec.makemeasurespec(deviceinfo.width/2,measurespec.at_most));

}

v.layout(0,0,v.getmeasuredwidth(),v.getmeasuredheight());

bitmapb=bitmap.createbitmap(v.getmeasuredwidth(),v.getmeasuredheight(),bitmap.config.argb_4444);

canvasc=newcanvas(b);

v.draw(c);

returnb;

}

其中:

getmeasuredheight和getmeasuredwidth方法是android系统view控件中的方法用来获取控件的宽高,

measure方法也是android系统view控件中的方法用来测量计算控件的大小,

measurespec是android系统提供的用来计算控件大小的辅助类,

layout是android系统view控件中的方法用来定义当前布局在父控件显示的位置,

bitmap是android系统提供类型,createbitmap是其中个的方法,用来创建一个图层对象,

canvas是android系统提供的画布类型,这里传入一个bitmap,

draw方法是android系统view控件中的方法,用来在当前画布上进行绘制;

步骤3,自定义弹幕数据类drawerbean,继承android系统提供的object类型,用来提供弹幕移动相关计算;

在自定义弹幕数据类drawerbean中,定义方法createbitmap,用来创建弹幕位图,把用户头像和内容绘制到位图中;

方法createbitmap可采用以下代码实现:

publicvoidcreatebitmap(){

mbitmap=danmakuitem.createbitmapfromview(mdanmakuitem);

}

其中:

mbitmap是android系统提供bitmap位图类型的变量,

createbitmapfromview是自定义的弹幕布局danmakuitem中的方法用来把弹幕布局生成位图;

在自定义弹幕数据类drawerbean中,定义方法clean,用来对bitmap位图资源及时进行回收,节约内存防止内存溢出;

方法clean可采用以下代码实现:

publicvoidclear(){

if(mbitmap!=null&&!mbitmap.isrecycled()){

mbitmap.recycle();

}

}

其中:

mbitmap是生成好的弹幕布局位图,

isrecycled是android系统bitmap类中的方法,用来判断位图是否被系统回收,

recycle是android系统中bitmap类中的方法,用来回收位图占用的系统内存资源;

步骤4,自定义类danmakuitemdrawer,继承android系统提供的object类型,用来绘制弹幕条目;

在自定义类danmakuitemdrawer中,定义方法initwaitbean,用来把弹幕数据集合添加到等待展示的弹幕链表中;

方法initwaitbean可采用以下代码实现:

publicvoidinitwaitbean(arraylist<danmakubean>beanlist){

for(danmakubeanbean:beanlist){

mwaitingdanmakubean.offer(bean);

}

}

其中:

beanlist是传入的弹幕元数据集合,

mwaitingdanmakubean是等待展示的弹幕链表集合,

offer是android系统链表linkedlist类中的方法,用来向链表尾部插入一条数据;

在自定义类danmakuitemdrawer中,定义方法draw,用来对正在显示移动的弹幕进行绘制;

方法draw可采用以下代码实现:

publicvoiddraw(canvascanvas){

mlock.lock();

canvas.drawpaint(mclearpaint);

for(drawerbeandrawerbean:mrunningbean){

canvas.drawbitmap(drawerbean.getbitmap(),drawerbean.getx(),drawerbean.gety(),mbitmappaint);

drawerbean.movetonextposition();}

removedoneitem();

mlock.unlock();

}

其中:

canvas是android系统提供的画布用来绘制,

lock方法是android系统reentrantlock类中的方法,用来加锁,对多线程进行控制,每次只能一个线程进行绘制,

drawbitmap是android系统canvas画布中的方法,用来在画布上绘制位图,

movetonextposition是自定义类drawerbean中的方法用来计算弹幕移动到的位置坐标,

unlock方法是android系统reentrantlock类中的方法,用来释放锁资源;

步骤5,自定义类danmakuview,继承android系统提供的textureview,用来在线程中绘制和渲染;

在danmakuview类中实现textureview.surfacetexturelistener接口,在onsurfacetextureavailable回调方法中清空画布;

onsurfacetextureavailable回调方法可采用以下代码实现:

publicvoidonsurfacetextureavailable(surfacetexturesurface,intwidth,intheight){

canvascanvas=lockcanvas();

canvas.drawcolor(color.transparent,porterduff.mode.clear);

unlockcanvasandpost(canvas);

}

其中:

canvas是android系统提供的画布类型的对象,

lockcanvas是android系统textureview类中的方法用来获取画布并对画布对象加锁,

drawcolor是android系统canvas画布中的方法用来绘制颜色,

transparent是androi系统color类中的常量用来代表透明颜色,

unlockcanvasandpost是android系统textureview中的方法用来释放画布,

在自定义类danmakuview中,定义方法start,用来控制开始加载显示弹幕信息;

方法start可采用以下代码实现:

publicvoidstart(){

mdrawthread=newdanmakudrawthread();

mdrawthread.start();

setsurfacetexturelistener(this);

}

其中:

danmakudrawthread是danmakuview的内部类,继承android系统提供的线程thread,用来在子线程中绘制弹幕信息,

start方法是android系统thread类中的方法,用来开启线程,

setsurfacetexturelistener方法是android系统提供的textureview类中的方法,用来监听surface变化。

在上述技术方案的基础上,步骤1中,所述自定义弹幕元数据类danmakubean具体包括:

枚举source,用来标记弹幕来源,里面有两个常量my和others,

变量msource,用来区分弹幕所发的用户,为枚举source类型,

变量mwords,用来代表弹幕的内容,为android系统提供的string类型,

变量mimgurl,用来代表用户头像的地址,为android系统提供的string类型。

在上述技术方案的基础上,步骤2中,所述自定义弹幕布局类danmakuitem具体包括:

变量mtext,用来显示弹幕的文字内容,用来显示文字颜色设定选项,为android系统提供文字展示控件textview类型,

变量mheadimage,用来显示用户头像,用来显示用户头像大小设定选项,为android系统提供的图片展示控件imageview类型,

变量mdanmakubean,用来提供弹幕数据,为自定义的danmakubean类型,

变量mtextsize,用来控制弹幕字体的大小,为android系统提供的int类型,

变量mready,用来标识弹幕头像是否加载成功,为android系统提供的布尔boolean类型。

在上述技术方案的基础上,步骤3中,所述自定义弹幕数据类drawerbean具体包括:

变量mx、my、mtargetx和mstartx,mx用来记录弹幕移动位置的x轴坐标,my用来记录弹幕移动位置的y轴坐标,mtargetx用来记录弹幕最大移动的位置,mstartx用来记录弹幕的起始点x轴坐标,均为android系统提供的浮点型类型,

变量mspeed,用来提供每次移动的距离,为android系统提供的浮点类型,

变量mbitmap,用来存储弹幕中的头像和内容,为android系统提供的bitmap位图类型。

在上述技术方案的基础上,步骤4中,所述自定义类danmakuitemdrawer具体包括:

链表变量mwaitingdanmakubean,用来存放弹幕数据集,为android系统提供的linkedlist类型,

链表变量mrunningbean,用来存放自定义弹幕控件集,为android系统提供的linkedlist类型,

变量mcontext,用来初始化弹幕控件,为android系统提供的上下文context类型,

变量mlock,用来进行多线程数据的同步,为android系统提供reentrantlock类型。

在上述技术方案的基础上,步骤5中,所述自定义类danmakuview具体包括:

内部类danmakudrawthread,继承android系统提供的线程类thread,用来进行刷新绘制,

计时器类型的变量mtimer,是android系统提供的timer类型的变量用来,执行定时任务,设置间隔一定时间添加弹幕信息。

内部类danmakudrawthread可采用以下代码实现:

privateclassdanmakudrawthreadextendsthread{

privateatomicbooleanisrunning=newatomicboolean(false);

publicvoidrun(){

isrunning.set(true);canvascanvas=null;longframeduration;

while(isrunning.get()&&getsurfacetexture()!=null){

synchronized(mlock){

frameduration=system.currenttimemillis();

canvas=lockcanvas();

canvas.drawcolor(color.transparent,porterduff.mode.clear);

mitemdrawer.draw(canvas);

frameduration=system.currenttimemillis()-frameduration;

thread.sleep(16-frameduration);

unlockcanvasandpost(canvas);

}}

}

其中isrunning变量是android系统提供的atomicboolean类型的的原子变量,用来在多线程中加锁排他性,其中set和get方法是android系统atomicboolean类中的方法用来加锁canvas是android系统提供的画布,frameduration变量是android系统提供长整型类型的变量用来记录时间,getsurfacetexture是android系统textureview类中的方法用来获取surfacetexture对象不为空是进行绘制,currenttimemillis是android系统system类中的方法用来获取系统当前的时间戳,sleep是android系统线程thread类中的方法用来暂停当前线程释放cpu资源。lockcanvas和unlockcanvasandpost是android系统textureview中的方法分别用来获取画布资源和释放。

计时器类型的变量mtimer可采用以下代码实现:

mtimer=newtimer();

mtimer.schedule(newtimertask(){

publicvoidrun(){

mitemdrawer.runnextitem();

}

},0,peritemtime);

其中timer是android系统提供的定时器类,schedule是其中的方法,用来添加定时器任务,timertask是android系统提供的计划任务类,用来执行任务。runnextitem是danmakuitemdrawer类中的方法,用来加载下一个弹幕信息。

本说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。

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