美文网首页APP & program
关于安卓接入B站弹幕控件

关于安卓接入B站弹幕控件

作者: motosheep | 来源:发表于2023-01-28 17:25 被阅读0次

    环境:

    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链接

    相关文章

      网友评论

        本文标题:关于安卓接入B站弹幕控件

        本文链接:https://www.haomeiwen.com/subject/cgxuhdtx.html