首页 > 编程知识 正文

b站自定义弹幕,弹幕功能

时间:2023-05-05 14:28:49 阅读:276530 作者:2965

弹幕在直播中是一个比较重要的功能,而开源的B站弹幕可以让我们轻松的实现这个功能。
其实现原理大概就是在页面的上方盖了一层全透明的View,然后再View中添加需要的弹幕效果。
上图:

1、首先,在项目中添加依赖:

implementation 'com.github.ctiao:DanmakuFlameMaster:0.5.3'

其次,就在xml文件中添加覆盖的透明View

<master.flame.danmaku.ui.widget.DanmakuView android:id="@+id/danmaku_view" android:layout_width="match_parent" android:layout_height="match_parent" />

最后就是在Activity中的逻辑:

public class MainActivity extends AppCompatActivity {//引入弹幕所需变量 private DanmakuView danmakuView; private DanmakuContext danmakuContext; private boolean showDanmaku; //发送弹幕的输入框和按钮 private EditText editText; private Button btl; private BaseDanmakuParser parser = new BaseDanmakuParser() { @Override protected IDanmakus parse() { return new Danmakus(); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); danmakuView = (DanmakuView) findViewById(R.id.danmaku_view); editText = findViewById(R.id.et); btl = findViewById(R.id.bt); danmakuView.enableDanmakuDrawingCache(true);//点击发送按钮监听 btl.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String str = editText.getText().toString(); if (!TextUtils.isEmpty(str)) { //添加弹幕,str为内容。true为是自己发送的,添加方框 addDanmaku(str, true); editText.setText(""); } } }); danmakuView.setCallback(new DrawHandler.Callback() { @Override public void prepared() { showDanmaku = true; danmakuView.start(); generateSomeDanmaku(); } @Override public void updateTimer(DanmakuTimer timer) { } @Override public void danmakuShown(BaseDanmaku danmaku) { } @Override public void drawingFinished() { } }); danmakuContext = DanmakuContext.create(); danmakuView.prepare(parser, danmakuContext); } /** * 添加一条弹幕 * * @param content 弹幕的具体内容 * @param withBorder 弹幕是否有边框 */ private void addDanmaku(String content, boolean withBorder) { BaseDanmaku danmaku = danmakuContext.mDanmakuFactory.createDanmaku(BaseDanmaku.TYPE_SCROLL_RL); //设置弹幕内容和样式 danmaku.text = content; danmaku.padding = 5; danmaku.textSize = sp2px(20); danmaku.textColor = Color.BLACK; danmaku.setTime(danmakuView.getCurrentTime()); if (withBorder) { danmaku.borderColor = Color.GREEN; } danmakuView.addDanmaku(danmaku); } /** * sp转px的方法。 */ public int sp2px(float spValue) { final float fontScale = getResources().getDisplayMetrics().scaledDensity; return (int) (spValue * fontScale + 0.5f); } @Override protected void onPause() { super.onPause(); if (danmakuView != null && danmakuView.isPrepared()) { danmakuView.pause(); } } @Override protected void onResume() { super.onResume(); if (danmakuView != null && danmakuView.isPrepared() && danmakuView.isPaused()) { danmakuView.resume(); } } @Override protected void onDestroy() { super.onDestroy(); showDanmaku = false; if (danmakuView != null) { danmakuView.release(); danmakuView = null; } }}

至此。基本的弹幕的功能就算现完成了。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。