【移动应用开发技术】怎么使用SurfaceView播放视频发送弹幕_第1页
【移动应用开发技术】怎么使用SurfaceView播放视频发送弹幕_第2页
【移动应用开发技术】怎么使用SurfaceView播放视频发送弹幕_第3页
【移动应用开发技术】怎么使用SurfaceView播放视频发送弹幕_第4页
【移动应用开发技术】怎么使用SurfaceView播放视频发送弹幕_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】怎么使用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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论