本文实例为大家分享了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实现弹幕效果相关推荐

  1. android app画面重叠,Android重新打开APP应用程序或activity后fragment 重叠问题

    问题发生的场景: 产生原因: 解决方法1: (太low,不推荐使用.不能恢复重启前的界面) 直接在包含Fragment的Activity中复写onSaveInstanceState()方法,使其空实现 ...

  2. Android气泡弹幕,Android弹幕实现:基于B站弹幕开源系统(7)QQ、微信聊天气泡样式的弹幕...

    Android弹幕实现:基于B站弹幕开源系统(7)QQ.微信聊天气泡样式的弹幕 在附录文章得基础上,改进普通文本弹幕,实现一种特殊效果的文本弹幕,像QQ.微信一样的带有气泡背景的弹幕.实现的重点是在S ...

  3. android实现b站弹幕,Android弹幕实现:基于B站弹幕开源系统(2)

    ?? Android弹幕实现:基于B站弹幕开源系统(2) 在附录1的基础上,模拟实现一种实际开发的应用场景:从网络中不间断的周期取弹幕数据,这些弹幕数据往往是批量的,然后把这些从网络中取到的批量数据逐 ...

  4. Android弹幕实现:基于B站弹幕开源系统(3)-文本弹幕的完善和细节调整

     Android弹幕实现:基于B站弹幕开源系统(3) 本文在附录1,2的基础上再次对异步获取弹幕并显示弹幕完善逻辑和代码,集中在上层Java代码部分: package zhangphil.danm ...

  5. android+弹幕实现,Android弹幕实现:基于B站弹幕开源系统(1)

     Android弹幕实现:基于B站弹幕开源系统(1) 如今的视频播放,流行在视频上飘弹幕.这里面做的相对比较成熟.稳定.使用量较多的弹幕系统,当推B站的弹幕系统,B站的弹幕系统已经作为开源项目在g ...

  6. Android弹幕实现:基于B站弹幕开源系统(1)

     Android弹幕实现:基于B站弹幕开源系统(1) 如今的视频播放,流行在视频上飘弹幕.这里面做的相对比较成熟.稳定.使用量较多的弹幕系统,当推B站的弹幕系统,B站的弹幕系统已经作为开源项目在g ...

  7. android 清理缓存动画,Android仿微信清理内存图表动画(解决surfaceView屏幕闪烁问题)demo实例详解...

    最近接了一个项目其中有功能要实现一个清理内存,要求和微信的效果一样.于是想到用surfaceView而不是继承view.下面小编给大家解析下实现思路. surfaceView是为了解决频繁绘制动画产生 ...

  8. 【Android游戏开发之六】在SurfaceView中添加组件!!!!并且相互交互数据!!!!...

    本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/306.html   ...

  9. android 点击图片事件,android图文混排点击事件

    图文混排顾名思义就是把文字和图片混合排列在一起,比较简单的需求我们也可以通过TextView和ImageView配合使用来达到目的,但是遇到稍微复杂一些的情况这种方法就不适用了. 做这样一个按钮: 对 ...

最新文章

  1. java 小对话框_创建Java对话框
  2. Linux系统资源管理 之 硬件信息
  3. 【Windows 逆向】内存地址分析 ( 内存条 | 虚拟内存 | 内存地址及寻址范围 | 内存地址与数据的关系 )
  4. 一个可以显示具体时间的日历控件应用
  5. PHP框架的ORM思想:O类的实例化 R数据表 M映射XML
  6. 常见索引结构—B-树
  7. Flsak爱家租房--实名认证
  8. 使用bootstrap-table插件
  9. Flink中的状态管理
  10. python导入自己写的模块_大话python模块导入
  11. drop out, learning rate in nn
  12. vs2013 命名空间“Microsoft.Office”中不存在类型或命名空间名称“Interop”。是否缺少程序集引用?...
  13. 平行坐标图:高维数据可视化必备图形
  14. 怎么将几张pdf合并成一张_如何将多个PDF合并成一个PDF?PDF文档合并成单个的方法...
  15. 甲骨文裁员900多人,赔偿N+6,有人获赔100万,被裁也能致富?
  16. 微信,微博,qq账号合并的大工程啊
  17. 24个基本指标精粹讲解(16)--DMA
  18. createrepo的用法
  19. postgresql 修改id的自增起始数
  20. python用turtle画小猪佩奇_python 用turtle 画小猪佩奇

热门文章

  1. 20201022-成信大-C语言程序设计-20201学期《C语言程序设计B》C-trainingExercises02
  2. 有趣的“灵魂”库集合
  3. 音频算法工程师发展前景
  4. DVWA靶场通关教程
  5. java7java8 集合中对象的某一个字段分组
  6. AGV小车的运动是怎么控制的呢?
  7. Chrome Extension 小试牛刀
  8. python末尾加空格_Python3基础 print(,end=) 输出内容的末尾加入空格
  9. 基于加权对立和贪婪搜索多模态工程问题的黑猩猩优化算法(Matlab代码实现)
  10. 图片如何修复清晰度?好用的图片修复方法介绍