溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何使用SurfaceView實(shí)現(xiàn)視頻彈幕

發(fā)布時間:2021-09-23 15:17:22 來源:億速云 閱讀:109 作者:小新 欄目:編程語言

這篇文章主要為大家展示了“如何使用SurfaceView實(shí)現(xiàn)視頻彈幕”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“如何使用SurfaceView實(shí)現(xiàn)視頻彈幕”這篇文章吧。

全部代碼如下:

package com.example.app2;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.PixelFormat;import android.graphics.PorterDuff;import android.media.MediaPlayer;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.text.TextUtils;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.View;import android.widget.EditText;import android.widget.Toast;import java.io.IOException;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback {  private SurfaceView mSvVideo;  private SurfaceView mSvDanMu;  private EditText mEd;  private MediaPlayer mediaPlayer;  private SurfaceHolder svVideoHolder, svDanMuHolder;  private boolean isPlay = true;  List<DanMuBean> list = new ArrayList<>();  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    // 創(chuàng)建MediaPlayer    initPlayer();    // 初始化視圖    initView();  }  private void initPlayer() {    if (mediaPlayer == null) {      mediaPlayer = new MediaPlayer();    }    // 重置    mediaPlayer.reset();    try {      mediaPlayer.setDataSource("http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4");      mediaPlayer.prepareAsync(); //異步準(zhǔn)備      mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {        @Override        public void onPrepared(MediaPlayer mp) {          mediaPlayer.setLooping(true); //是否開啟循環(huán)播放          mediaPlayer.start(); //開始播放        }      });    } catch (IOException e) {      e.printStackTrace();    }  }  /**   * 發(fā)送的信息   *   * @param view   */  public void send(View view) {    submit();  }  private void submit() {    // validate 非空判斷    String edString = mEd.getText().toString().trim();    if (TextUtils.isEmpty(edString)) {      Toast.makeText(this, "edString不能為空", Toast.LENGTH_SHORT).show();      return;    }    list.add(new DanMuBean(edString)); //添加數(shù)據(jù)    mEd.setText(""); //清空  }  private void initView() {    mSvVideo = (SurfaceView) findViewById(R.id.sv_video);    mSvDanMu = (SurfaceView) findViewById(R.id.sv_danMu);    mEd = (EditText) findViewById(R.id.ed);    // 初始化 svDanMuHolder svVideoHolder    svVideoHolder = mSvVideo.getHolder();    svDanMuHolder = mSvDanMu.getHolder();    // 添加監(jiān)聽    svVideoHolder.addCallback(this);    svDanMuHolder.addCallback(this);    // 將彈幕顯示在最上層, 并設(shè)置為透明    mSvDanMu.setZOrderOnTop(true);    svDanMuHolder.setFormat(PixelFormat.TRANSPARENT); //PixelFormat: 像素格式, TRANSPARENT(2):透明的; TRANSLUCENT(-3):半透明  }  /**   * surfaceCreated:創(chuàng)建   *   * @param holder   */  @Override  public void surfaceCreated(SurfaceHolder holder) {    if (holder == svVideoHolder) {      mediaPlayer.setDisplay(svVideoHolder); //將內(nèi)容顯示在 svVideoHolder上    } else if (holder == svDanMuHolder) {      // 彈幕設(shè)置 開啟線程      new Thread(new Runnable() {        @Override        public void run() {          while (isPlay) { //死循環(huán)            // 得到畫筆, 設(shè)置屬性            Paint paint = new Paint();            paint.setStrokeWidth(5); //設(shè)置筆畫寬度            paint.setTextSize(30); //設(shè)置字體大小            paint.setColor(Color.GREEN); // 設(shè)置顏色            // 得到畫布 通過lockCanvas            Canvas canvas = svDanMuHolder.lockCanvas();            if (canvas == null) {              break;            }            // 填充畫布的顏色            canvas.drawColor(PixelFormat.TRANSPARENT, PorterDuff.Mode.CLEAR); //參數(shù)1: 設(shè)為透明, 參2: PorterDuff.Mode.CLEAR: 所繪制不會提交到畫布上            // 設(shè)置彈幕內(nèi)容            for (int i = 0; i < list.size(); i++) {              String text = list.get(i).text;              canvas.drawText(text, list.get(i).x += 1, list.get(i).y, paint);              if (list.get(i).x > mSvVideo.getWidth()) {                list.get(i).x = 0;              }            }            // 提交            svDanMuHolder.unlockCanvasAndPost(canvas);          }        }      }).start();    }  }  @Override  public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {  }  @Override  public void surfaceDestroyed(SurfaceHolder holder) {    isPlay = false;  }}

布局xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  xmlns:tools="http://schemas.android.com/tools"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:orientation="vertical"  tools:context=".MainActivity">  <FrameLayout    android:layout_width="match_parent"    android:layout_height="wrap_content">    <SurfaceView      android:id="@+id/sv_video"      android:layout_width="match_parent"      android:layout_height="280dp" />    <SurfaceView      android:id="@+id/sv_danMu"      android:layout_width="match_parent"      android:layout_height="280dp" />  </FrameLayout>  <LinearLayout    android:layout_width="match_parent"    android:layout_height="wrap_content">    <EditText      android:id="@+id/ed"      android:layout_width="0dp"      android:layout_height="wrap_content"      android:layout_weight="1" />    <Button      android:layout_width="wrap_content"      android:layout_height="wrap_content"      android:onClick="send"      android:text="彈幕" />  </LinearLayout></LinearLayout>

以上是“如何使用SurfaceView實(shí)現(xiàn)視頻彈幕”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI