本项目是一个开源的弹幕控件库,能够支持多种样式弹幕,弹幕点击监听,弹幕分区域显示,自定义移动速度等功能,项目原理是通过自定义ViewGroup。可能是目前轻量级弹幕控件中功能最强大的一款了。

Github项目地址:github.com/hust2010107…,希望你能Star或者提交Issues.

效果

常规样式

点击事件

多种弹幕样式

分区域显示

GIF效果图

使用

0. 添加依赖

1. 导入xdanmuku源码

你可以直接下载本项目xdanmuku模块,并导入项目目录,并添加依赖compile project(':xdanmuku')

2. Gradle

先把jitpack仓库添加到项目根 build.gradle(Project)文件中,

allprojects {

repositories {

...

maven { url 'https://jitpack.io' }

}

}复制代码

然后在你的项目中添加依赖

dependencies {

compile 'com.github.hust201010701:XDanmuku:33a063b46e'

}复制代码

其他添加依赖的方式,如maven等请自行到点我查看。

1. 添加控件

在布局xml中添加控件

android:id="@+id/danmuContainerView"

android:layout_width="match_parent"

android:layout_height="240dp"

/>复制代码

2. 自定义弹幕实体类DanmuEntity

根据需求定制弹幕实体类,包含所有弹幕的属性和类型。

public class DanmuEntity{

public String content;

public int textColor;

public int backgroundColor;

public int type;

public String time;

}复制代码

3. 添加DanmuConverter(弹幕转换器)

DanmuConverter中有两个抽象方法需要实现,getSingleLineHeight是返回所有弹幕样式中高度最大值作为弹幕航道的高度;convert负责将弹幕实体类DanmuEntity绑定到弹幕子视图上(类似于BaseAdapter的getView方法的作用)。

DanmuConverter danmuConverter = new DanmuConverter() {

@Override

public int getSingleLineHeight() {

//将所有类型弹幕的布局拿出来,找到高度最大值,作为弹道高度

View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.item_danmu, null);

//指定行高

view.measure(0, 0);

View view2 = LayoutInflater.from(MainActivity.this).inflate(R.layout.item_super_danmu, null);

//指定行高

view2.measure(0, 0);

return Math.max(view.getMeasuredHeight(),view2.getMeasuredHeight());

}

@Override

public View convert(DanmuEntity model) {

View view = null;

if(model.getType() == 0) {

view = LayoutInflater.from(MainActivity.this).inflate(R.layout.item_danmu, null);

TextView content = (TextView) view.findViewById(R.id.content);

ImageView image = (ImageView) view.findViewById(R.id.image);

image.setImageResource(ICON_RESOURCES[random.nextInt(5)]);

content.setText(model.content);

content.setTextColor(Color.rgb(random.nextInt(256), random.nextInt(256), random.nextInt(256)));

}

else if(model.getType() == 1) {

view = LayoutInflater.from(MainActivity.this).inflate(R.layout.item_super_danmu, null);

TextView content = (TextView) view.findViewById(R.id.content);

content.setText(model.content);

TextView time = (TextView) view.findViewById(R.id.time);

time.setText(model.getTime());

}

return view;

}

};复制代码

4. 添加弹幕

DanmuEntity danmuEntity = new DanmuEntity();

danmuEntity.setContent(doubleSeed.substring(index, index + 2 + random.nextInt(20)));

danmuEntity.setType(random.nextInt(2));

danmuEntity.setTime("23:20:11");

try {

danmuContainerView.addDanmu(danmuEntity);

} catch (Exception e) {

e.printStackTrace();

}复制代码

5. 弹幕点击事件监听

//弹幕点击事件

danmuContainerView.setOnItemClickListener(new DanmuContainerView.OnItemClickListener() {

@Override

public void onItemClick(DanmuEntity danmuEntity) {

Toast.makeText(MainActivity.this,danmuEntity.content,Toast.LENGTH_SHORT).show();

}

});复制代码

6. 设置弹幕移动速度

DanmuContainerView中预设了三种弹幕移动速度:

public final static int LOW_SPEED = 1;

public final static int NORMAL_SPEED = 3;

public final static int HIGH_SPEED = 5;复制代码

设置速度通过setSpeed方法:

danmuContainerView.setSpeed(DanmuContainerView.HIGH_SPEED);复制代码

同时你可以传递具体的整数型速度:

danmuContainerView.setSpeed(4);复制代码

7. 弹幕显示区域

本人将弹幕控件按照竖向均分为3份,分别为GRAVITY_TOP,GRAVITY_CENTER,GRAVITY_BOTTOM。用户可以自由组合显示区域,默认情况下全区域(GRAVITY_FULL)显示。设置要显示的区域通过setGravity方法实现,参数可以使用 | 进行连接。

//只在上方和中间区域显示弹幕

danmuContainerView.setGravity(DanmuContainerView.GRAVITY_TOP | DanmuContainerView.GRAVITY_CENTER);复制代码

