MediaPlayer壤蚜、SurfaceView

聲明:此文非本人原創(chuàng),為整理網(wǎng)絡資料加自己的一些注解所得徊哑。

surface相當于畫板袜刷,所有的圖像(view及其子類)都是要畫在surface上的。每個surface會創(chuàng)建一個Canvas對象(其屬性是會時常變的)--一個用來管理view在surface上繪圖的操作莺丑。換句通俗的話講著蟹,surface是畫板,Canvas相當與話的動作梢莽,Paint相當于畫筆萧豆。因而Canvas中包含了很多畫的動作,比如話矩形昏名,畫圓等等涮雷。
SurfaceView是視圖(View)的繼承類,這個視圖里內(nèi)嵌了一個專門用于繪制的Surface葡粒。你可以控制這個Surface的格式和尺寸份殿。Surfaceview控制這個Surface的繪制位置。surface是縱深排序(Z-ordered)的嗽交,這表明它總在自己所在窗口的后面卿嘲。surface的排版顯示受到視圖層級關(guān)系的影響, surface的內(nèi)容會被它的兄弟視圖遮擋夫壁,這一特性可以用來放置遮蓋物(overlays)(例如拾枣,文本和按鈕等控件)『腥茫可以在主線程之外的線程中向屏幕繪圖梅肤。這樣可以避免畫圖任務繁重的時候造成主線程阻塞,從而提高了程序的反應速度邑茄。在游戲開發(fā)中多用到SurfaceView姨蝴,游戲中的背景、人物肺缕、動畫等等盡量在畫布canvas中畫出左医。
可以通過SurfaceHolder接口訪問這個surface授帕,getHolder()方法可以得到這個接口。 surfaceview變得可見時浮梢,surface被創(chuàng)建跛十;surfaceview隱藏前,surface被銷毀秕硝。這樣能節(jié)省資源芥映。如果你要查看 surface被創(chuàng)建和銷毀的時機,可以重載surfaceCreated(SurfaceHolder)和 surfaceDestroyed(SurfaceHolder)远豺。
surfaceview的核心在于提供了兩個線程:UI線程和渲染線程奈偏。這里應注意:
1> 所有SurfaceView和SurfaceHolder.Callback的方法都應該在UI線程里調(diào)用,一般來說就是應用程序主線程憋飞。渲染線程所要訪問的各種變量應該作同步處理霎苗。
2> 由于surface可能被銷毀,它只在SurfaceHolder.Callback.surfaceCreated()和 SurfaceHolder.Callback.surfaceDestroyed()之間有效榛做,所以要確保渲染線程訪問的是合法有效的surface唁盏。
實現(xiàn):
繼承SurfaceView并實現(xiàn)SurfaceHolder.Callback接口,重寫:
1.surfaceChanged //在surface的大小發(fā)生改變時激發(fā)
2.surfaceCreated //在創(chuàng)建時激發(fā),一般在這里調(diào)用畫圖的線程检眯。
3.surfaceDestroyed //銷毀時激發(fā)厘擂,一般在這里將畫圖的線程停止、釋放锰瘸。
整個過程:繼承SurfaceView并實現(xiàn)SurfaceHolder.Callback接口 ----> SurfaceView.getHolder()獲得SurfaceHolder對象 ---->SurfaceHolder.addCallback(callback)添加回調(diào)函數(shù)---->SurfaceHolder.lockCanvas()獲得Canvas對象并鎖定畫布----> Canvas繪畫 ---->SurfaceHolder.unlockCanvasAndPost(Canvas canvas)結(jié)束鎖定畫圖刽严,并提交改變,將圖形顯示避凝。
SurfaceHolder:
這里用到了一個類SurfaceHolder,可以把它當成surface的控制器舞萄,用來操縱surface。處理它的Canvas上畫的效果和動畫管削,控制表面倒脓,大小,像素等含思。
幾個需要注意的方法:
(1)崎弃、abstract void addCallback(SurfaceHolder.Callback callback);
// 給SurfaceView當前的持有者一個回調(diào)對象。
(2)含潘、abstract Canvas lockCanvas();
// 鎖定畫布饲做,一般在鎖定后就可以通過其返回的畫布對象Canvas,在其上面畫圖等操作了遏弱。
(3)盆均、abstract Canvas lockCanvas(Rect dirty);
// 鎖定畫布的某個區(qū)域進行畫圖等..因為畫完圖后,會調(diào)用下面的unlockCanvasAndPost來改變顯示內(nèi)容漱逸。
// 相對部分內(nèi)存要求比較高的游戲來說泪姨,可以不用重畫dirty外的其它區(qū)域的像素居砖,可以提高速度。

(4)驴娃、abstract void unlockCanvasAndPost(Canvas canvas);

// 結(jié)束鎖定畫圖,并提交改變循集。

