B站的DanmakuFlameMaster的使用

B站的DanmakuFlameMaster的使用

B站的DanmakuFlameMaster的下載地址:https://github.com/Bilibili/DanmakuFlameMaster    點擊打開鏈接


1、彈幕內容解析
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();

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章