• 首页
  • 博客
  • 学院
  • 下载
  • GitChat
  • TinyMind
  • 论坛
  • 问答
  • 商城
  • VIP
  • 活动
  • 招聘
  • ITeye
  • CSTO
  • 写博客
  • 发Chat

liangyalong_1314的博客

RSS订阅

Android 自定义控件-------弹幕

置顶2018年05月23日 16:51:19

阅读数:39

Demo下载地址 https://download.csdn.net/download/liangyalong_1314/10432766

话不多说先看效果图

其实这一个控件,方便好用,可以用于视频的弹幕,可以自定义弹幕样式,自己学习备用View

控件内容配置就这么多 如何需要更换UI 可以修改 这个自定义控件

myBarrageView = ((MYBarrageView) findViewById(R.id.xcView));
String[] mStrItems = {"111111", "222222",
        "333333", "66666",
        "888888", "UZI牛逼",
};
myBarrageView.initDanmuItemViews(mStrItems);
myBarrageView.start();

获得过数据后 可以修改这个布局的UI效果,可以更换传输内容

点击事件 如果需要可以做下回调,不过我这个项目没有用到,可以自己写一个

  public void createDanmuView(int index,String content,boolean reset){View inflate = inflate(mContext, R.layout.index_barrage_item, null);
        LinearLayout viewById = inflate.findViewById(R.id.beijing);
        TextView textname=inflate.findViewById(R.id.tv);
        int r = mRandom.nextInt(100) % mRowNum;
        viewById.setBackgroundResource(mBgResIds[r]);
         textname.setText(content);

        LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT,
                LayoutParams.WRAP_CONTENT);
        int row = mRandom.nextInt(100) % mRowNum;
        while(row == lastRow){row = mRandom.nextInt(100)% mRowNum;
        }int pos = mRandom.nextInt(100)% mRowNum;
        lp.topMargin = row * mRowPos[pos];

        inflate.setLayoutParams(lp);
        inflate.setPadding(0, 2, 80, 2);
        this.addView(inflate);
        if(reset){mChildList.set(index,inflate);
        }else{mChildList.add(index,inflate);
        }}

之后就是开启滚动的动画 带上代码

private Handler mHandler = new Handler() {@Override
    public void handleMessage(final Message msg) {super.handleMessage(msg);
        final int pos = msg.what;
        ViewPropertyAnimator animator;
        if(mDirection == XCDirection.FROM_RIGHT_TO_LEFT){animator = mChildList.get(msg.what).animate().translationXBy(-(mScreenWidth + mChildList.get(msg.what).getWidth()));
        }else{animator = mChildList.get(msg.what).animate().translationXBy(mScreenWidth + mChildList.get(msg.what).getWidth());
        }Random random = new Random(System.currentTimeMillis());
        int index = random.nextInt(100) % mSpeeds.length;
        animator.setDuration(mSpeeds[index]);
        animator.setInterpolator(new LinearInterpolator());
        animator.setListener(new Animator.AnimatorListener() {@Override
            public void onAnimationStart(Animator animator) {}@Override
            public void onAnimationEnd(Animator animator) {MYBarrageView.this.removeView(mChildList.get(pos));
                int index = mRandom.nextInt(100) % mStrContents.length;
                createDanmuView(pos, mStrContents[index], true);
                mHandler.sendEmptyMessageDelayed(pos, mDelayDuration);
                Log.v("czm", "size=" + mChildList.size());
            }@Override
            public void onAnimationCancel(Animator animator) {}@Override
            public void onAnimationRepeat(Animator animator) {}});
        animator.start();
    }
};

最后贴上全部代码

