android 图文弹幕重叠,Android双重SurfaceView实现弹幕效果
本文实例为大家分享了Android双重SurfaceView实现弹幕效果的具体代码,供大家参考,具体内容如下
页面布局
首先是XML的layout布局,这里的总的父布局是一个FrameLayout用于贴上两个SurfaceView,一个用来播放视频,一个用来显示弹幕
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".DanmuActivity">
android:id="@+id/sv_text"
android:layout_width="match_parent"
android:layout_height="400dp"/>
android:id="@+id/sv_media"
android:layout_width="match_parent"
android:layout_height="400dp"/>
/>
android:id="@+id/et_text"
android:layout_width="300dp"
android:layout_height="wrap_content"
android:layout_marginTop="450dp"/>
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="发送"
android:layout_marginTop="500dp"
android:onClick="Gogo"/>
对象类
创建一个对象类来存放你所发送的弹幕
public class Danmu {
String text;//弹幕内容
int x;//x轴
int y;//y轴
public Danmu(String text){
this.text = text;
//将y设置为随机,弹幕出现的位置也为随机
this.y = (int) (Math.random()*400);
this.x = 0;
}
}
Activity实现SurfaceHolder.Callback并重写其方法
先定义需要的东西,播放视频我们用Mediaplayer
//视频播放
private MediaPlayer mediaPlayer;
//弹幕Surface与视频Surface
private SurfaceView sv_text,sv_media;
//两个Surface对应的两个holder
private SurfaceHolder text_holder,media_holder;
EditText editText;//字幕输入框
List list = new ArrayList<>();//存放
初始化MediaPlayer,要在第一步执行否则运行会报空,这里封装成了一个方法,直接在onCreate内调用
private void initPlayer() throws IOException {
//先判断是否创建过,没创建就创建出来
if (mediaPlayer == null) {
mediaPlayer = new MediaPlayer();
}
mediaPlayer.reset();//使其恢复空闲状态
//播放的资源
mediaPlayer.setDataSource("http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4");
mediaPlayer.prepare();//准备
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {//准备完毕了
mediaPlayer.start();//播放
}
});
}
初始化控件,同样封装为方法,holder用对应的Surface获取到
private void initView() {
sv_text = findViewById(R.id.sv_text);
text_holder = sv_text.getHolder();
text_holder.addCallback(this);
sv_media = findViewById(R.id.sv_media);
media_holder = sv_media.getHolder();
media_holder.addCallback(this);
editText = findViewById(R.id.et_text);
//设置透明,将播放弹幕的Surface放到第一位并设置为背景透明
sv_text.setZOrderOnTop(true);
text_holder.setFormat(PixelFormat.TRANSPARENT);
}
接下来是Surface.Callback重写的方法
@Override
public void surfaceCreated(SurfaceHolder holder) {
//判断当前holder是否是media的那个
if (holder == media_holder) {
//设置要显示的Surfaceholder
mediaPlayer.setDisplay(media_holder);
//判断当前holder是否是字幕的那个
} else if (holder == text_holder) {
//创建线程执行耗时操作
new Thread() {
@Override
public void run() {
super.run();
//死循环用来一直更新弹幕的位置
while (true) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
Paint paint = new Paint();//创建画笔
paint.setStrokeWidth(5);//画笔粗细
paint.setColor(Color.GREEN);//画笔颜色
paint.setTextSize(30);//设置文字大小
//创建画板
Canvas canvas = text_holder.lockCanvas();
//判断若画板为空则跳出循环
if (canvas == null) {
break;
}
//设置画布颜色,透明
canvas.drawColor(PixelFormat.TRANSPARENT,PorterDuff.Mode.CLEAR);
//用循环来你的弹幕集合并且在画板上展示出来
//x+=20为你的弹幕在不断的从左到右移动
for (Danmu danmu : list) {
canvas.drawText(danmu.text,danmu.x += 20,danmu.y,paint);
//若移动的位置大于视频Surface的宽度了就归0
if (danmu.x > sv_media.getWidth()) {
danmu.x = 0;
}
}
//将画布解锁并显示到屏幕上
text_holder.unlockCanvasAndPost(canvas);
}
}
}.start();//不要忘记开启线程
}
}
发送的按钮的点击事件
public void Gogo(View view) {
//先判断输入框里有没有东西
if (!editText.getText().toString().isEmpty() && !editText.getText().toString().equals("")) {
Danmu danmu = new Danmu(editText.getText().toString());
list.add(danmu);
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
总结
如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
小编个人微信号 jb51ccc
喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!
android 图文弹幕重叠,Android双重SurfaceView实现弹幕效果相关推荐
- android app画面重叠,Android重新打开APP应用程序或activity后fragment 重叠问题
问题发生的场景: 产生原因: 解决方法1: (太low,不推荐使用.不能恢复重启前的界面) 直接在包含Fragment的Activity中复写onSaveInstanceState()方法,使其空实现 ...
- Android气泡弹幕,Android弹幕实现:基于B站弹幕开源系统(7)QQ、微信聊天气泡样式的弹幕...
Android弹幕实现:基于B站弹幕开源系统(7)QQ.微信聊天气泡样式的弹幕 在附录文章得基础上,改进普通文本弹幕,实现一种特殊效果的文本弹幕,像QQ.微信一样的带有气泡背景的弹幕.实现的重点是在S ...
- android实现b站弹幕,Android弹幕实现:基于B站弹幕开源系统(2)
?? Android弹幕实现:基于B站弹幕开源系统(2) 在附录1的基础上,模拟实现一种实际开发的应用场景:从网络中不间断的周期取弹幕数据,这些弹幕数据往往是批量的,然后把这些从网络中取到的批量数据逐 ...
- Android弹幕实现:基于B站弹幕开源系统(3)-文本弹幕的完善和细节调整
Android弹幕实现:基于B站弹幕开源系统(3) 本文在附录1,2的基础上再次对异步获取弹幕并显示弹幕完善逻辑和代码,集中在上层Java代码部分: package zhangphil.danm ...
- android+弹幕实现,Android弹幕实现:基于B站弹幕开源系统(1)
Android弹幕实现:基于B站弹幕开源系统(1) 如今的视频播放,流行在视频上飘弹幕.这里面做的相对比较成熟.稳定.使用量较多的弹幕系统,当推B站的弹幕系统,B站的弹幕系统已经作为开源项目在g ...
- Android弹幕实现:基于B站弹幕开源系统(1)
Android弹幕实现:基于B站弹幕开源系统(1) 如今的视频播放,流行在视频上飘弹幕.这里面做的相对比较成熟.稳定.使用量较多的弹幕系统,当推B站的弹幕系统,B站的弹幕系统已经作为开源项目在g ...
- android 清理缓存动画,Android仿微信清理内存图表动画(解决surfaceView屏幕闪烁问题)demo实例详解...
最近接了一个项目其中有功能要实现一个清理内存,要求和微信的效果一样.于是想到用surfaceView而不是继承view.下面小编给大家解析下实现思路. surfaceView是为了解决频繁绘制动画产生 ...
- 【Android游戏开发之六】在SurfaceView中添加组件!!!!并且相互交互数据!!!!...
本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/306.html ...
- android 点击图片事件,android图文混排点击事件
图文混排顾名思义就是把文字和图片混合排列在一起,比较简单的需求我们也可以通过TextView和ImageView配合使用来达到目的,但是遇到稍微复杂一些的情况这种方法就不适用了. 做这样一个按钮: 对 ...
最新文章
- java 小对话框_创建Java对话框
- Linux系统资源管理 之 硬件信息
- 【Windows 逆向】内存地址分析 ( 内存条 | 虚拟内存 | 内存地址及寻址范围 | 内存地址与数据的关系 )
- 一个可以显示具体时间的日历控件应用
- PHP框架的ORM思想:O类的实例化 R数据表 M映射XML
- 常见索引结构—B-树
- Flsak爱家租房--实名认证
- 使用bootstrap-table插件
- Flink中的状态管理
- python导入自己写的模块_大话python模块导入
- drop out, learning rate in nn
- vs2013 命名空间“Microsoft.Office”中不存在类型或命名空间名称“Interop”。是否缺少程序集引用?...
- 平行坐标图:高维数据可视化必备图形
- 怎么将几张pdf合并成一张_如何将多个PDF合并成一个PDF?PDF文档合并成单个的方法...
- 甲骨文裁员900多人,赔偿N+6,有人获赔100万,被裁也能致富?
- 微信,微博,qq账号合并的大工程啊
- 24个基本指标精粹讲解(16)--DMA
- createrepo的用法
- postgresql 修改id的自增起始数
- python用turtle画小猪佩奇_python 用turtle 画小猪佩奇
热门文章
- 20201022-成信大-C语言程序设计-20201学期《C语言程序设计B》C-trainingExercises02
- 有趣的“灵魂”库集合
- 音频算法工程师发展前景
- DVWA靶场通关教程
- java7java8 集合中对象的某一个字段分组
- AGV小车的运动是怎么控制的呢?
- Chrome Extension 小试牛刀
- python末尾加空格_Python3基础 print(,end=) 输出内容的末尾加入空格
- 基于加权对立和贪婪搜索多模态工程问题的黑猩猩优化算法(Matlab代码实现)
- 图片如何修复清晰度?好用的图片修复方法介绍