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

前言

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

单视图弹幕

2. 多视图弹幕
多视图弹幕.gif

最后,我将它集成在我的图片预览库中,一款仿QQ空间的图片预览库:PhotoPagerView
弹幕功能的图片预览

一、功能

Muti-Barrage支持的功能:

  • 自定义多视图
  • 设置发送间隔
  • 碰撞检测(多视图情况下还存在问题)
  • 触摸事件处理
  • 支持全屏和上中下显示

二、使用

1. 添加依赖

先在build.gradle(Project:xxx)的repositories中添加:

  allprojects {
    repositories {
        google()// 不翻墙可以注释掉
        jcenter()
        maven { url 'https://jitpack.io' }
    }
}

然后在 build.gradle(Module:app) 的 dependencies 添加:

 dependencies {
    ...
   
    /*需要添加的依赖 这里可以查看一下上面的最新版本*/
    implementation 'com.jieWang:Muti-Barrage:1.0.4'
 }

2. 使用

使用方法有点跟RecyclerView相似,可自由定制也造成了使用成本的上升,没办法~
第一步:添加进布局文件

<com.orient.tea.barragephoto.ui.BarrageView
            android:id="@+id/barrage"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

第二步:构建自己的弹幕数据类型实现DataSource接口

public class BarrageData implements DataSource {
            ...
            @Override
        public int getType() {
            return type;
        }
    
        // 如果需要,通常是不需要的,后续会删除
        @Override
        public long getShowTime() {
            return 0;
        }
}

第三步:获取BarrageView并初始化参数

private BarrageView barrageView;
    
...
      
barrageView = findViewById(xxx);
BarrageView.Options options = new BarrageView.Options()
         .setGravity(BarrageView.GRAVITY_TOP)  // 设置弹幕的位置
         .setInterval(50) // 设置弹幕的发送间隔
         .setSpeed(200,29) // 设置速度和波动值
         .setModel(BarrageView.MODEL_COLLISION_DETECTION)     // 设置弹幕模式 随机生成or碰撞检测
         .setRepeat(-1)  // 循环播放次数 默认为1次 -1 为无限循环
         .setClick(false);  // 设置弹幕是否可以点击
barrageView.setOptions(options);

第四步:创建ViewHolder,实现BarrageViewHolder接口(后面多处需要加范型)

// 在多视图弹幕中自己需要构建多个类型ViewHolder
class ViewHolder extends BarrageAdapter.BarrageViewHolder<BarrageData> {
            public ViewHolder(View itemView) {
                super(itemView);
            }
    
            @Override
            protected void onBind(BarrageData data) {
                ...// 自己想在ViewHolder中对Ui的处理
            }
}

第五步:设置适配器创建适配器,需要加上范型(第二部实现的数据类型)

private BarrageAdapter<BarrageData> mAdapter;

单视图

barrageView.setAdapter(mAdapter = new BarrageAdapter<BarrageData>(null, this) {
                @Override
                public BarrageViewHolder<BarrageData> onCreateViewHolder(View root, int type) {
                    return new SingleBarrageActivity.ViewHolder(root);// 返回自己创建的ViewHolder
                }
    
                @Override
                public int getItemLayout(BarrageData barrageData) {
                    return R.layout.barrage_item_normal;// 返回自己设置的布局文件
                }
});

多视图要麻烦一点(可以查看示例代码)

// 设置适配器 第一个参数是点击事件的监听器
barrageView.setAdapter(mAdapter = new BarrageAdapter<BarrageData>(null, this) {
                @Override
                public BarrageViewHolder<BarrageData> onCreateViewHolder(View root, int type) {
                    switch (type) {// 这里的type指的我们设置的子布局文件,然后设置ViewHolder
                        ... // 不同的布局文件构建不同的ViewHolder
                    }
                }
    
                @Override
                public int getItemLayout(BarrageData barrageData) {
                    switch (barrageData.getType()) {// 根据弹幕数据中的type设置子布局文件
                        ... // 不同的弹幕类型返回不同的布局文件
                    }
                }
});

如果需要设置弹幕触摸事件,第三步中BarrageView.Options必须得设置可点击

// 设置监听器
mAdapter.setAdapterListener(new AdapterListener<BarrageData>() {
                @Override
                public void onItemClick(BarrageAdapter.BarrageViewHolder<BarrageData> holder, BarrageData item) {
                  ...
                }
});

三、更新

如果您对实现原理感兴趣:

教你写一个弹幕库,确定不了解一下?

如果您发现了什么问题,还请指教:

Muti-Barrage:https://github.com/mCyp/Muti-Barrage

如果觉得还不错,欢迎Star,如果发现有什么问题,也欢迎提交issues。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,245评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,749评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,960评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,575评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,668评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,670评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,664评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,422评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,864评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,178评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,340评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,015评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,646评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,265评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,494评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,261评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,206评论 2 352

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,094评论 1 32
  • 如今直播行业确实是非常火爆啊,大大小小的公司都要涉足一下直播的领域,用斗鱼的话来讲,现在就是千播之战。而弹幕则无疑...
    GB_speak阅读 3,098评论 1 30
  • Python 序列类型:字符串(str)、元祖(tuple)、列表(list)。 集合类型:集合(set)。 映射...
    5c8e2b8217ae阅读 123评论 0 1
  • 【日文】元をただし原因を究める (もとをただしげんいんをきわめる) 【中文】推本溯源 【感悟】成与败都值...
    行禅者阅读 256评论 0 0
  • 我们的心中有团火 在爱的世界发出一片热 不管是春暖花开 还是冰霜雨雪 我们都会携手一起走过 . 天上的月光在闪烁 ...
    孔孟之乡阅读 176评论 0 2