[java] view plaincopy
  1. public class MYBarrageView extends RelativeLayout {
  2. private int mWidth;
  3. private int mScreenWidth;
  4. private List<View> mChildList;
  5. private boolean mIsWorking = false;
  6. private Context mContext;
  7. private int mMaxShowNum = 5;
  8. private int mRowNum = 3;
  9. private int[] mSpeeds = {
  10. 6000,6000,6000,6000
  11. };
  12. private int mDelayDuration = 1000;
  13. private int[] mBgResIds = {
  14. R.drawable.aaaa,
  15. R.drawable.aaaa,
  16. R.drawable.aaaa,
  17. R.drawable.aaaa
  18. };
  19. private int[] mRowPos = {
  20. 100,200,300,400
  21. };
  22. private Random mRandom;
  23. private String[] mStrContents;
  24. public static enum XCDirection{
  25. FROM_RIGHT_TO_LEFT,
  26. FORM_LEFT_TO_RIGHT
  27. }
  28. public enum XCAction{
  29. SHOW,HIDE
  30. }
  31. private XCDirection mDirection = XCDirection.FROM_RIGHT_TO_LEFT;
  32. private Handler mHandler = new Handler() {
  33. @Override
  34. public void handleMessage(final Message msg) {
  35. super.handleMessage(msg);
  36. final int pos = msg.what;
  37. ViewPropertyAnimator animator;
  38. if(mDirection == XCDirection.FROM_RIGHT_TO_LEFT){
  39. animator = mChildList.get(msg.what).animate()
  40. .translationXBy(-(mScreenWidth + mChildList.get(msg.what).getWidth()));
  41. }else{
  42. animator = mChildList.get(msg.what).animate()
  43. .translationXBy(mScreenWidth + mChildList.get(msg.what).getWidth());
  44. }
  45. Random random = new Random(System.currentTimeMillis());
  46. int index = random.nextInt(100) % mSpeeds.length;
  47. animator.setDuration(mSpeeds[index]);
  48. animator.setInterpolator(new LinearInterpolator());
  49. animator.setListener(new Animator.AnimatorListener() {
  50. @Override
  51. public void onAnimationStart(Animator animator) {
  52. }
  53. @Override
  54. public void onAnimationEnd(Animator animator) {
  55. MYBarrageView.this.removeView(mChildList.get(pos));
  56. int index = mRandom.nextInt(100) % mStrContents.length;
  57. createDanmuView(pos, mStrContents[index], true);
  58. mHandler.sendEmptyMessageDelayed(pos, mDelayDuration);
  59. Log.v("czm", "size=" + mChildList.size());
  60. }
  61. @Override
  62. public void onAnimationCancel(Animator animator) {
  63. }
  64. @Override
  65. public void onAnimationRepeat(Animator animator) {
  66. }
  67. });
  68. animator.start();
  69. }
  70. };
  71. public MYBarrageView(Context context) {
  72. this(context, null, 0);
  73. }
  74. public MYBarrageView(Context context, AttributeSet attrs) {
  75. this(context, attrs, 0);
  76. }
  77. public MYBarrageView(Context context, AttributeSet attrs, int defStyleAttr) {
  78. super(context, attrs, defStyleAttr);
  79. mContext = context;
  80. init();
  81. }
  82. public boolean isWorking(){
  83. return mIsWorking;
  84. }
  85. private void init() {
  86. mScreenWidth = getScreenWidth();
  87. mChildList = new ArrayList<>();
  88. mRandom = new Random();
  89. }
  90. public void setDirection(XCDirection direction){
  91. mDirection = direction;
  92. }
  93. int lastRow = 0;
  94. public void initDanmuItemViews(String[] strContents){
  95. mStrContents = strContents;
  96. for(int i = 0; i < mMaxShowNum; i ++){
  97. int index =  mRandom.nextInt(100) % strContents.length;
  98. createDanmuView(i,strContents[index],false);
  99. }
  100. }
  101. public void createDanmuView(int index,String content,boolean reset){
  102. View inflate = inflate(mContext, R.layout.index_barrage_item, null);
  103. LinearLayout viewById = inflate.findViewById(R.id.beijing);
  104. TextView textname=inflate.findViewById(R.id.tv);
  105. //        final TextView textView = new TextView(mContext);
  106. int r = mRandom.nextInt(100) % mRowNum;
  107. viewById.setBackgroundResource(mBgResIds[r]);
  108. textname.setText(content);
  109. LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT,
  110. LayoutParams.WRAP_CONTENT);
  111. int row = mRandom.nextInt(100) % mRowNum;
  112. while(row == lastRow){
  113. row = mRandom.nextInt(100)% mRowNum;
  114. }
  115. int pos = mRandom.nextInt(100)% mRowNum;
  116. lp.topMargin = row * mRowPos[pos];
  117. //        lastRow = row;
  118. inflate.setLayoutParams(lp);
  119. inflate.setPadding(0, 2, 80, 2);
  120. this.addView(inflate);
  121. if(reset){
  122. mChildList.set(index,inflate);
  123. }else{
  124. mChildList.add(index,inflate);
  125. }
  126. }
  127. boolean isFirst = true;
  128. public void start(){
  129. switchAnimation(XCAction.SHOW);
  130. if(isFirst){
  131. for(int i =0;i< mChildList.size();i++){
  132. mHandler.sendEmptyMessageDelayed(i,i * mDelayDuration);
  133. }
  134. isFirst = false;
  135. }
  136. mIsWorking = true;
  137. }
  138. public void hide(){
  139. switchAnimation(XCAction.HIDE);
  140. mIsWorking =false;
  141. }
  142. public void stop(){
  143. this.setVisibility(View.GONE);
  144. for(int i =0;i< mChildList.size();i++){
  145. mChildList.get(i).clearAnimation();
  146. mHandler.removeMessages(i);
  147. }
  148. mIsWorking =false;
  149. }
  150. @Override
  151. protected void onLayout(boolean changed, int l, int t, int r, int b) {
  152. super.onLayout(changed, l, t, r, b);
  153. int childCount = this.getChildCount();
  154. for(int i=0;i<childCount;i++){
  155. View view = getChildAt(i);
  156. LayoutParams lp = (LayoutParams) view.getLayoutParams();
  157. if(lp.leftMargin <= 0){
  158. if(mDirection == XCDirection.FORM_LEFT_TO_RIGHT){
  159. view.layout(-view.getMeasuredWidth(), lp.topMargin,
  160. 0,lp.topMargin + view.getMeasuredHeight());
  161. }else{
  162. view.layout(mScreenWidth,lp.topMargin,mScreenWidth+view.getMeasuredWidth(),
  163. lp.topMargin+view.getMeasuredHeight());
  164. }
  165. }else{
  166. continue;
  167. }
  168. }
  169. }
  170. private void switchAnimation(final XCAction action){
  171. AlphaAnimation animation;
  172. if(action == XCAction.HIDE){
  173. animation = new AlphaAnimation(1.0f,0.0f);
  174. animation.setDuration(400);
  175. }else{
  176. animation = new AlphaAnimation(0.0f,1.0f);
  177. animation.setDuration(1000);
  178. }
  179. MYBarrageView.this.startAnimation(animation);
  180. animation.setAnimationListener(new Animation.AnimationListener() {
  181. @Override
  182. public void onAnimationStart(Animation animation) {
  183. }
  184. @Override
  185. public void onAnimationEnd(Animation animation) {
  186. if(action == XCAction.HIDE){
  187. MYBarrageView.this.setVisibility(View.GONE);
  188. }else{
  189. MYBarrageView.this.setVisibility(View.VISIBLE);
  190. }
  191. }
  192. @Override
  193. public void onAnimationRepeat(Animation animation) {
  194. }
  195. });
  196. }
  197. private int getScreenWidth(){
  198. WindowManager mWm = (WindowManager) this.getContext()
  199. .getSystemService(Context.WINDOW_SERVICE);
  200. DisplayMetrics dm = new DisplayMetrics();
  201. // 获取屏幕信息
  202. mWm.getDefaultDisplay().getMetrics(dm);
  203. return dm.widthPixels;
  204. }
  205. }

