给你的app加上炫酷特效——弹幕

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

liangyalong_1314的博客

RSS订阅

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


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

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

文章标签:  自定义 view 弹幕 Android
个人分类:  自定义View

Android弹幕框架 黑暗火焰使

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

shirakawakanaki shirakawakanaki

2016-10-20 11:25:13

阅读数:4340

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

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

sinyu890807 sinyu890807

2016-10-18 08:01:32

阅读数:62620

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

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

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

benhuo931115 benhuo931115

2016-04-04 15:04:32

阅读数:15682

Android 弹幕可用开源框架

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

qq_30519365 qq_30519365

2017-06-23 10:51:31

阅读数:312

Android项目中加入弹幕功能

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

lou_liang 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 LX_LE

2017-03-05 16:38:39

阅读数:2001

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

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

DickyQie 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 u012815217

2015-11-09 21:48:06

阅读数:1312

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

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

HighForehead HighForehead

2017-02-17 21:03:14

阅读数:2134

弹幕框架

弹幕框架DanmakuFlameMaster浅要分析

jt_ontheway jt_ontheway

2017-11-21 16:50:23

阅读数:529

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

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

qq_35114086 qq_35114086

2016-09-17 12:48:34

阅读数:525

Android弹幕效果实现

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

goodlixueyong goodlixueyong

2016-02-25 15:08:42

阅读数:11883

android下实现插件的框架

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

下载

2018年05月04日 00:00

Android缓存框架 LruCache

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

shirakawakanaki shirakawakanaki

2016-10-12 14:13:35

阅读数:461

Android效果集】弹幕效果

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

XieYupeng520 XieYupeng520

2015-11-02 23:42:10

阅读数:15693

Android实现弹幕效果

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

m0_37136295 m0_37136295

2017-05-18 15:44:11

阅读数:1747

Android下的弹幕的简单实现

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

u013504718 u013504718

2015-11-19 15:26:16

阅读数:4354

个人资料

关注
原创
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

  • 0


  • 收藏

  • 评论

  • 微信

  • 微博

  • QQ
关闭

你可能感兴趣的:(自定义,view,弹幕,Android,自定义View)