1:依赖: implementation ‘com.shuyu:GSYVideoPlayer:7.0.1’
implementation ‘com.github.ctiao:DanmakuFlameMaster:0.7.3’
2:布局
3:代码
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
OrientationUtils orientationUtils;
private DanmakuView danmaku_view;
private boolean showDanmaku;
private DanmakuContext danmakuContext;
/**
* 弹幕解析器
*/
private BaseDanmakuParser parser = new BaseDanmakuParser() {
@Override
protected IDanmakus parse() {
return new Danmakus();
}
};
private LinearLayout mOperationLayout;
private StandardGSYVideoPlayer video_player;
private Button butn1;
private EditText ed;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
init();
initDanmaku();
}
private void init() {
video_player = (StandardGSYVideoPlayer) findViewById(R.id.video_player);
String source1 = “http://9890.vod.myqcloud.com/9890_4e292f9a3dd011e6b4078980237cc3d3.f20.mp4”;
video_player.setUp(source1, true, “测试视频”);
AudioManager service = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
if (service != null) {
service.setRingerMode(AudioManager.RINGER_MODE_SILENT);
service.setStreamVolume(AudioManager.STREAM_MUSIC, 0, AudioManager.FLAG_PLAY_SOUND);
}
//增加封面
ImageView imageView = new ImageView(this);
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setImageResource(R.mipmap.ic_launcher);
video_player.setThumbImageView(imageView);
//增加title
video_player.getTitleTextView().setVisibility(View.VISIBLE);
//设置返回键
video_player.getBackButton().setVisibility(View.VISIBLE);
//设置旋转
orientationUtils = new OrientationUtils(this, video_player);
//设置全屏按键功能,这是使用的是选择屏幕,而不是全屏
video_player.getFullscreenButton().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
orientationUtils.resolveByClick();
}
});
//是否可以滑动调整
video_player.setIsTouchWiget(true);
//设置返回按键功能
video_player.getBackButton().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
video_player.startPlayLogic();
}
@Override
protected void onPause() {
super.onPause();
video_player.onVideoPause();
if (danmaku_view != null && danmaku_view.isPrepared()) {
danmaku_view.pause();
}
}
@Override
protected void onResume() {
super.onResume();
video_player.onVideoResume();
if (danmaku_view != null && danmaku_view.isPrepared() && danmaku_view.isPaused()) {
danmaku_view.resume();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
GSYVideoManager.releaseAllVideos();
if (orientationUtils != null)
orientationUtils.releaseListener();
showDanmaku = false;
if (danmaku_view != null) {
danmaku_view.release();
danmaku_view = null;
}
}
@Override
public void onBackPressed() {
//先返回正常状态
if (orientationUtils.getScreenType() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
video_player.getFullscreenButton().performClick();
return;
}
//释放所有
video_player.setVideoAllCallBack(null);
super.onBackPressed();
}
private void initView() {
danmaku_view = (DanmakuView) findViewById(R.id.danmaku_view);
video_player = (StandardGSYVideoPlayer) findViewById(R.id.video_player);
butn1 = (Button) findViewById(R.id.butn1);
mOperationLayout = (LinearLayout) findViewById(R.id.line);
butn1.setOnClickListener(this);
ed = (EditText) findViewById(R.id.ed);
//监听由于输入法弹出所致的沉浸问题
getWindow().getDecorView().setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {
@Override
public void onSystemUiVisibilityChange(int visibility) {
if (visibility == View.SYSTEM_UI_FLAG_VISIBLE) {
onWindowFocusChanged(true);
}
}
});
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.butn1:
String data = ed.getText().toString();
if (!TextUtils.isEmpty(data)) {
addDanmaku(data, true);
ed.setText("");
}
break;
}
}
/**
* sp转px的方法。
*/
public int sp2px(float spValue) {
final float fontScale = getResources().getDisplayMetrics().scaledDensity;
return (int) (spValue * fontScale + 0.5f);
}
private void addDanmaku(String data, boolean b) {
//弹幕实例BaseDanmaku,传入参数是弹幕方向
BaseDanmaku danmaku = danmakuContext.mDanmakuFactory.createDanmaku(BaseDanmaku.TYPE_SCROLL_RL);
danmaku.text = data;
danmaku.padding = 5;
danmaku.textSize = sp2px(20);
danmaku.textColor = Color.WHITE;
danmaku.setTime(danmaku_view.getCurrentTime());
//加边框
if (b) {
danmaku.borderColor = Color.GREEN;
}
danmaku_view.addDanmaku(danmaku);
}
/**
* 初始化弹幕组件
*/
private void initDanmaku() {
//给弹幕视图设置回调,在准备阶段获取弹幕信息并开始
danmaku_view.setCallback(new DrawHandler.Callback() {
@Override
public void prepared() {
showDanmaku = true;
danmaku_view.start();
generateSomeDanmaku();
}
@Override
public void updateTimer(DanmakuTimer timer) {
}
@Override
public void danmakuShown(BaseDanmaku danmaku) {
}
@Override
public void drawingFinished() {
}
});
//缓存,提升绘制效率
danmaku_view.enableDanmakuDrawingCache(true);
//DanmakuContext主要用于弹幕样式的设置
danmakuContext = DanmakuContext.create();
danmakuContext.setDanmakuStyle(IDisplayer.DANMAKU_STYLE_STROKEN, 3);//描边
danmakuContext.setDuplicateMergingEnabled(true);//重复合并
danmakuContext.setScrollSpeedFactor(1.2f);//弹幕滚动速度
//让弹幕进入准备状态,传入弹幕解析器和样式设置
danmaku_view.prepare(parser, danmakuContext);
}
private void generateSomeDanmaku() {
new Thread(new Runnable() {
@Override
public void run() {
while (showDanmaku) {
int time = new Random().nextInt(300);
String content = "" + time + time;
addDanmaku(content, false);
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus && Build.VERSION.SDK_INT >= 19) {
View decorView = getWindow().getDecorView();
decorView.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
}
}
}