版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】怎么使用SurfaceView播放视频发送弹幕
本篇文章为大家展示了怎么使用SurfaceView播放视频发送弹幕,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。SurfaceView使用步骤使用SurfaceView的步骤:首先要继承SurfaceView,实现SurfaceHolder.Callback接口。重写方法:surfaceChanged:surface大小或格式发生变化时触发,在surfaceCreated调用后该函数至少会被调用一次。surfaceCreated:Surface创建时触发,一般在这个函数开启绘图线程(新的线程,不要再这个线程中绘制Surface)。surfaceDestroyed:销毁时触发,一般不可见时就会销毁。利用getHolder()获取SurfaceHolder对象,调用SurfaceHolder.addCallback添加回调SurfaceHolder.lockCanvas获取Canvas对象并锁定画布,调用Canvas绘图,SurfaceHolder.unlockCanvasAndPost结束锁定画布,提交改变。SurfaceHolderSurfaceHolder回调自己的三个生命周期:surfaceCreated(SurfaceHolderholder)创建时surfaceChanged(SurfaceHolderholder,intformat,intwidth,intheight)改变时surfaceDestroyed(SurfaceHolderholder)销毁时SurfaceView播放视频并可以发送弹幕需要准备两个SurfaceView,一个是负责播放视频,一个负责展示弹幕。弹幕是展示在视频上面的,所以我们要给展示弹幕的SurfaceView设置两个方法:surfaceView_danmu.setZOrderOnTop(true);——置于上方surfaceView_danmuHolder.setFormat(PixelFormat.TRANSPARENT);——背景透明public
class
MainActivity
extends
AppCompatActivity
implements
SurfaceHolder.Callback
{
public
static
final
int
PROGRESS
=
101;
SurfaceView
surfaceView,surfaceView_danmu;
SurfaceHolder
surfaceHolder,surfaceView_danmuHolder;
MediaPlayer
mediaPlayer
=
new
MediaPlayer();
String
path
=
"/sdcard/aa.mp4";
SeekBar
seekBar;
Timer
timer;
EditText
editText;
Button
button,bt_start,bt_stop;
int
x
=
0;
ArrayList<DanMu>
list
=
new
ArrayList<>();
Handler
handler
=
new
Handler(){
@Override
public
void
handleMessage(Message
msg)
{
super.handleMessage(msg);
if
(msg.what
==
PROGRESS){
seekBar.setProgress((Integer)
msg.obj);
mediaPlayer.setOnSeekCompleteListener(new
MediaPlayer.OnSeekCompleteListener()
{
@Override
public
void
onSeekComplete(MediaPlayer
mp)
{
Toast.makeText(MainActivity.this,
"播放完毕!",
Toast.LENGTH_SHORT).show();
}
});
}
}
};
@Override
protected
void
onCreate(Bundle
savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
surfaceView
=
findViewById(R.id.sufaceview);
surfaceView_danmu
=
findViewById(R.id.sufaceview_danmu);
editText
=
findViewById(R.id.et);
button
=
findViewById(R.id.bt_send);
seekBar
=
findViewById(R.id.bar);
bt_start
=
findViewById(R.id.bt_start);
bt_stop
=
findViewById(R.id.bt_stop);
surfaceHolder
=
surfaceView.getHolder();
surfaceHolder.addCallback(this);
surfaceView_danmuHolder
=
surfaceView_danmu.getHolder();
surfaceView_danmuHolder.addCallback(this);
surfaceView_danmu.setZOrderOnTop(true);
surfaceView_danmuHolder.setFormat(PixelFormat.TRANSPARENT);
if
(mediaPlayer!=null)
{
try
{
mediaPlayer.setDataSource(path);
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(new
MediaPlayer.OnPreparedListener()
{
@Override
public
void
onPrepared(MediaPlayer
mp)
{
mediaPlayer.start();
int
duration
=
mediaPlayer.getDuration();
seekBar.setMax(duration);
timer
=
new
Timer();
timer.schedule(new
TimerTask()
{
@Override
public
void
run()
{
int
currentPosition
=
mediaPlayer.getCurrentPosition();
Message
message
=
Message.obtain();
message.what
=
PROGRESS;
message.obj
=
currentPosition;
handler.sendMessage(message);
}
},0,1000);
}
});
seekBar.setOnSeekBarChangeListener(new
SeekBar.OnSeekBarChangeListener()
{
@Override
public
void
onProgressChanged(SeekBar
seekBar,
int
progress,
boolean
fromUser)
{
}
@Override
public
void
onStartTrackingTouch(SeekBar
seekBar)
{
}
@Override
public
void
onStopTrackingTouch(SeekBar
seekBar)
{
int
progress
=
seekBar.getProgress();
mediaPlayer.seekTo(progress);
}
});
}
catch
(IOException
e)
{
e.printStackTrace();
}
}
button.setOnClickListener(new
View.OnClickListener()
{
@Override
public
void
onClick(View
v)
{
String
s
=
editText.getText().toString();
int
y=
(int)
(Math.random()*300);
list.add(new
DanMu(0,y,s,Color.RED));
}
});
bt_start.setOnClickListener(new
View.OnClickListener()
{
@Override
public
void
onClick(View
v)
{
mediaPlayer.start();
}
});
bt_stop.setOnClickListener(new
View.OnClickListener()
{
@Override
public
void
onClick(View
v)
{
mediaPlayer.pause();
}
});
}
@Override
public
void
surfaceCreated(SurfaceHolder
holder)
{
if
(holder
==
surfaceHolder)
{
mediaPlayer.setDisplay(holder);
}else
if
(holder
==
surfaceView_danmuHolder)
{
new
MyDanMuThread().start();
}
}
@Override
public
void
surfaceChanged(SurfaceHolder
holder,
int
format,
int
width,
int
height)
{
}
@Override
public
void
surfaceDestroyed(SurfaceHolder
holder)
{
}
class
MyDanMuThread
extends
Thread
{
@Override
public
void
run()
{
super.run();
Paint
paint
=
new
Paint();
paint.setColor(Color.RED);
paint.setTextSize(40);
while
(true)
{
try
{
Thread.sleep(200);
}
catch
(InterruptedException
e)
{
e.printStackTrace();
}
Canvas
canvas
=
surfaceView_danmuHolder.lockCanvas();
canvas.drawColor(Color.TRANSPARENT,
PorterDuff.Mode.CLEAR);
for
(int
i=0;i<list.size();i++)
{
DanMu
danMu
=
list.get(i);
x
=
danMu.getX();
danMu.setX(x+=10);
canvas.drawText(danMu.getText(),danMu.getX(),danMu.getY(),paint);
}
surfaceView_danmuHolder.unlockCanvasAndPost(canvas);
}
}
}
}实现滚动歌词要准备一个装有时间和歌词的集合,准备一个Timer计时器和一个该展示第几个歌词。每隔一秒去拿该歌词的下一个歌词时间与进度匹配,如果进度>=该时间,那么就画该歌词在SurfaceView上;<则不画该歌词一定要写SD卡读写权限!!!!!public
class
MainActivity
extends
AppCompatActivity
implements
SurfaceHolder.Callback{
SurfaceView
surfaceView;
SurfaceHolder
surfaceHolder;
MediaPlayer
mediaPlayer
=
new
MediaPlayer();
ArrayList<Music>
list=new
ArrayList<>();
Timer
timer;
int
count
=
0;
@Override
protected
void
onCreate(Bundle
savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
surfaceView
=
findViewById(R.id.sv);
surfaceHolder=surfaceView.getHolder();
surfaceHolder.addCallback(this);
timer
=
new
Timer();
timer.schedule(new
TimerTask()
{
@Override
public
void
run()
{
int
currentPosition
=
mediaPlayer.getCurrentPosition();
if(list.size()>0){
if(currentPosition>=list.get(count+1).getTime()){
count++;
}
}
}
},0,500);
try
{
mediaPlayer.setDataSource("/sdcard/凤凰传奇
-
最炫民族风(Live).mp3");
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(new
MediaPlayer.OnPreparedListener()
{
@Override
public
void
onPrepared(MediaPlayer
mp)
{
mediaPlayer.start();
}
});
}
catch
(IOException
e)
{
e.printStackTrace();
}
try
{
StringBuffer
stringBuffer
=
new
StringBuffer();
FileInputStream
fileInputStream
=
new
FileInputStream("/sdcard/最炫民族风");
byte[]
bytes
=
new
byte[1024];
int
len
=
0;
while
((len=fileInputStream.read(bytes))!=-1)
{
stringBuffer.append(new
String(bytes,0,len));
}
Gson
gson
=
new
Gson();
JavaBean
javaBean
=
gson.fromJson(stringBuffer.toString(),
JavaBean.class);
JavaBean.LrcBean
lrc
=
javaBean.getLrc();
String
lyric
=
lrc.getLyric();
String[]
split
=
lyric.split("\n");
for(int
i=0;i<split.length;i++){
String
trim
=
split[i].trim();
String[]
split1
=
trim.split("]");
if(split.length>=2){
String
s
=
split1[0];
String
substring1
=
s.substring(1,
3);
String
substring2
=
s.substring(4,
6);
String
substring3
=
s.substring(7,
10);
long
start
=
Integer.parseInt(substring1)*60*1000+Integer.parseInt(substring2)*1000+Integer.parseInt(substring3);
String
text
=
split1[1];
list.add(new
Music(text,start));
}
}
}
catch
(FileNotFoundException
e)
{
e.printStackTrace();
}
catch
(IOException
e)
{
e.printStackTrace();
}
}
@Override
publ
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- Unit 8 Summer holiday is coming!Lesson 47 公开课教学课件【七年级英语下册(冀教版)】
- (新人教版)高中英语必修第三册全册分单元教材解读(共5个单元)
- 市政改善城市供电设施
- 市政风景名胜区保护修缮
- 2024年特种作业考试-焊接与热切割作业笔试参考题库含答案
- 2024年火电电力职业技能鉴定考试-电力生产“1000个为什么”笔试参考题库含答案
- 2024年中国奥马珠单抗注射液行业研究报告
- 2024年浙江住院医师-浙江住院医师麻醉科笔试参考题库含答案
- 2024年法律知识法治建设知识竞赛-价格法知识竞赛笔试参考题库含答案
- 2024-2030全球与中国石油管道涂料市场现状及未来发展趋势
- 水利水电可持续发展
- pur热熔胶生产工艺
- 山西英雄的红色事迹
- 美国猪行业利润分析
- 2024年全国高中生物联赛竞赛试题和答案
- 药学三基考试试卷题库含答案
- erp系统采购合同
- 医院医疗机构医疗风险管理工作方案(完整版)
- 工程项目标书-技术响应文件-工程项目实施方案
- 医疗器械经营基础知识培训合规指南
- 企业中层管理者法律法规知识培训
评论
0/150
提交评论