最近在开发中,产品小哥哥说要做个弹幕,然后还要在弹幕走到屏幕中间时,在屏幕中间的位置显示出弹幕的内容(没见过这种奇葩的需求),既然拿到这个需求,那么我们就来看看如何解决这个问题。
首先,解决问题—>弹幕:
在网上有很多弹幕框架,百度一下最多的是烈焰弹幕(DanmakuFlameMaster)框架,B站用的就是这个框架,这个框架内容很全,可以实现很多功能,但是代码写起来起来有点繁琐。但对于我这种懒到极致的人当然是寻求可以实现需求的同时,代码量又少,因此选择了一个轻量级的弹幕框架:easyBarrage。
首先我们来说一下如何使用这个框架:
首先在gradle中加入第三方库,然后syn一下。
接着在,布局文件中加入:
属性说明:
Activity中代码如下:
注意这里,由于我重写了框架,因此我需要传多一个参数Activity的参数进去,如果你们只是用原声的框架的话就不用传递这个参数了。
模拟加入弹幕:
注意Barrage对象有多种构造,可以设置字体颜色及是否显示边框,例如
指定字体颜色:
显示边框:
指定颜色及显示边框:
只显示内容:
最后记得在Activity结束的时候调用:
如果你只是想实现这些简单的功能的话下面的话就不用看啦~~
下面就是来实现产品小哥哥奇葩需求的时候了:
1,首先我们把这个框架所需要用到的类全部考下来,新建一个包,放到里面,目录如下:
然后布局文件也换成自己的包里的,比如我的是这样:
然后打开barrageView,现在要重写这个框架了:
首先看到setBarrage这个方法,首先重写这个方法,这里也就是我之前说的加了一个Activity参数的地方,在里面动态加载一个textView, 由于之前没有加上addView加到ViewGroup中,因此导致显示不出来,各位在动态加载布局控件的时候不要犯我这种低级错误哦。
然后我们看到showBarrage这个方法,仔细看他的源码,发现他是通过一个动画加到textView里的,实现弹幕的滚动。然后,通过handler的死循环实现的textView的出现。那么重头戏来了,我们要如何判断弹幕是否到达屏幕的中间呢?
在他的源码中有对动画进行了监听,动画有三个监听方法,开始时监听,结束时监听,重复时监听,之前曾尝试在结束时进行监听但发现效果并不理想,捕捉到比较慢,因此决定在开始时监听。
1.在开始时监听弹幕的内容
2.延时发送这个弹幕内容
3.将捕捉到的弹幕内容设到之前动态加载的textView控件中。
同时修改handle中的代码,捕捉弹幕内容:
同时如果要修改弹幕的出现时间,观察源码不难发现是这个变量来控制的:
最后看一下 AnimationHelper 这个类,在这里面可以修改弹幕的速度,通过弹幕的持续时间来修改,同时修改弹幕目视效果,经过测试之后是觉得设置之后弹幕出现比较平滑了,看个人需要吧:
至此完成产品的小哥哥的需求啦~~~~