B站的DanmakuFlameMaster的使用
DanmakuLoaderFactory.create(DanmakuLoaderFactory.TAG_BILI) //xml解析
DanmakuLoaderFactory.create(DanmakuLoaderFactory.TAG_ACFUN) //json文件格式解析
2、初始化
(1)彈幕view
DanmakuGlobalConfig.DEFAULT.setDanmakuStyle(DanmakuGlobalConfig.DANMAKU_STYLE_STROKEN, 3)
.setDuplicateMergingEnabled(false) //是否合併重複彈幕
.setMaximumVisibleSizeInScreen(80) //同屏最大顯示數量(彈幕密度(只對滾動有效))
.setCacheStuffer(new BackgroundCacheStuffer());
if (mDanmakuView != null) {
mParser = createParser(this.getResources().openRawResource(R.raw.comments));
// try {
// mParser = createParser(this.getResources().getAssets().open("comment.json"));
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
mDanmakuView.setCallback(new Callback() {
@Override
public void updateTimer(DanmakuTimer timer) {
}
@Override
public void prepared() {
mDanmakuView.start(); //開始播放
}
});
mDanmakuView.prepare(mParser);
mDanmakuView.showFPS(true);//是否顯示fps
mDanmakuView.enableDanmakuDrawingCache(false); //true在模擬器上運行有問題
private BaseDanmakuParser createParser(InputStream stream) {
if (stream == null) {
return new BaseDanmakuParser() {
@Override
protected Danmakus parse() {
return new Danmakus();
}
};
}
(2)內容解析
ILoader loader = DanmakuLoaderFactory.create(DanmakuLoaderFactory.TAG_BILI);
try {
loader.load(stream);
} catch (IllegalDataException e) {
e.printStackTrace();
}
BaseDanmakuParser parser = new BiliDanmukuParser();
IDataSource<?> dataSource = loader.getDataSource();
parser.load(dataSource);
return parser;
}
(3)彈幕背景和邊距
private static class BackgroundCacheStuffer extends SpannedCacheStuffer {
// 通過擴展SimpleTextCacheStuffer或SpannedCacheStuffer個性化你的彈幕樣式
final Paint paint = new Paint();
@Override
public void measure(BaseDanmaku danmaku, TextPaint paint) {
danmaku.padding = 10; // 在背景繪製模式下增加padding
super.measure(danmaku, paint);
}
@Override
public void drawBackground(BaseDanmaku danmaku, Canvas canvas, float left, float top) {
paint.setColor(0x8125309b); //彈幕背景顏色
canvas.drawRect(left + 2, top + 2, left + danmaku.paintWidth - 2, top + danmaku.paintHeight - 2, paint);
}
@Override
public void drawStroke(BaseDanmaku danmaku, String lineText, Canvas canvas, float left, float top, Paint paint) {
// 禁用描邊繪製
}
}
3、添加彈幕(注意start和during的值)
//將彈幕加入隊列進行顯示
private void addDanmaku(boolean islive, long start, long during, String data) {
BaseDanmaku danmaku = DanmakuFactory.createDanmaku(BaseDanmaku.TYPE_SCROLL_RL);
if (danmaku == null || mDanmakuView == null) {
return;
}
// for(int i=0;i<100;i++){
// }
danmaku.text = data;
danmaku.padding = 5;
danmaku.priority = 1; //0時會被過濾掉
danmaku.isLive = islive;
danmaku.time = mDanmakuView.getCurrentTime() + start; //時間start的值不要太小
danmaku.duration = new Duration(during); //顯示時間
//爲了讓彈幕能夠完全顯示,during不能超過DanmakuFactory.MAX_DANMAKU_DURATION,否則顯示未到達屏幕邊界就消失
//danmaku.duration.setFactor((float)Math.random() * 2); //滾動速度係數,越小越快
danmaku.textSize = 25f * (mParser.getDisplayer().getDensity() - 0.6f);
danmaku.textColor = Color.WHITE;
danmaku.textShadowColor = Color.WHITE; //Color.WHITE;
// danmaku.underlineColor = Color.GREEN;
danmaku.borderColor = 0; //邊框
mDanmakuView.addDanmaku(danmaku);
}
注意:繪製線程當沒有內容繪製時將wait休眠一段時間,導致部分彈幕顯示起始點不是屏幕邊界,爲了讓加入的彈幕能夠從邊界開始顯示,加入彈幕前後加入以下代碼
mDanmakuView.pause(); mDanmakuView.resume();