Android自制精彩弹幕效果

  

好久没有写过文章,最近发现直播特别的火,很多应用都集成了直播的功能,发现有些直播是带有弹幕的,效果还不错,今天心血来潮,特地写了篇制作弹幕的文章。

  

今天要实现的效果如下:

  

1。弹幕垂直方向固定

  

 Android自制精彩弹幕效果

  

2。弹幕垂直方向随机

  

 Android自制精彩弹幕效果

  

上面效果图中白色的背景就是弹幕本身,是一个自定义的FrameLayout,我这里是为了更好的展示弹幕的位置才设置成了白色,当然如果是叠加在VideoView上的话,就需要设置成透明色了。
  制作弹幕需要考虑以下几点问题:
  1.弹幕的大小可以随意调整
  2 .弹幕内移动的项目(或者称字幕)出现的位置,水平方向是从屏幕右边移动到屏幕左边,垂直方向是不能超出弹幕本身的高度的。
  3 .字幕移除屏幕后,需要将对应项目(字幕)从其父容器(弹幕)中移除。
  4 .如果字幕出现的垂直方向的高度是随机的,那么还需要避免字幕重叠的情况。

  

好的,下面是弹幕自定义视图的代码:

     /* *   *由戴尔>/* *   *由戴尔2016/9/28。   */公开课Danmu {   私人字符串headerUrl;//头像   私人字符串的用户名;//昵称   私人字符串信息;//信息      公共字符串getHeaderUrl () {   返回headerUrl;   }      公共空间setHeaderUrl(字符串headerUrl) {   这一点。headerUrl=headerUrl;   }      公共字符串getUserName () {   返回用户名;   }      公共空间setUserName(字符串的用户名){   这一点。用户名=用户名;   }      公共字符串getInfo () {   返回信息;   }      公共空间setInfo(字符串信息){   this.info=信息;   }   }      测试类,MainActivity      公开课MainActivity延伸AppCompatActivity {   DanmuView mDanmuView;   EditText mMsgEdt;   按钮mSendBtn;   处理程序mDanmuAddHandler;   布尔continueAdd;   int计数器;      @Override   保护无效onResume () {   super.onResume ();   mDanmuView.startPlay(真正);//真表示弹幕的垂直方向是固定的,错误则随机   continueAdd=true;   mDanmuAddHandler。sendEmptyMessageDelayed (0, 6000);   }      @Override   保护无效onPause () {   super.onPause ();   continueAdd=false;   mDanmuAddHandler.removeMessages (0);   }      @Override   保护无效onCreate(包savedInstanceState) {   super.onCreate (savedInstanceState);   setContentView (R.layout.activity_main);   initView ();   initData ();   initListener ();   }      私人空间initView () {   mDanmuView=(DanmuView) findViewById (R.id.danmuView);   EditText mMsgEdt=() findViewById (R.id.edt_msg);   mSendBtn=(按钮)findViewById (R.id.btn_send);   }      私人空间initData () {   List,danmuList=new ArrayList<的在();   for (int i=0;我& lt;3;我+ +){   Danmu Danmu=new Danmu ();   danmu.setHeaderUrl (“http://tupian.qqjay.com/tou3/2016/0725/cb00091099ffbf09f4861f2bbb5dd993.jpg”);   danmu.setUserName(“先生。陈”+ i);   danmu.setInfo(“我是弹幕啊,不要问我为什么不可以那么长! ! !”);   danmuList.add (danmu);   }   mDanmuView.add (danmuList);//下面是模拟每秒添加一个弹幕的过程   HandlerThread ht=new HandlerThread(“发送danmu”);   ht.start ();   mDanmuAddHandler=新处理程序(ht.getLooper ()) {   @Override   公共空间handleMessage(消息味精){   runOnUiThread(新Runnable () {   @Override   公共空间run () {   Danmu Danmu=new Danmu ();   danmu.setHeaderUrl (“http://tupian.qqjay.com/tou3/2016/0803/87a8b262a5edeff0e11f5f0ba24fb22f.jpg”);   danmu.setUserName(“先生。新的“+(计数器+ +));   danmu.setInfo(“新的弹幕啊! ! !新的弹幕啊! ! !新的弹幕啊! ! !新的弹幕啊! ! !”);   mDanmuView.add (danmu);   }   });//继续添加   如果(continueAdd) {   sendEmptyMessageDelayed (0, 1000);   }   }   };   }      私人空间initListener () {//手动添加   mSendBtn。setOnClickListener(新View.OnClickListener () {   @Override   公共空间onClick(查看v) {   .trim .toString字符串味精=mMsgEdt.getText () () ();   如果(TextUtils.isEmpty(味精)){   Toast.makeText (MainActivity。:“亲,你想发送什么啊& # 63;”Toast.LENGTH_SHORT),告诉();   返回;   }   mMsgEdt.setText (" ");   Danmu Danmu=new Danmu ();   danmu.setHeaderUrl (http://img0.imgtn.bdimg.com/it/u=2198087564, 4037394230, fm=11, gp=0. jpg”);   danmu。setUserName(“我女士好人”);   danmu。setInfo(“我是新人:“+味精);   mDanmuView.add (danmu);   }   });   }   }   

Android自制精彩弹幕效果