新聞中心
Android中怎么利用SurfaceView實(shí)現(xiàn)彈幕效果,相信很多沒有經(jīng)驗(yàn)的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供壽縣網(wǎng)站建設(shè)、壽縣做網(wǎng)站、壽縣網(wǎng)站設(shè)計(jì)、壽縣網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、壽縣企業(yè)網(wǎng)站模板建站服務(wù),10余年壽縣做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
頁面布局
首先是XML的layout布局,這里的總的父布局是一個(gè)FrameLayout用于貼上兩個(gè)SurfaceView,一個(gè)用來播放視頻,一個(gè)用來顯示彈幕
對象類
創(chuàng)建一個(gè)對象類來存放你所發(fā)送的彈幕
public class Danmu { String text;//彈幕內(nèi)容 int x;//x軸 int y;//y軸 public Danmu(String text){ this.text = text; //將y設(shè)置為隨機(jī),彈幕出現(xiàn)的位置也為隨機(jī) this.y = (int) (Math.random()*400); this.x = 0; }}
Activity實(shí)現(xiàn)SurfaceHolder.Callback并重寫其方法
先定義需要的東西,播放視頻我們用Mediaplayer
//視頻播放private MediaPlayer mediaPlayer;//彈幕Surface與視頻Surfaceprivate SurfaceView sv_text, sv_media;//兩個(gè)Surface對應(yīng)的兩個(gè)holderprivate SurfaceHolder text_holder, media_holder;EditText editText;//字幕輸入框List
初始化MediaPlayer,要在第一步執(zhí)行否則運(yùn)行會報(bào)空,這里封裝成了一個(gè)方法,直接在onCreate內(nèi)調(diào)用
private void initPlayer() throws IOException { //先判斷是否創(chuàng)建過,沒創(chuàng)建就創(chuàng)建出來 if (mediaPlayer == null) { mediaPlayer = new MediaPlayer(); } mediaPlayer.reset();//使其恢復(fù)空閑狀態(tài) //播放的資源 mediaPlayer.setDataSource("http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4"); mediaPlayer.prepare();//準(zhǔn)備 mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) {//準(zhǔn)備完畢了 mediaPlayer.start();//播放 } }); }
初始化控件,同樣封裝為方法,holder用對應(yīng)的Surface獲取到
private void initView() { sv_text = findViewById(R.id.sv_text); text_holder = sv_text.getHolder(); text_holder.addCallback(this); sv_media = findViewById(R.id.sv_media); media_holder = sv_media.getHolder(); media_holder.addCallback(this); editText = findViewById(R.id.et_text); //設(shè)置透明,將播放彈幕的Surface放到第一位并設(shè)置為背景透明 sv_text.setZOrderOnTop(true); text_holder.setFormat(PixelFormat.TRANSPARENT); }
接下來是Surface.Callback重寫的方法
@Override public void surfaceCreated(SurfaceHolder holder) { //判斷當(dāng)前holder是否是media的那個(gè) if (holder == media_holder) { //設(shè)置要顯示的Surfaceholder mediaPlayer.setDisplay(media_holder); //判斷當(dāng)前holder是否是字幕的那個(gè) } else if (holder == text_holder) { //創(chuàng)建線程執(zhí)行耗時(shí)操作 new Thread() { @Override public void run() { super.run(); //死循環(huán)用來一直更新彈幕的位置 while (true) { try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } Paint paint = new Paint();//創(chuàng)建畫筆 paint.setStrokeWidth(5);//畫筆粗細(xì) paint.setColor(Color.GREEN);//畫筆顏色 paint.setTextSize(30);//設(shè)置文字大小 //創(chuàng)建畫板 Canvas canvas = text_holder.lockCanvas(); //判斷若畫板為空則跳出循環(huán) if (canvas == null) { break; } //設(shè)置畫布顏色,透明 canvas.drawColor(PixelFormat.TRANSPARENT, PorterDuff.Mode.CLEAR); //用循環(huán)來你的彈幕集合并且在畫板上展示出來 //x+=20為你的彈幕在不斷的從左到右移動 for (Danmu danmu : list) { canvas.drawText(danmu.text, danmu.x += 20, danmu.y, paint); //若移動的位置大于視頻Surface的寬度了就歸0 if (danmu.x > sv_media.getWidth()) { danmu.x = 0; } } //將畫布解鎖并顯示到屏幕上 text_holder.unlockCanvasAndPost(canvas); } } }.start();//不要忘記開啟線程 } }
發(fā)送的按鈕的點(diǎn)擊事件
public void Gogo(View view) {//先判斷輸入框里有沒有東西 if (!editText.getText().toString().isEmpty() && !editText.getText().toString().equals("")) { Danmu danmu = new Danmu(editText.getText().toString()); list.add(danmu); } }
看完上述內(nèi)容,你們掌握Android中怎么利用SurfaceView實(shí)現(xiàn)彈幕效果的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
文章題目:Android中怎么利用SurfaceView實(shí)現(xiàn)彈幕效果
當(dāng)前鏈接:http://fisionsoft.com.cn/article/gjsiod.html