好久没有写过文章,最近发现直播特别的火,很多应用都集成了直播的功能,发现有些直播是带有弹幕的,效果还不错,今天心血来潮,特地写了篇制作弹幕的文章。
今天要实现的效果如下:
1。弹幕垂直方向固定
2。弹幕垂直方向随机
上面效果图中白色的背景就是弹幕本身,是一个自定义的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自制精彩弹幕效果