怎么在Android中利用双重SurfaceView实现弹幕效果

  介绍

这期内容当中小编将会给大家带来有关怎么在Android中利用双重SurfaceView实现弹幕效果,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

<强>页面布局

首先是XML的布局布的局,这里的总的父布局是一个FrameLayout用于贴上两个SurfaceView,一个用来播放视频,一个用来显示弹幕

& lt; ? xml  version=?.0“,编码=皍tf-8" ?比;   & lt; FrameLayout  xmlns: android=癶ttp://schemas.android.com/apk/res/android"   xmlns:才能应用=癶ttp://schemas.android.com/apk/res-auto"   xmlns:才能工具=癶ttp://schemas.android.com/tools"   android:才能layout_width=癿atch_parent"   android:才能layout_height=癿atch_parent"   android:才能取向=皏ertical"   工具:才能上下文=?DanmuActivity"祝辞      & lt; SurfaceView才能   ,,,android: id=癅 + id/sv_text"   ,,,android: layout_width=癿atch_parent"   ,,,android: layout_height=?00 dp"/比;      & lt; SurfaceView才能   ,,,android: id=癅 + id/sv_media"   ,,,android: layout_width=癿atch_parent"   ,,,android: layout_height=?00 dp"/比;   ,,,/比;         EditText & lt;才能   ,,,android: id=癅 + id/et_text"   ,,,android: layout_width=?00 dp"   ,,,android: layout_height=皐rap_content"   ,,,android: layout_marginTop=?50 dp"/比;      & lt;才能按钮   ,,,android: layout_width=皐rap_content"   ,,,android: layout_height=皐rap_content"   ,,,android:文本=胺⑺汀?   ,,,android: layout_marginTop=?00 dp"   ,,,android: onClick=癎ogo"/比;   & lt;/FrameLayout>

<强>对象类

创建一个对象类来存放你所发送的弹幕

public  class  Danmu  {      String 才能;文本;//弹幕内容   int 才能;x;//x轴   int 才能;y;//y轴      public 才能Danmu (String 文本){   ,,,this.text =,文本;   ,,,//将y设置为随机,弹幕出现的位置也为随机   ,,,this.y =, (int), (math . random () * 400);   ,,,this.x =, 0;   ,,}   }

<>强活动实现SurfaceHolder。回调并重写其方法

先定义需要的东西,播放视频我们用媒体播放器

//视频播放   private  MediaPlayer 媒体播放器;//弹幕表面与视频表面   private  SurfaceView  sv_text, sv_media;//两个表面对应的两个座   private  SurfaceHolder  text_holder, media_holder;   editText EditText ;//字幕输入框   List

初始化媒体播放器,要在第一步执行否则运行会报空,这里封装成了一个方法,直接在onCreate内调用

private  void  initPlayer (), throws  IOException  {   ,//先判断是否创建过,没创建就创建出来   ,,,if  (mediaPlayer ==, null), {   ,,,,,mediaPlayer =, new 媒体播放器();   ,,,}   ,,,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 议员),{//准备完毕了   ,,,,,,,mediaPlayer.start();//播放   ,,,,,}   ,,,});   以前,,}

初始化控件,同样封装为方法,夹用对应的表面获取到

private  void  initView (), {      ,,,sv_text =, findViewById (R.id.sv_text);   ,,,text_holder =, sv_text.getHolder ();   ,,,text_holder.addCallback(这个);      ,,,sv_media =, findViewById (R.id.sv_media);   ,,,media_holder =, sv_media.getHolder ();   ,,,media_holder.addCallback(这个);      ,,,editText =, findViewById (R.id.et_text);      ,,,//设置透明,将播放弹幕的表面放到第一位并设置为背景透明   ,,,sv_text.setZOrderOnTop(真正的);   ,,,text_holder.setFormat (PixelFormat.TRANSPARENT);   以前,,}

接下来是表面。回调重写的方法

@Override   public 才能;void  surfaceCreated (SurfaceHolder 持有人),{//才能判断当前座是否是媒体的那个   ,,,if  (holder ==, media_holder), {   ,,,//设置要显示的Surfaceholder   ,,,,,mediaPlayer.setDisplay (media_holder);   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

怎么在Android中利用双重SurfaceView实现弹幕效果