环境:
as 4.4.2
jdk 1.8
注意!!源码在文末!!
弹幕github官方地址地址
实现场景
通过弹幕与时间关联,实现视频弹幕的播放,滚动进度的时候,弹幕不进行清屏操作
实现代码
对于基础实现,这里没有必要细说,简单就是初始化了相关弹幕对象,然后通过动态添加弹幕, 即可实现。
初始化代码如下:
mDanMuParser = BiliDanmakuParser.createParser(null);
HashMap<Integer, Integer> maxLinesPair = new HashMap<Integer, Integer>();
//滚动弹幕最大显示3行
maxLinesPair.put(BaseDanmaku.TYPE_SCROLL_RL, 3);
HashMap<Integer, Boolean> overlappingEnablePair = new HashMap<Integer, Boolean>();
overlappingEnablePair.put(BaseDanmaku.TYPE_SCROLL_RL, false);
overlappingEnablePair.put(BaseDanmaku.TYPE_FIX_TOP, false);
mDanMuContext = DanmakuContext.create();
try {
Display display = ((Activity) getContext()).getWindow().getWindowManager().getDefaultDisplay();
float refreshRate = display.getRefreshRate();
int rate = (int) (1000 / refreshRate);
mDanMuContext.setFrameUpateRate(rate);
Log.d(TAG, mIdentify + "rate: " + rate);
} catch (Exception e) {
e.printStackTrace();
Log.d(TAG, mIdentify + "rate error");
}
mDanMuContext.setDanmakuStyle(IDisplayer.DANMAKU_STYLE_STROKEN, 3)
.setDuplicateMergingEnabled(false)
// .setScrollSpeedFactor(1.2f)
.setScaleTextSize(1.2f)
//绘制背景使用BackgroundCacheStuffer
.setCacheStuffer(new BackgroundCacheStuffer(), null)
.setMaximumLines(maxLinesPair)
.preventOverlapping(overlappingEnablePair)
.setDanmakuMargin(40);
prepare(mDanMuParser, mDanMuContext);
showFPS(false);
enableDanmakuDrawingCache(true);
弹幕发送代码如下:
danMuKu.text = bulletInfo.getContent();
danMuKu.padding = 5;
//可能会被各种过滤器过滤并隐藏显示
danMuKu.priority = 1;
danMuKu.isLive = false;
if (rightNow) {
danMuKu.setTime(getCurrentTime() + (new Random().nextInt(10)) + DELAY_TIME);
} else {
danMuKu.setTime(getCurrentTime() + bulletInfo.getBeforeInterval() + DELAY_TIME);
}
danMuKu.textSize = bulletInfo.getTextSize() * (mDanMuParser.getDisplayer().getDensity() - 0.6f);
danMuKu.textColor = Color.WHITE;
danMuKu.textShadowColor = Color.BLACK;
danMuKu.setTag(TAG_KEY, bulletInfo);
addDanmaku(danMuKu);
注意要点
1、弹幕实现的过程中,设计到高帧率闪屏问题,请看以下链接
链接。
2、弹幕使用过程中,若存在卡顿,则可以选择继承自surfaceview的基类试试。
3、recyclerview使用的过程中,要结合adapter的生命周期进行弹幕配置参数的初始化。
最后附上代码地址,库名字libbilibilidfm链接