弹幕在直播中是一个比较重要的功能,而开源的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;
}
}
}
至此。基本的弹幕的功能就算现完成了。