View:顯示視圖唇敞,內(nèi)置畫布,提供圖形繪制函數(shù)咒彤、觸屏事件疆柔、按鍵事件函數(shù)等;必須在UI主線程內(nèi)更新畫面镶柱,速度較慢
SurfaceView:基于view視圖進行拓展的視圖類旷档,更適合2D游戲的開發(fā);是view的子類歇拆,類似使用雙緩機制鞋屈,在新的線程中更新畫面所以刷新界面速度比view快。
GLSurfaceView:基于SurfaceView視圖再次進行拓展的視圖類故觅,專用于3D游戲開發(fā)的視圖厂庇;是SurfaceView的子類,openGL專用输吏。加入了EGL的管理权旷,并自帶了渲染線程。

surfaceView = (SurfaceView) findViewById(R.id.surfaceview);
            surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
                private void drawCanvas(Bitmap bitmap) {
                    Canvas canvas = surfaceView.getHolder().lockCanvas();
                    if (canvas != null) {
                        canvas.drawBitmap(bitmap, 0, 0, null);
                        surfaceView.getHolder().unlockCanvasAndPost(canvas);
                    }
                }

                @Override
                public void surfaceDestroyed(SurfaceHolder holder) {
                    if (mediaPlayer!=null){
                        if (mediaPlayer.isPlaying()) {
                            mediaPlayer.stop();
                        }
                        mediaPlayer.release();
                        mediaPlayer = null;
                    }
                }

                @Override
                public void surfaceCreated(SurfaceHolder holder) {
                    try {
                        if (mediaPlayer == null) {
                            mediaPlayer = new MediaPlayer();
                            mediaPlayer.setDataSource(SplashActivity.this, Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.welcome));
                            mediaPlayer.setLooping(true);
                            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                                @Override
                                public void onPrepared(MediaPlayer mediaPlayer) {
                                    mediaPlayer.start();
                                }
                            });
                            mediaPlayer.setDisplay(surfaceView.getHolder());
                            mediaPlayer.prepareAsync();
                        }
                    } catch (IOException e) {
                        ToastUtils.ToastShortCenter(SplashActivity.this, e.getMessage());
                    }

                }

                @Override
                public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

                }
            });

關(guān)于MediaPlayer:
播放聲音可以用MediaPlayer和AudioTrack贯溅,兩者都提供了java API供應用開發(fā)者使用拄氯。其中最大的區(qū)別是MediaPlayer可以播放多種格式的聲音文件,例如 MP3它浅,AAC译柏,WAV,OGG罚缕,MIDI等艇纺。MediaPlayer會在framework層創(chuàng)建對應的音頻解碼器。而AudioTrack只能播放已 經(jīng)解碼的PCM流邮弹,如果是文件的話只支持wav格式的音頻文件黔衡,因為wav格式的音頻文件大部分都是PCM流。AudioTrack不創(chuàng)建解碼器腌乡,所以只 能播放不需要解碼的wav文件盟劫。MediaPlayer在framework層還是會創(chuàng)建AudioTrack,把解碼后 的PCM數(shù)流傳遞給AudioTrack与纽,AudioTrack再傳遞給AudioFlinger進行混音侣签,然后才傳遞給硬件播放塘装。
補充:SoundPool 則適合播放比較短的音頻片段,比如游戲聲音影所、按鍵聲蹦肴、鈴聲片段等等,它可以同時播放多個音頻;

https://blog.csdn.net/u014606081/article/details/79927057

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末猴娩,一起剝皮案震驚了整個濱河市阴幌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌卷中,老刑警劉巖矛双,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蟆豫,居然都是意外死亡议忽,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門十减,熙熙樓的掌柜王于貴愁眉苦臉地迎上來栈幸,“玉大人,你說我怎么就攤上這事帮辟≌煺颍” “怎么了?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵织阅,是天一觀的道長壳繁。 經(jīng)常有香客問我,道長荔棉,這世上最難降的妖魔是什么闹炉? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮润樱,結(jié)果婚禮上渣触,老公的妹妹穿的比我還像新娘。我一直安慰自己壹若,他們只是感情好嗅钻,可當我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著店展,像睡著了一般养篓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赂蕴,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天柳弄,我揣著相機與錄音,去河邊找鬼概说。 笑死碧注,一個胖子當著我的面吹牛嚣伐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播萍丐,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼轩端,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了逝变?” 一聲冷哼從身側(cè)響起船万,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎骨田,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體声怔,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡态贤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了醋火。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片悠汽。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖芥驳,靈堂內(nèi)的尸體忽然破棺而出柿冲,到底是詐尸還是另有隱情,我是刑警寧澤兆旬,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布假抄,位于F島的核電站,受9級特大地震影響丽猬,放射性物質(zhì)發(fā)生泄漏宿饱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一脚祟、第九天 我趴在偏房一處隱蔽的房頂上張望谬以。 院中可真熱鬧,春花似錦由桌、人聲如沸为黎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽铭乾。三九已至,卻和暖如春娃循,著一層夾襖步出監(jiān)牢的瞬間片橡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工淮野, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留捧书,地道東北人吹泡。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像经瓷,于是被迫代替她去往敵國和親爆哑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內(nèi)容