【Android 常见控件使用】DanmakuView(弹幕)
package com.example.barrage;
import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.VideoView;
import java.util.Random;
import master.flame.danmaku.controller.DrawHandler;
import master.flame.danmaku.danmaku.model.BaseDanmaku;
import master.flame.danmaku.danmaku.model.DanmakuTimer;
import master.flame.danmaku.danmaku.model.IDanmakus;
import master.flame.danmaku.danmaku.model.android.DanmakuContext;
import master.flame.danmaku.danmaku.model.android.Danmakus;
import master.flame.danmaku.danmaku.parser.BaseDanmakuParser;
import master.flame.danmaku.ui.widget.DanmakuView;
public class MainActivity extends AppCompatActivity {
// 获取控件
private EditText input;
private Button submit;
private DanmakuView danmaku;
private VideoView videoView;
private DanmakuContext danmakuContext;
private LinearLayout layout;
private boolean showDanmaku;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化界面控件
layout = findViewById(R.id.layout);
input = findViewById(R.id.input);
submit = findViewById(R.id.submit);
danmaku = findViewById(R.id.danmaku);
videoView = findViewById(R.id.videoView);
// 调用方法
playVideo();
initDanmaku();
}
// 播放视频
private void playVideo() {
// 获取视频路径
String uri = "://" + getPackageName() + "/" + R.raw.speed;
//String uri = "G:\\Projects\\AndroidStudioProjects\\Barrage\\app\\src\\main\\res\\raw\\sun.mp4";
if (uri != null) {
// 配置到 VideoView 组件中
videoView.setVideoURI(Uri.parse(uri));
videoView.start();
} else {
// 将背景设置为透明
videoView.getBackground().setAlpha(0);
}
}
// 弹幕解析器
private BaseDanmakuParser parser = new BaseDanmakuParser() {
@Override
protected IDanmakus parse() {
return new Danmakus();
}
};
// 初始化弹幕
private void initDanmaku(){
danmaku.setCallback(new DrawHandler.Callback() {
@Override
public void prepared() {
showDanmaku = true;
danmaku.start(); // 开始弹幕
generateDanmakus(); // 随机生成弹幕的方法
}
@Override
public void updateTimer(DanmakuTimer timer) {
}
@Override
public void danmakuShown(BaseDanmaku danmaku) {
}
@Override
public void drawingFinished() {
}
});
// 创建 DanmakuContext 上下文对象
danmakuContext = DanmakuContext.create();
// 开始缓存
danmaku.enableDanmakuDrawingCache(true);
// 弹幕view准备 --- 传入解析器
danmaku.prepare(parser,danmakuContext);
// 弹幕组件点击事件
danmaku.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (layout.getVisibility() == View.GONE){
layout.setVisibility(View.VISIBLE);
} else {
layout.setVisibility(View.GONE);
}
}
});
// 提交按钮点击事件
submit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String content = input.getText().toString();
if (!TextUtils.isEmpty(content)){
addDanmaku(content,true); // 添加一条弹幕
input.setText("");
}
}
});
}
// 添加弹幕
private void addDanmaku(String content, boolean border) {
// 创建弹幕对象,设置从右向左滚动
BaseDanmaku baseDanmaku = danmakuContext.mDanmakuFactory.createDanmaku(BaseDanmaku.TYPE_SCROLL_RL);
baseDanmaku.text = content; // 设置内容
baseDanmaku.padding = 6; // 设置边距
baseDanmaku.textSize = 25; // 设置弹幕字体大小
baseDanmaku.textColor = Color.WHITE; // 设置弹幕字体颜色
baseDanmaku.setTime(danmaku.getCurrentTime()); // 设置当前时间
if (border){
baseDanmaku.borderColor = Color.BLUE; // 设置边框颜色
}
// 添加弹幕至弹幕视图组件中
danmaku.addDanmaku(baseDanmaku);
}
// 随机生成弹幕
private void generateDanmakus() {
// 启用线程随机生成弹幕
new Thread(new Runnable() {
@Override
public void run() {
while (showDanmaku) {
int num = new Random().nextInt(300);
String content = ""+num;
addDanmaku(content,false);
try {
Thread.sleep(num);
} catch (Exception e){
e.printStackTrace();
}
}
}
}).start();
}
@Override
protected void onPause() {
super.onPause();
if (danmaku!=null && danmaku.isPrepared()){
danmaku.pause();
}
}
@Override
protected void onResume() {
super.onResume();
if (danmaku!=null && danmaku.isPrepared() && danmaku.isPaused()){
danmaku.resume();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
showDanmaku = false;
if (danmaku!=null){
danmaku.release();
danmaku= null;
}
}
}