版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Android仿網(wǎng)絡(luò)直播彈幕功能的實(shí)現(xiàn)現(xiàn)在網(wǎng)絡(luò)直播越來(lái)越火,網(wǎng)絡(luò)主播也逐漸成為一種新興職業(yè),對(duì)于網(wǎng)絡(luò)直播,彈幕功能是必須要有的,如下圖:首先來(lái)分析一下,這個(gè)彈幕功能是怎么實(shí)現(xiàn)的,首先在最下面肯定是一個(gè)游戲界面View,然后游戲界面上有彈幕View,彈幕的View必須要做成完全透明的,這樣即使覆蓋在游戲界面的上方也不會(huì)影響到游戲的正常觀看,只有當(dāng)有人發(fā)彈幕消息時(shí),再將消息繪制到彈幕的View上面就可以了,下方肯定還有有操作界面View,可以讓用戶來(lái)發(fā)彈幕和送禮物的功能,原理示意圖如下所示:參照原理圖,下面一步一步來(lái)實(shí)現(xiàn)這個(gè)功能。實(shí)現(xiàn)視頻的播放activity_main.xml[html]viewplaincopy在CODE上查看代碼片派生到我的代碼片<RelativeLayoutxmlns:android="/apk/res/android"android:id="@+id/activity_main"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#000"><VideoViewandroid:id="@+id/video_view"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_centerInParent="true"/></RelativeLayout>MainActivity.java[java]viewplaincopy在CODE上查看代碼片派生到我的代碼片packagecom.jackie.bombscreen;importandroid.os.Build;importandroid.os.Bundle;importandroid.os.Environment;importandroid.support.v7.app.AppCompatActivity;importandroid.view.View;importandroid.widget.VideoView;publicclassMainActivityextendsAppCompatActivity{@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);VideoViewvideoView=(VideoView)findViewById(R.id.video_view);videoView.setVideoPath(Environment.getExternalStorageDirectory()+"/xiaoxingyun.mp4");videoView.start();}@OverridepublicvoidonWindowFocusChanged(booleanhasFocus){super.onWindowFocusChanged(hasFocus);if(hasFocus&&Build.VERSION.SDK_INT>=19){ViewdecorView=getWindow().getDecorView();decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE|View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION|View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_HIDE_NAVIGATION|View.SYSTEM_UI_FLAG_FULLSCREEN|View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);}}}最后別忘了設(shè)置AndroidMainfest.xml實(shí)現(xiàn)彈幕的效果接下來(lái)我們開(kāi)始實(shí)現(xiàn)彈幕效果。彈幕其實(shí)也就是一個(gè)自定義的View,它的上面可以顯示類似于跑馬燈的文字效果。觀眾們發(fā)表的評(píng)論都會(huì)在彈幕上顯示出來(lái),但又會(huì)很快地移出屏幕,既可以起到互動(dòng)的作用,同時(shí)又不會(huì)影響視頻的正常觀看。我們可以自己來(lái)編寫(xiě)這樣的一個(gè)自定義View,當(dāng)然也可以直接使用網(wǎng)上現(xiàn)成的開(kāi)源項(xiàng)目。那么為了能夠簡(jiǎn)單快速地實(shí)現(xiàn)彈幕效果,這里我就準(zhǔn)備直接使用由嗶哩嗶哩開(kāi)源的彈幕效果庫(kù)DanmakuFlameMaster。DanmakuFlameMaster庫(kù)的項(xiàng)目主頁(yè)地址是:添加build.gradle依賴compile'com.github.ctiao:DanmakuFlameMaster:0.5.3'[html]viewplaincopy在CODE上查看代碼片派生到我的代碼片<?xmlversion="1.0"encoding="utf-8"?><RelativeLayoutxmlns:android="/apk/res/android"android:id="@+id/activity_main"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#000"><VideoViewandroid:id="@+id/video_view"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_centerInParent="true"/><master.flame.danmaku.ui.widget.DanmakuViewandroid:id="@+id/danmaku_view"android:layout_width="match_parent"android:layout_height="match_parent"/></RelativeLayout>修改MainActivity.java[java]viewplaincopy在CODE上查看代碼片派生到我的代碼片packagecom.jackie.bombscreen;importandroid.graphics.Color;importandroid.os.Build;importandroid.os.Bundle;importandroid.os.Environment;importandroid.support.v7.app.AppCompatActivity;importandroid.view.View;importandroid.widget.VideoView;importjava.util.Random;importmaster.flame.danmaku.controller.DrawHandler;importmaster.flame.danmaku.danmaku.model.BaseDanmaku;importmaster.flame.danmaku.danmaku.model.DanmakuTimer;importmaster.flame.danmaku.danmaku.model.IDanmakus;importmaster.flame.danmaku.danmaku.model.android.DanmakuContext;importmaster.flame.danmaku.danmaku.model.android.Danmakus;importmaster.flame.danmaku.danmaku.parser.BaseDanmakuParser;importmaster.flame.danmaku.ui.widget.DanmakuView;publicclassMainActivityextendsAppCompatActivity{privatebooleanmIsShowDanmaku;privateDanmakuViewmDanmakuView;privateDanmakuContextmDanmakuContext;privateBaseDanmakuParserparser=newBaseDanmakuParser(){@OverrideprotectedIDanmakusparse(){returnnewDanmakus();}};@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);VideoViewvideoView=(VideoView)findViewById(R.id.video_view);videoView.setVideoPath(Environment.getExternalStorageDirectory()+"/xiaoxingyun.mp4");videoView.start();mDanmakuView=(DanmakuView)findViewById(R.id.danmaku_view);mDanmakuView.enableDanmakuDrawingCache(true);mDanmakuView.setCallback(newDrawHandler.Callback(){@Overridepublicvoidprepared(){mIsShowDanmaku=true;mDanmakuView.start();generateSomeDanmaku();}@OverridepublicvoidupdateTimer(DanmakuTimertimer){}@OverridepublicvoiddanmakuShown(BaseDanmakudanmaku){}@OverridepublicvoiddrawingFinished(){}});mDanmakuContext=DanmakuContext.create();mDanmakuView.prepare(parser,mDanmakuContext);}/***向彈幕View中添加一條彈幕*@paramcontent彈幕的具體內(nèi)容*@paramwithBorder彈幕是否有邊框*/privatevoidaddDanmaku(Stringcontent,booleanwithBorder){BaseDanmakudanmaku=mDanmakuContext.mDanmakuFactory.createDanmaku(BaseDanmaku.TYPE_SCROLL_RL);danmaku.text=content;danmaku.padding=5;danmaku.textSize=sp2px(20);danmaku.textColor=Color.WHITE;danmaku.setTime(mDanmakuView.getCurrentTime());if(withBorder){danmaku.borderColor=Color.GREEN;}mDanmakuView.addDanmaku(danmaku);}/***隨機(jī)生成一些彈幕內(nèi)容以供測(cè)試*/privatevoidgenerateSomeDanmaku(){newThread(newRunnable(){@Overridepublicvoidrun(){while(mIsShowDanmaku){inttime=newRandom().nextInt(300);Stringcontent=""+time+time;addDanmaku(content,false);try{Thread.sleep(time);}catch(InterruptedExceptione){e.printStackTrace();}}}}).start();}/***sp轉(zhuǎn)px的方法。*/publicintsp2px(floatspValue){finalfloatfontScale=getResources().getDisplayMetrics().scaledDensity;return(int)(spValue*fontScale+0.5f);}@OverrideprotectedvoidonPause(){super.onPause();if(mDanmakuView!=null&&mDanmakuView.isPrepared()){mDanmakuView.pause();}}@OverrideprotectedvoidonResume(){super.onResume();if(mDanmakuView!=null&&mDanmakuView.isPrepared()&&mDanmakuView.isPaused()){mDanmakuView.resume();}}@OverrideprotectedvoidonDestroy(){super.onDestroy();mIsShowDanmaku=false;if(mDanmakuView!=null){mDanmakuView.release();mDanmakuView=null;}}@OverridepublicvoidonWindowFocusChanged(booleanhasFocus){super.onWindowFocusChanged(hasFocus);if(hasFocus&&Build.VERSION.SDK_INT>=19){ViewdecorView=getWindow().getDecorView();decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE|View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION|View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_HIDE_NAVIGATION|View.SYSTEM_UI_FLAG_FULLSCREEN|View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);}}}效果圖如下:加入操作界面[html]viewplaincopy在CODE上查看代碼片派生到我的代碼片<?xmlversion="1.0"encoding="utf-8"?><RelativeLayoutxmlns:android="/apk/res/android"android:id="@+id/activity_main"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#000"><VideoViewandroid:id="@+id/video_view"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_centerInParent="true"/><master.flame.danmaku.ui.widget.DanmakuViewandroid:id="@+id/danmaku_view"android:layout_width="match_parent"android:layout_height="match_parent"/><LinearLayoutandroid:id="@+id/operation_layout"android:layout_width="match_parent"android:layout_height="50dp"android:layout_alignParentBottom="true"android:background="#fff"android:visibility="gone"><EditTextandroid:id="@+id/edit_text"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"/><Buttonandroid:id="@+id/send"android:layout_width="wrap_content"android:layout_height="match_parent"android:text="Send"/></LinearLayout></RelativeLayout>[java]viewplaincopy在CODE上查看代碼片派生到我的代碼片packagecom.jackie.bombscreen;importandroid.graphics.Color;importandroid.os.Build;importandroid.os.Bundle;importandroid.os.Environment;importandroid.support.v7.app.AppCompatActivity;importandroid.text.TextUtils;importandroid.view.View;importandroid.widget.Button;importandroid.widget.EditText;importandroid.widget.LinearLayout;importandroid.widget.VideoView;importjava.util.Random;importmaster.flame.danmaku.controller.DrawHandler;importmaster.flame.danmaku.danmaku.model.BaseDanmaku;importmaster.flame.danmaku.danmaku.model.DanmakuTimer;importmaster.flame.danmaku.danmaku.model.IDanmakus;importmaster.flame.danmaku.danmaku.model.android.DanmakuContext;importmaster.flame.danmaku.danmaku.model.android.Danmakus;importmaster.flame.danmaku.danmaku.parser.BaseDanmakuParser;importmaster.flame.danmaku.ui.widget.DanmakuView;publicclassMainActivityextendsAppCompatActivity{privatebooleanmIsShowDanmaku;privateDanmakuViewmDanmakuView;privateDanmakuContextmDanmakuContext;privateBaseDanmakuParserparser=newBaseDanmakuParser(){@OverrideprotectedIDanmakusparse(){returnnewDanmakus();}};@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);VideoViewvideoView=(VideoView)findViewById(R.id.video_view);videoView.setVideoPath(Environment.getExternalStorageDirectory()+"/xiaoxingyun.mp4");videoView.start();mDanmakuView=(DanmakuView)findViewById(R.id.danmaku_view);mDanmakuView.enableDanmakuDrawingCache(true);mDanmakuView.setCallback(newDrawHandler.Callback(){@Overridepublicvoidprepared(){mIsShowDanmaku=true;mDanmakuView.start();generateSomeDanmaku();}@OverridepublicvoidupdateTimer(DanmakuTimertimer){}@OverridepublicvoiddanmakuShown(BaseDanmakudanmaku){}@OverridepublicvoiddrawingFinished(){}});mDanmakuContext=DanmakuContext.create();mDanmakuView.prepare(parser,mDanmakuContext);finalLinearLayoutoperationLayout=(LinearLayout)findViewById(R.id.operation_layout);finalButtonsend=(Button)findViewById(R.id.send);finalEditTexteditText=(EditText)findViewById(R.id.edit_text);mDanmakuView.setOnClickListener(newView.OnClickListener(){@OidepublicvoidonClick(Viewview){if(operationLayout.getVisibility()==View.GONE){operationLayout.setVisibility(View.VISIBLE);}else{operationLayout.setVisibility(View.GONE);}}});send.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewview){Stringcontent=editText.getText().toString();if(!TextUtils.isEmpty(content)){addDanmaku(content,true);editText.setText("");}}});getWindow().getDecorView().setOnSystemUiVisibilityChangeListener(newView.OnSystemUiVisibilityChangeListener(){@OverridepublicvoidonSystemUiVisibilityChange(intvisibility){if(visibility==View.SYSTEM_UI_FLAG_VISIBLE){onWindowFocusChanged(true);}}});}/***向彈幕View中添加一條彈幕*@paramcontent彈幕的具體內(nèi)容*@paramwithBorder彈幕是否有邊框*/privatevoidaddDanmaku(Stringcontent,booleanwithBorder){BaseDanmakudanmaku=mDanmakuContext.mDanmakuFactory.createDanmaku(BaseDanmaku.TYPE_SCROLL_RL);danmaku.text=content;danmaku.padding=5;danmaku.textSize=sp2px(20);danmaku.textColor=Color.WHITE;danmaku.setTime(mDanmakuView.getCurrentTime());if(withBorder){danmaku.borderColor=Color.GREEN;}mDanmakuView.addDanmaku(danmaku);}/***隨機(jī)生成一些彈幕內(nèi)容以供測(cè)試*/privatevoidgenerateSomeDanmaku(){newThread(newRunnable(){@Overridepublicvoidrun(){while(mIsShowDanmaku){inttime=newRandom().nextInt(300);Stringcontent=""+time+time;addDanmaku(content,false);try{Thread.sleep(time);}catch(InterruptedExceptione){e.printStackTrace();}}}}).start();}/***s
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 初中地生會(huì)考試卷及答案
- 叉車考試實(shí)操試題及答案
- 護(hù)士衛(wèi)生招聘試題及答案
- 《東北草甸草原家畜混合放牧技術(shù)規(guī)程》征求意見(jiàn)稿
- 衛(wèi)生室藥房管理制度
- 回轉(zhuǎn)窯衛(wèi)生管理制度
- 品牌衛(wèi)生巾代理制度
- 外包工職業(yè)衛(wèi)生管理制度
- 水果店衛(wèi)生管理制度
- 物業(yè)公司衛(wèi)生間管理制度
- 單位升旗活動(dòng)方案
- 2025年中國(guó)蘿卜干市場(chǎng)調(diào)查研究報(bào)告
- 國(guó)家中醫(yī)藥管理局《中醫(yī)藥事業(yè)發(fā)展“十五五”規(guī)劃》全文
- 師德師風(fēng)個(gè)人總結(jié)課件
- 化學(xué)-江蘇省蘇州市2024-2025學(xué)年第一學(xué)期學(xué)業(yè)質(zhì)量陽(yáng)光指標(biāo)調(diào)研卷暨高二上學(xué)期期末考試試題和答案
- 精神科疑難病例討論
- 騰訊00后研究報(bào)告
- 固體廢物 鉛和鎘的測(cè)定 石墨爐原子吸收分光光度法(HJ 787-2016)
- DB45-T 2675-2023 木薯米粉加工技術(shù)規(guī)程
- 板材眼鏡生產(chǎn)工藝
- Unit 3 My weekend plan B Let's talk(教案)人教PEP版英語(yǔ)六年級(jí)上冊(cè)
評(píng)論
0/150
提交評(píng)論