Demo下载地址 https://download.csdn.net/download/liangyalong_1314/10432766

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liangyalong_1314/article/details/80422192
文章标签: 自定义view弹幕Android
个人分类: 自定义View

Android弹幕框架 黑暗火焰使

笑谈风云,一语定乾坤。大家好,我是皖江。 今天我将分享由BiliBili开源的Android弹幕框架(DanmakuFlameMaster)的学习经验。...

 shirakawakanaki

2016-10-20 11:25:13

阅读数:4340

Android弹幕功能实现,模仿斗鱼直播的弹幕效果

大家好,感觉好像已经很久没更新博客了。前段时间主要是忙于新书的事情,时间比较紧张。而现在新书已经完稿,剩下的事情就都是出版社的工作了,那么我又可以抽出时间来写写博客了。 记得之前有位朋友在我的公众号...

 sinyu890807

2016-10-18 08:01:32

阅读数:62620

海参的功效,北京人不知道海参有这些功效!沈阳盛鼎 · 顶新

开源弹幕引擎·烈焰弹幕使(DanmakuFlameMaster)使用解析

简介DanmakuFlameMaster 是 Android 上开源弹幕解析绘制引擎项目,也是 Android 上最好的开源弹幕引擎·烈焰弹幕。其架构清晰,简单易用,支持多种高效率绘制方式选择,支持多...

 benhuo931115

