SurfaceView plays video sends barrage and scrolls lyrics
- 2021-11-14 06:58:08
- OfStack
In this paper, we share SurfaceView playing video and sending barrage, and realize rolling lyrics for your reference. The specific contents are as follows
SurfaceView Use Steps
To use SurfaceView:
First, we should inherit SurfaceView and implement SurfaceHolder. Callback interface. Override method: surfaceChanged: Triggered when the size or format of surface changes, this function will be called at least once after surfaceCreated is called. surfaceCreated: Triggered when Surface is created, 1 in this function opens the drawing thread (new thread, do not draw Surface in this thread). surfaceDestroyed: Triggered when destroyed, destroyed when invisible. Use getHolder () to get the SurfaceHolder object and call SurfaceHolder. addCallback to add a callback SurfaceHolder. lockCanvas gets the Canvas object and locks the canvas, calls Canvas drawing, SurfaceHolder. unlockCanvasAndPost ends locking the canvas and submits the change.SurfaceHolder
SurfaceHolder callbacks its own 3 lifecycles:
When surfaceCreated (SurfaceHolder holder) was created When surfaceChanged (SurfaceHolder holder, int format, int width, int height) changes When surfaceDestroyed (SurfaceHolder holder) is destroyedSurfaceView plays video and can send barrage
Two SurfaceView need to be prepared, one is responsible for playing video and the other is responsible for displaying barrage. The barrage is displayed on the video, so we have to set two methods for SurfaceView showing the barrage:
surfaceView_danmu. setZOrderOnTop (true); -Placed above
surfaceView_danmuHolder. setFormat (PixelFormat. TRANSPARENT); -Transparent background
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, " Play out! ", 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);
}
}
}
}
Realize scrolling lyrics
To prepare a collection with time and lyrics, prepare an Timer timer and a lyrics to show. Get the next lyric of the lyric every 1 second. The time matches the progress. If the progress > = at that time, then draw the lyrics on SurfaceView; < Do not draw the lyrics
1 must write SD card read and write authority! ! ! ! !
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/ Phoenix Legend - The most dazzling national style (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/ The most dazzling national style ");
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
public void surfaceCreated(SurfaceHolder holder) {
new MyThread().start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
class MyThread extends Thread {
@Override
public void run() {
super.run();
Paint paint = new Paint();
paint.setColor(Color.RED);
paint.setTextSize(50);
while (true){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
Canvas canvas = surfaceHolder.lockCanvas();
if(canvas==null){
break;
}
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
if(list.size()>0){
canvas.drawText(list.get(count).getTitle(),100,100,paint);
}
surfaceHolder.unlockCanvasAndPost(canvas);
}
}
}
}