Android弹幕功能实现,模仿斗鱼直播的弹幕效果

本文详细介绍了如何在Android应用中实现弹幕效果,包括使用VideoView播放视频,以及集成开源库DanmakuFlameMaster创建自定义弹幕View。同时,还涉及了沉浸式模式的运用。
摘要由CSDN通过智能技术生成

==

首先我们来看一下斗鱼上的弹幕效果,如下图所示:

这是一个 Dota2 游戏直播的界面,我们可以看到,在游戏界面的上方有很多的弹幕,看直播的观众们就是在这里进行讨论的。

那么这样的一个界面该如何实现呢?其实并不复杂,我们只需要首先在布局中放置一个显示游戏界面的 View,然后在游戏界面的上方再覆盖一个显示弹幕的 View 就可以了。弹幕的 View 必须要做成完全透明的,这样即使覆盖在游戏界面的上方也不会影响到游戏的正常观看,只有当有人发弹幕消息时,再将消息绘制到弹幕的 View 上面就可以了。原理示意图如下所示:

但是我们除了要能看到弹幕之外也要能发弹幕才行,因此还要再在弹幕的 View 上面再覆盖一个操作界面的 View,然后我们就可以在操作界面上发弹幕、送礼物等。原理示意图如下所示:

这样我们就把基本的实现原理分析完了,下面就让我们开始一步步实现吧。

实现视频播放

由于本篇文章的主题是实现弹幕效果,并不涉及直播的任何其他功能,因此这里我们就简单地使用 VideoView 播放一个本地视频来模拟最底层的游戏界面。

首先使用 Android Studio 新建一个 DanmuTest 项目,然后修改 activity_main.xml 中的代码,如下所示:

布局文件的代码非常简单,只有一个 VideoView,我们将它设置为居中显示。
然后修改 MainActivity 中的代码,如下所示:

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
VideoView videoView = (VideoView) findViewById(R.id.video_view);
videoView.setVideoPath(Environment.getExternalStorageDirectory() + “/Pixels.mp4”);
videoView.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);
}
}

}

上面的代码中使用了 VideoView 的最基本用法。在 onCreate() 方法中获取到了 VideoView 的实例,给它设置了一个视频文件的地址,然后调用 start() 方法开始播放。当然,我事先已经在 SD 的根目录中准备了一个叫 Pixels.mp4 的视频文件。

这里使用到了 SD 卡的功能,但是为了代码简单起见,我并没有加入运行时权限的处理,因此一定要记得将你的项目的 targetSdkVersion 指定成 23 以下。

另外,为了让视频播放可以有最好的体验效果,这里使用了沉浸式模式的写法。对沉浸式模式还不理解的朋友可以参考我的上一篇文章 Android 状态栏微技巧,带你真正理解沉浸式模式

最后,我们在 AndroidManifest.xml 中将 Activity 设置为横屏显示并加入权限声明,如下所示:








OK,现在可以运行一下项目了,程序启动之后就会自动开始播放视频,效果如下图所示:

这样我们就把第一步的功能实现了。

实现弹幕效果

接下来我们开始实现弹幕效果。弹幕其实也就是一个自定义的 View,它的上面可以显示类似于跑马灯的文字效果。观众们发表的评论都会在弹幕上显示出来,但又会很快地移出屏幕,既可以起到互动的作用,同时又不会影响视频的正常观看。

我们可以自己来编写这样的一个自定义 View,当然也可以直接使用网上现成的开源项目。那么为了能够简单快速地实现弹幕效果,这里我就准备直接使用由哔哩哔哩开源的弹幕效果库 DanmakuFlameMaster 了。

DanmakuFlameMaster 库的项目主页地址是:github.com/Bilibili/Da…

话说现在使用 Android Studio 来引入一些开源库真的非常方便,只需要在 build.gradle 文件里面添加开源库的依赖就可以了。那么我们修改 app/build.gradle 文件,并在 dependencies 闭包中添加如下依赖:

dependencies {
compile fileTree(dir: ‘libs’, include: [‘*.jar’])
compile ‘com.android.support:appcompat-v7:24.2.1’
testCompile ‘junit:junit:4.12’
compile ‘com.github.ctiao:DanmakuFlameMaster:0.5.3’
}

这样我们就将 DanmakuFlameMaster 库引入到当前项目中了。然后修改 activity_main.xml 中的代码,如下所示:

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

可以看到,这里在 RelativeLayout 中加入了一个 DanmakuView 控件,这个控件就是用于显示弹幕信息的了。注意一定要将 DanmakuView 写在 VideoView 的下面,因为 RelativeLayout 中后添加的控件会被覆盖在上面。

接下来修改 MainActivity 中的代码,我们在这里加入弹幕显示的逻辑,如下所示:

public class MainActivity extends AppCompatActivity {

private boolean showDanmaku;

private DanmakuView danmakuView;

private DanmakuContext danmakuContext;

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);
VideoView videoView = (VideoView) findViewById(R.id.video_view);
videoView.setVideoPath(Environment.getExternalStorageDirectory() + “/Pixels.mp4”);
videoView.start();
danmakuView = (DanmakuView) findViewById(R.id.danmaku_view);
danmakuView.enableDanmakuDrawingCache(true);
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);
}

/**

  • 向弹幕View中添加一条弹幕
  • @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.WHITE;
danmaku.setTime(danmakuView.getCurrentTime());
if (withBorder) {
danmaku.borderColor = Color.GREEN;
}
danmakuView.addDanmaku(danmaku);
}

/**

  • 随机生成一些弹幕内容以供测试
    */
    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();
    }

/**

  • 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();
}
}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

总之啊,家里没矿的同学们,如果你们想以后的日子过得好一些,多想想你们的业余时间怎么安排吧;

技术方面的提升肯定是重中之重,但是技术外的一些“软实力”也不能完全忽视,很多时候升职确实是因为你的技术足够强,但也与你的“软实力”密切相关

在这我也分享一份大佬自己收录整理的 Android学习PDF+架构视频+面试文档+源码笔记 ,还有高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料这些都是我闲暇还会反复翻阅并给下属员工学习的精品资料。在脑图中,每个知识点专题都配有相对应的实战项目,可以有效的帮助大家掌握知识点。

总之也是在这里帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习

相信自己,没有做不到的,只有想不到的

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

专题都配有相对应的实战项目,可以有效的帮助大家掌握知识点。

总之也是在这里帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习

[外链图片转存中…(img-rbMHqiZJ-1712562985576)]

[外链图片转存中…(img-eIFTykpn-1712562985576)]

相信自己,没有做不到的,只有想不到的

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 26
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值