2016-04-04 15:04:32

阅读数:15682

Android 弹幕可用开源框架

1 黑暗火焰https://github.com/Bilibili/DanmakuFlameMaster2 开源组件https://github.com/linsea/OpenDanmaku...

 qq_30519365

2017-06-23 10:51:31

阅读数:312

Android项目中加入弹幕功能

大家好,最近的项目中需要实现弹幕的功能,于是乎就寻找了不少的材料,翻看了郭神写的弹幕博客,以及在github上查阅了哔哩哔哩开源的效果库。整合写了下有关弹幕的文章。 详细的有关弹幕知识可以查看:htt...

 lou_liang

2017-12-12 00:00:17

阅读数:313

android开源弹幕库,强力推荐

2014年06月19日 1.62MB 下载

大型水上娱乐设施生产厂家广州绿智集团 · 顶新

Android端弹幕效果实现

2016年10月16日 875KB 下载

Android开源弹幕引擎DanmakuFlameMaster源码解析

最近项目中需要添加弹幕功能,就用了B站的开源框架DanmakuFlameMaster。本文从源码分析了一下弹幕动起来的逻辑。...

 LX_LE

2017-03-05 16:38:39

阅读数:2001

android--------自定义弹幕控件(视频弹幕操作)

弹幕功能在很多平台上都有,直播平台,视频播放器,音乐等上面都有,直播平台发送弹幕和主播互动,那么弹幕效果是怎么实现的呢。案例主要是实现视频出现弹幕,可以文字和表情弹幕,启动和关闭弹幕,发布弹幕。效果图...

 DickyQie

2018-03-01 11:11:09

阅读数:144

Android自定义Dialog--DanmakuFlame弹幕发送框界面的实现

2017年09月26日 25.83MB 下载

Android 自定义 弹幕控件

