Skip to content
gggjmhjmh edited this page Mar 6, 2020 · 18 revisions

[扩展]自定义parser(如何使用非b站xml弹幕格式)

参考 BiliDanmakuParser 扩展实现自己的BaseDanmakuParser,将你自己的格式解析成库支持的数据,在IDanmakuView.prepare的时候传入你的Parser.

[扩展]显示/隐藏弹幕背景

参考sample代码,扩展实现CacheStuffer,DanmakuContext.setCacheStuffer()进行设置后生效.

[扩展]怎么实现图片/文字混排弹幕

参考sample代码,目前支持Sapn和Spannable类型的字符.

[教程]简单的图文弹幕实现教程

#Example1 #Example2 #利用view实现弹幕自定义布局

[设置]怎么限制弹幕行数

HashMap<Integer, Integer> maxLinesPair = new HashMap<Integer, Integer>();
maxLinesPair.put(BaseDanmaku.TYPE_SCROLL_RL, 5); // 滚动弹幕最大显示5行,可设置多种类型限制行数
DanmakuContext.setMaximumLines(maxLinesPair);  // 设置

注意如果danmaku.priority>0的话会使这个设置无效.

[设置]怎么使弹幕不重叠

HashMap<Integer, Boolean> overlappingEnablePair = new HashMap<Integer, Boolean>();
overlappingEnablePair.put(BaseDanmaku.TYPE_SCROLL_RL, true);
overlappingEnablePair.put(BaseDanmaku.TYPE_FIX_TOP, true);
DanmakuContext.preventOverlapping(overlappingEnablePair);

设置启用后会对重叠的弹幕进行丢弃处理.注意如果danmaku.priority>0的话会使这个设置无效.

[设置]怎么调节弹幕速度

DanmakuContext.setScrollSpeedFactor(1.2f); // 设置基础速率的1.2系数,速度变慢

[其他]为什么长弹幕比短弹幕移动速度快

弹幕设计如此,需要在统一规定时间内跑完显示.

[其他]不要对弹幕设置duration属性

关系到滚动弹幕统一的速度控制,所有滚动弹幕用了同一个duration实例,单独设置后会对弹幕消失或突然出现。

[其他]图文混排使图片文字基于中线对齐

扩展ImageSpan,重写draw(canvas),参考链接

[其他]怎么同步视频时间与弹幕

在视频播放控制中,同时控制danmakuview, 视频start同时调用danmakuview.start 视频pause同时调用danmakuview.pause 视频resume同时调用danmakuview.resume 视频seek同时调用danmakuview.seekTo

[其他]json/xml弹幕文件里的各个字段含义

// <d p="23.826000213623,1,25,16777215,1422201084,0,057075e9,757076900">我从未见过如此厚颜无耻之猴</d>
// 0:时间(弹幕出现时间)
// 1:类型(1从左至右滚动弹幕|6从右至左滚动弹幕|5顶端固定弹幕|4底端固定弹幕|7高级弹幕|8脚本弹幕)
// 2:字号
// 3:颜色
// 4:时间戳 ?
// 5:弹幕池id
// 6:用户hash
// 7:弹幕id

[其他]怎么循环播放弹幕

在drawingFinished回调里使用 danmakuView.seekTo(0)

弹幕丢失怎么办,我本来有10条视频五秒钟的弹幕不显示怎么办 public void cutDanmakuSourceAndStart(String json) { if (mDanmakuContext != null && mDanmakuView != null) { nextVideoRestartDanmaku(); InputStream byteArrayInputStream = new ByteArrayInputStream(json.getBytes()); InputStream inputStream = TextUtils.isEmpty(json) ? mContext.getResources().openRawResource(R.raw.precomments) : byteArrayInputStream; mParser = createParser(inputStream, DanmakuLoaderFactory.TAG_ACFUN); mDanmakuView.prepare(mParser, mDanmakuContext); } }

而且就进去的时候走了Parser的parse方法 后边重新执行mParser = createParser(inputStream, DanmakuLoaderFactory.TAG_ACFUN); mDanmakuView.prepare(mParser, mDanmakuContext); 之后就不再执行parse了

Clone this wiki locally