后记

本控件的原理你可能已经知道了使用自定义ViewGroup实现。但是之前我花了很多事件尝试通过自定义LayoutManager让RecyclerView实现弹幕控件,不过最终这种方案失败了,更多细节讨论欢迎发送邮件(orzangleli@163.com)给我。

欢迎Star,提交Issues。

android弹幕控件,可能是目前轻量级弹幕控件中功能最强大的一款相关推荐

  1. 可能是目前轻量级弹幕控件中功能最强大的一款

    本项目是一个开源的弹幕控件库,能够支持多种样式弹幕,弹幕点击监听,弹幕分区域显示,自定义移动速度等功能,项目原理是通过自定义ViewGroup.可能是目前轻量级弹幕控件中功能最强大的一款了. Gith ...

  2. 腾讯Android自动化测试实战3.1.4 Robotium的控件获取、操作及断言

    3.1.4 Robotium的控件获取.操作及断言 Robotium是一款在Android客户端中的自动化测试框架,它需要模拟用户操作手机屏幕.要完成对手机的模拟操作,应该包含以下几个基本操作: (1 ...

  3. 【Android自定义View实战】之自定义评价打分控件RatingBar,可以自定义星星大小和间距...

    [Android自定义View实战]之自定义评价打分控件RatingBar,可以自定义星星大小和间距

  4. Android ActionBar高级自定义——设置标题居中和添加控件

    转载地址:http://blog.csdn.net/gtbluesky/article/details/44656567 关于ActionBar的一些常见使用方法我已经在之前两篇博文(Android ...

  5. android menu item 显示,Android 如何通过menu id来得到menu item 控件 .

    Android 如何通过menu id来得到menu item 控件 . (2012-07-21 06:43:31) 标签: android 如何 杂谈 Android 如何通过menu id来得到m ...

  6. android学习笔记---50_样式与主题,给控件使用样式,给应用使用主题

    50_样式与主题 android学习笔记---50_样式与主题,给控件使用样式,给应用使用主题 2013/5/12 50_样式与主题 ----------------- android样式和主题(st ...

  7. android studio实验二 Activity及常用布局和控件的使用

    实验内容 1.创建一个Android应用,创建一个Android应用,创建MainActivity和LoginActivity. 2.在MainActivity中的onCreate,onStart,o ...

  8. Android开发 入门篇(二) - 常用UI控件

    文章目录 控件 Button TextView EditText ImageView ProgressBar AlertDialog ProgressDialog 布局 LenearLayout an ...

  9. android 绘制控件,Android_开发_Day29_自己绘制控件

    Android_开发Day29自己绘制控件 目的: 在Android中很多时候系统的控件是不能满足需要的,组合方式定义控件又非常繁琐,因此此时需要自己画一个控件,才能满足需要 技术: <1> ...

  10. Android之RemoteViews篇上————通知栏和桌面小控件

    Android之RemoteViews篇上----通知栏和桌面小控件 一.目录 文章目录 Android之RemoteViews篇上----通知栏和桌面小控件 一.目录 二.RemoteViews的概 ...

最新文章

  1. MOSS字段编辑权限控制方案--发布源码
  2. python中的引用_Python中的引用
  3. C# 以日期时间作为文件名学习总结
  4. Linux(fedora 10)Hello World模块
  5. [C++11]override关键字的使用
  6. 计算机技术Control,聚变控制计算机 (Fusion Control Computer)
  7. 在Spring IoC中,依赖注入和依赖查找的数据来源区别
  8. 数据库入门-主键和外键设置
  9. 从零开始打造自己的PHP框架——第3章
  10. 超星章节内ppt课件下载
  11. spring整合WebService入门详解
  12. android:scrollbars代码控制,android:scrollbars属性和弹出键盘的问题
  13. close 和 shutdown
  14. Ubuntu Hadoop3.0.0 ./start-all.sh报错Permission denied (publickey,password)
  15. 053试题 158/449/637 - Scheduler Window
  16. 【CTA03】期货套利策略
  17. bat文件中,mvn和ant命令后面的命令不执行
  18. 三年通过注册会计师考试的经历及心得
  19. Dockerfile 参考文档中文版
  20. 浅谈输入法编程(转)

热门文章

  1. python递归函数分叉树枝_python递归函数绘制分形树的方法
  2. matlab求差分方程的单位响应,实验一:线性卷积和求差分方程的单位样值响应
  3. while(条件) 语句;语句 容易理解错的一点
  4. 计算机网络知识点整理
  5. c语言经典100例对考研有用吗,考研数学经验,没用算这学长输
  6. 人事管理系统(毕业设计)
  7. BosonNLP情感词典 评论情感分析
  8. CC(Context Capture)软件安装及空三过程中的十大常见报错与解决方法
  9. javaExcel数据导出
  10. 电脑有网络,但所有浏览器网页都打不开,是怎么回事?