前一段时间在学自定义view,正想尝试自己写一个简单的试一下,刚好看到阿曌姑娘写的弹幕集效果(原址:http://blog.csdn.net/XieYupeng520/article/details/...

 u012815217

2015-11-09 21:48:06

阅读数:1312

安卓漫漫路之实现简单的弹幕.

直播和看视频中越来越火的控件---弹幕(Danmaku) 本文即介绍怎样实现简单的弹幕效果:咱们使用的是哔哩哔哩开源的弹幕效果库 DanmakuFlameMaster. 必需:首先咱们在项目主工...

 HighForehead

2017-02-17 21:03:14

阅读数:2134

弹幕框架

弹幕框架DanmakuFlameMaster浅要分析

 jt_ontheway

2017-11-21 16:50:23

阅读数:529

安卓实时弹幕demo(一)弹幕效果

版权声明:本文为博主原创文章,未经博主允许不得转载。 //2016/08/03/// /by  XBW/// ...

 qq_35114086

2016-09-17 12:48:34

阅读数:525

Android弹幕效果实现

在B站或者其他视频网站看视频时候,常常会打开弹幕效果,边看节目边看大家的吐槽。弹幕效果看起来很有意思,今天我们就来实现一个简单的弹幕效果。 直观的看,弹幕效果就是在一个ViewGroup上增加一些V...

 goodlixueyong

2016-02-25 15:08:42

阅读数:11883

<em>android</em>下实现插件的<em>框架</em>

<em>android</em>开源<em>弹幕</em>库,强力推荐 立即下载 上传者: linbin_ 时间: 2014-06-19 综合评分: ...

下载

2018年05月04日 00:00

Android缓存框架 LruCache

笑谈风云,一语定乾坤。大家好,我是皖江。从今天开始,我将和大家一起分享我的Android框架学习经验之路。万丈高楼平地起,我就从小小的缓存策略开始学习吧。 简介:说起Android的缓存,主要用到的...

 shirakawakanaki

2016-10-12 14:13:35

阅读数:461

【Android效果集】弹幕效果

之前在网上有看到过iOS的弹幕效果实现,搜了一下发现Android实现弹幕效果的帖子比较少,而且写得都不是很好理解,于是尝试自己做了一下,写成这篇博客,分享出来。最终效果展示: 实现思路:1.自定义...

 XieYupeng520

2015-11-02 23:42:10

阅读数:15693

Android实现弹幕效果

相信大家看视频的时候都会有弹幕效果,这似乎已经成为视频软件的标配,接下来让我们来看看如何实现这个弹幕效果。 一.弹幕效果分析 我可以看到,弹幕效果是在屏幕上方飘过,...

 m0_37136295

2017-05-18 15:44:11

阅读数:1747

Android下的弹幕的简单实现

Android下的弹幕的简单实现简介 今天给大家带来一个前几天在做工程的时候写的一个有意思的Android弹幕实现,可以用来吐槽,介绍APP之类的~非常简单~几行代码~哈哈~下面是下载地址~下载地址...

 u013504718

2015-11-19 15:26:16

阅读数:4354

个人资料

Android丶龙

关注

原创
5
粉丝
0
喜欢
0
评论
0
等级:
访问:
205
积分:
51
排名:
169万+

最新文章

  • android studio 创建项目失败原因Failed to create
  • android 自定义上圆角下直角的imageview控件
  • Android 快速注释设置快捷键
  • Android studio 虚拟机启动不了Staring AVD

个人分类

  • 自定义View2篇
  • android studio 安装技巧2篇
  • BUG1篇

归档

  • 2018年5月3篇
  • 2018年4月2篇

热门文章

  • Android studio 虚拟机启动不了Staring AVD

    阅读量:110

  • Android 快速注释设置快捷键

    阅读量:45

  • Android 自定义控件-------弹幕

    阅读量:36

  • android 自定义上圆角下直角的imageview控件

    阅读量:7

  • android studio 创建项目失败原因Failed to create

    阅读量:5

联系我们

请扫描二维码联系客服

webmaster@csdn.net

400-660-0108

QQ客服 客服论坛

关于招聘广告服务  百度

©1999-2018 CSDN版权所有

京ICP证09002463号

经营性网站备案信息

网络110报警服务

中国互联网举报中心

北京互联网违法和不良信息举报中心

  • 0

  • 收藏
  • 评论
  • 微信
  • 微博
  • QQ
关闭

给你的app加上炫酷特效——弹幕相关推荐

  1. 对一些常见的HTML5特效进行整理和运行(有趣特效,烟花特效,爱心特效,炫酷特效)

    有趣特效 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" lang="en&quo ...

  2. 38.鼠标移动炫酷特效

    效果 (源码网盘地址在最后) 视频演示 「前端编程实战 38」HTML+CSS3 实现鼠标移动炫酷特效 视频演示地址一:https://www.bilibili.com/video/BV1Xz411v ...

  3. 华为手机线刷工具_原来华为手机自带视频剪辑工具!简单操作几步,就能添加炫酷特效...

    短视频是两年很火的社交手段之一,不管是在微博还是微信朋友圈了,很多朋友都喜欢使用视频来表达自己的动态. 有些朋友为了让自己的视频更加好看,就给视频添加字幕.音乐.动画等元素,但这些操作都要使用第三方工 ...

  4. ❤ 十一个拿来就能用的网页炫酷特效

    ❤ 十个拿来就能用的网页炫酷特效 效果如下: (1) 鼠标点击爱心 <!DOCTYPE html> <html lang="en"> <head> ...

  5. JS 炫酷特效敢超 Flash

    千一网络收集的几十个超酷 JavaScript 特效,这些特效在网上有些也有发布,不过这个应该是最全的. JS 炫酷特效敢超 Flash-3D 特效演示 JS 炫酷特效敢超 Flash-阵列特效演示 ...

  6. H5炫酷特效系列4——炫酷粒子变化特效

    这个示例虽然没有相对比较实用的特性,但是表现出来的效果确实非常震撼眼球.先上效果图,让各位同胞感受一下: 特效的表现感很强,有兴趣的读者可以仔细学习一下下面的代码,尝试着理解其中的逻辑. <!D ...

  7. android 天气动画,为app制作炫酷天气动画 – WeatherView

    WeatherView 从1.1.0版本开始这个库使用了一个不同的setter结构. WeatherView是一个为app制作一个炫酷天气动画的Android库. Setup Android Stud ...

  8. php文字添加投影,视频加动态标题文字 视频标题文字添加阴影边框 给视频加上炫酷的文字标题...

    开篇就来点个题:今天的教程内容就是视频添加文字标题,虽然都是给视频加文字标题但是今天的和往常有点不太一样呢!软件中不仅自带了许多炫酷的标题模板外,还可以对文字标题进行编辑,给标题添加动态效果,修改文字 ...

  9. ThreeJS 炫酷特效旋转多面体Web页 Demo 01《ThreeJS 炫酷特效制作》

    本案例为一个 threejs 的特效网页,大小球体进行包裹,外球体为透明材质,但是进行了线框渲染,使其能够通过外球踢查看其内球体. 注:案例参考源于互联网,在此做代码解释,侵删 本案例除 ThreeJ ...

最新文章

  1. 【IntelliJ IDEA】导出可执行 JAR 包
  2. oenwrt 进不了bios_win7进不了bios原因及解决办法
  3. K3C官改固件更新frp客户端
  4. flash小黄油安卓_从Android 1到10 一起回顾伴随我们成长的安卓系统
  5. webpack性能优化
  6. Hongda -接小球游戏
  7. oppoa9处理器怎么样_oppo a9是什么处理器
  8. 一位尚德机构网课老师的一天:从容、热爱与“一键全连”
  9. Option3X 5G 全网部署(基于 IUV_5G 软件)
  10. photoshop中怎么绘制虚线
  11. python列表查找整数_Python:找出整数列表是否为coheren
  12. 宏定义和函数有何区别
  13. 蚁群算法解决多峰函数优化问题
  14. 使用API进行FTP文件上传和下载
  15. 我的世界java服务器地址ip_我的世界服务器地址大全
  16. 已知法向量 求投影_求点在平面上的投影点坐标
  17. 24/7专业家庭安全监控值得吗?
  18. Linux内核配置选项 参考(2)
  19. C语言中 char s[] 和 char* s 的区别
  20. 初入Android~系统化学习必备(转自http://bbs.weand.com/read-htm-tid-6142.html)

热门文章

  1. 关于HTML的基础知识的介绍
  2. (C语言)计算e的x次方
  3. C语言实现二叉树的插入和删除
  4. 一文搞定:SpringBoot 集成 Apollo 配置中心
  5. 人工智能AI威武,爱也……恨也……
  6. 如何下载使用Bootstrap?
  7. wp8.1 java,全新正式版的WP8.1系统
  8. Robosense M1/速腾半固态激光雷达M1 保姆级教程1-如何连接雷达?
  9. Ncurses入门-(二)游标与窗口
  10. url栏有汉字 php,php处理带有中文URL的方法