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

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

站在用戶的角度思考問題,與客戶深入溝通,找到巴林左旗網(wǎng)站設(shè)計(jì)與巴林左旗網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名與空間、虛擬空間、企業(yè)郵箱。業(yè)務(wù)覆蓋巴林左旗地區(qū)。

全部代碼如下:

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)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

當(dāng)前名稱:如何使用SurfaceView實(shí)現(xiàn)視頻彈幕
標(biāo)題鏈接:http://bm7419.com/article6/jdipig.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、網(wǎng)站導(dǎo)航營銷型網(wǎng)站建設(shè)、做網(wǎng)站網(wǎng)站排名、品牌網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管