DanmaKu简介

弹幕库是B站开发的一款开源的弹幕库引擎,非常火爆,号称烈焰弹幕使!
项目的github开源网址

特点

  • 使用多种方式(View/SurfaceView/TextureView)实现高效绘制

  • B站xml弹幕格式解析

  • 基础弹幕精确还原绘制

  • 支持mode7特殊弹幕

  • 多核机型优化,高效的预缓存机制

  • 支持多种显示效果选项实时切换

  • 实时弹幕显示支持

  • 换行弹幕支持/运动弹幕支持

  • 支持自定义字体

  • 支持多种弹幕参数设置

  • 支持多种方式的弹幕屏蔽

PS一句: B站的弹幕库确实开源的彻底,.so库源码都开源出来了,感谢无私奉献!

使用

效果图:
           

1.添加依赖

repositories {jcenter()
}dependencies {compile 'com.github.ctiao:DanmakuFlameMaster:0.8.3'
}

2.简单使用

  • 将弹幕DanmakuView添加到布局文件,覆盖在VideoView上方
<RelativeLayout
    android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_centerInParent="true"><VideoView
        android:id="@+id/vv_video_play"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_centerInParent="true"/><master.flame.danmaku.ui.widget.DanmakuView
        android:id="@+id/dmk_show_danmu"android:layout_width="match_parent"android:layout_height="match_parent"/></RelativeLayout>
  • 在Activity中的使用步骤
//1. 实例化(此处使用的ButterKnife,使用findViewById(....),也是一样的)
DanmakuView mDmkView;
@BindView(R.id.dmk_controller)//2. 创建一个DanmakuContext,用于配置弹幕的具体属性如:字体、显示行数、是否重叠等等
//为了简洁,我将配置DanmakuContext封装在了DanmakuConfigUtil类中,除了简洁,也方便修改,下文贴出
DanmakuContext mDmkContext = DanmakuConfigUtil.getDanmakuContext() ;//3. 创建弹幕解析,为了简单此处使用默认解析(也是封装在了DanmakuConfigUtil类中)
BaseDanmakuParser mParser = DanmakuConfigUtil.getDefaultDanmakuParser() ;//4. 设置监听
mDmkView.setCallback(new DrawHandler.Callback() {@Overridepublic void prepared() {mDmkView.start();}........//下面还有几个回调方法,本例中暂时用不到,不写了
}//5. 弹幕准备,准备结束会在第4部回调,然后开始弹幕
mDmkView.prepare(mParser, mDmkContext);//6. 添加一条弹幕,此处将生成一条弹幕也封装在了DanmakuConfigUtil类中
BaseDanmaku oneDanmu = DanmakuConfigUtil.getOneDanmu(this, mDmkContext, mDmkView.getCurrentTime(), content);
mDmkView.addDanmaku(oneDanmu);

使用B站弹幕库就是如此简单,就这么清晰的几步…,下面贴出DanmakuConfigUtil类
…….
…….
…….


/*** author yzm* description* Created by yzm on 2017/8/11.*/public class DanmakuConfigUtil {public static DanmakuContext getDanmakuContext(){//设置显示最大行数Map<Integer, Integer> maxLines = new HashMap<>() ;maxLines.put(BaseDanmaku.TYPE_SCROLL_RL, 5) ;//设置是否显示重叠Map<Integer, Boolean> overMap = new HashMap<>() ;overMap.put(BaseDanmaku.TYPE_SCROLL_RL, true) ;overMap.put(BaseDanmaku.TYPE_FIX_TOP,true) ;//实例化弹幕上下文DanmakuContext mDmkContext = DanmakuContext.create() ;mDmkContext.setDanmakuStyle(IDisplayer.DANMAKU_STYLE_STROKEN, 3).setDuplicateMergingEnabled(false)  //不可重复合并.setScrollSpeedFactor(1.2f)   //设置滚动速度因子.setScaleTextSize(1.2f)    //弹幕字体缩放.setMaximumLines(maxLines)   //设置最大滚动行.preventOverlapping(overMap).setDanmakuMargin(40) ;return mDmkContext ;}/*** [通过指定文件流生成弹幕解析, 本例使用的是B站Sample中的弹幕资源]* @type {[type]}*/public static BaseDanmakuParser getBaseDanmakuParser(InputStream is){if(is == null){return new BaseDanmakuParser() {@Overrideprotected IDanmakus parse() {return new Danmakus();}} ;}ILoader mLoader = DanmakuLoaderFactory.create(DanmakuLoaderFactory.TAG_BILI) ;try {mLoader.load(is);} catch (IllegalDataException e) {e.printStackTrace();}BaseDanmakuParser parser = new BiliDanmukuParser() ;IDataSource<?> dataSource = mLoader.getDataSource() ;parser.load(dataSource) ;return parser ;}/*** [生成默认解析]* @type {[type]}*/public static BaseDanmakuParser getDefaultDanmakuParser(){return new BaseDanmakuParser() {@Overrideprotected IDanmakus parse() {return new Danmakus();}} ;}/*** 获取一条弹幕* @param mDmkContext* @param time* @param content* @return*/public static BaseDanmaku getOneDanmu(Context context, DanmakuContext mDmkContext,long time, String content){//创建一条从右侧开始滚动的弹幕BaseDanmaku danmaku = mDmkContext.mDanmakuFactory.createDanmaku(BaseDanmaku.TYPE_SCROLL_RL) ;if(danmaku == null || !danmaku.isPrepared()){return null ;}danmaku.text = content ;danmaku.padding = 5 ;danmaku.priority = 0 ;danmaku.isLive = true ;danmaku.setTime(time+1000);danmaku.textSize = sp2px(context,18f) ;danmaku.textColor = Color.RED ;danmaku.borderColor = Color.GREEN ;return danmaku ;}/*** sp转px的方法。*/public static int sp2px(Context context, float spValue) {final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;return (int) (spValue * fontScale + 0.5f);}
}

总结

Danmaku的使用暂时就这多,比较简单,没有更深入的研究,基本能满足现有需求,后续可能会再深入研究,自己也很期待…

Demo源码下载

Android集成B站弹幕库Danmaku相关推荐

  1. android实现b站弹幕,Android弹幕实现:基于B站弹幕开源系统(2)

    ?? Android弹幕实现:基于B站弹幕开源系统(2) 在附录1的基础上,模拟实现一种实际开发的应用场景:从网络中不间断的周期取弹幕数据,这些弹幕数据往往是批量的,然后把这些从网络中取到的批量数据逐 ...

  2. Android集成bilibili播放器以及弹幕

    考虑到开发直播和视频播放的必要性,网上了解到b站开源播放器(https://github.com/bilibili/ijkplayer)好用,集成下试试. 运行后发现b站原生的只能播放没有其他选项,考 ...

  3. c#控件弹幕效果_仿B站弹幕,极简Android开源弹幕控件:EasyDanmaku

    EasyDanmaku 一个方便简单的Android弹幕控件,顾名思义so easy. easydanmaku easydanmaku 原理简单,纯java实现,方便修改和扩展: 体积小,占用资源少, ...

  4. Muti-Barrage 一个多功能的Android弹幕库

    前言 过去几个星期每天下班后除了看视频学习就是写弹幕库了,想法来源于去年看到QQ空间里面的支持弹幕的图片预览,心血来潮就想实现一个,最终完成了Muti-Barrage, 先看效果: 1. 单视图弹幕 ...

  5. Android气泡弹幕,Android弹幕实现:基于B站弹幕开源系统(7)QQ、微信聊天气泡样式的弹幕...

    Android弹幕实现:基于B站弹幕开源系统(7)QQ.微信聊天气泡样式的弹幕 在附录文章得基础上,改进普通文本弹幕,实现一种特殊效果的文本弹幕,像QQ.微信一样的带有气泡背景的弹幕.实现的重点是在S ...

  6. Android弹幕实现:基于B站弹幕开源系统(3)-文本弹幕的完善和细节调整

     Android弹幕实现:基于B站弹幕开源系统(3) 本文在附录1,2的基础上再次对异步获取弹幕并显示弹幕完善逻辑和代码,集中在上层Java代码部分: package zhangphil.danm ...

  7. android+弹幕实现,Android弹幕实现:基于B站弹幕开源系统(1)

     Android弹幕实现:基于B站弹幕开源系统(1) 如今的视频播放,流行在视频上飘弹幕.这里面做的相对比较成熟.稳定.使用量较多的弹幕系统,当推B站的弹幕系统,B站的弹幕系统已经作为开源项目在g ...

  8. Android弹幕实现:基于B站弹幕开源系统(1)

     Android弹幕实现:基于B站弹幕开源系统(1) 如今的视频播放,流行在视频上飘弹幕.这里面做的相对比较成熟.稳定.使用量较多的弹幕系统,当推B站的弹幕系统,B站的弹幕系统已经作为开源项目在g ...

  9. Android集成腾讯X5浏览器内核库

    Android集成腾讯X5浏览器内核库 一.相关配置 1. 相关地址 2.引入SDK 3. AndroidManifest配置 二.Application中初始化内核 三.代码实现 1. 自定义带Pr ...

  10. Android 开源组件和第三方库汇总

    出自(https://github.com/Tim9Liu9/TimLiu-Android) TimLiu-Android 自己总结的Android开源项目及库. 1. github排名 https: ...

最新文章

  1. 浅析redis与zookeeper构建分布式锁的异同
  2. openGL 坐标系的互相转换
  3. 剑指offer58-||.左旋转字符串
  4. CSS3中border-radius、box-shadow与gradient那点事儿
  5. qt如何把父窗口的变量传给子窗口_父窗口和iframe子窗口之间相互传递参数和调用函数或方法...
  6. 【codevs1250】Fibonacci数列,矩阵乘法入门
  7. [转]20个优秀网站助你征服CSS
  8. 毕业论文写作经验总结
  9. linux网卡驱动如何安装,linux下网卡驱动安装全过程
  10. FreeSurfer和FSL的安装和使用(脑部图像去除头骨+对图像和label同时进行仿射对齐)教程
  11. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
  12. 【DIY】手把手教你爆改一台手机制作掌上游戏机
  13. 深入浅出boot2.0第六章 数据库事务处理 隔离级别 传播行为
  14. 计算机计算与计算思维必掌握知识,计算思维与计算机基础教学探究
  15. select2 ajax获取数据设置默认值,初始值
  16. 应届计算机科学与技术简历,计算机科学与技术应届生简历范文
  17. 联志服务器修改启动项,双塔奇兵,来自联志的两款服务器机箱
  18. 疫情期间居家所需物品清单
  19. 如何批量生成文件夹并命名
  20. Cellant:中文基站+google地图+轨迹记录+自制基站数据库

热门文章

  1. SpringMVC中解决POST和GET请求中文乱码问题
  2. 友元(友元函数、友元类和友元成员函数) C++
  3. DLL导出类避免地狱问题的完美解决方案
  4. 自动优化Windows Xp批处理文件
  5. android-goldfish-3.4内核源码下载与编译
  6. Linux命令九---Linux进程管理命令---ps-kill-nohup-jobs-fg-bg-top等
  7. 一个批量文件改名工具
  8. 全球名校AI课程库(36)| 辛辛那提大学 · 离散数学课程『MATH1071 Discrete Math』
  9. css宋体代码_family【CSS 字体】(宋体 黑体 微软雅黑)CSS文字字体
  10. Oracle数据库常用sql语句