SurfaceView學(xué)習(xí)筆記->什么是SurfaceView

在一般的Android程序中,UI都是在主線程處理,但是,有些可能比較復(fù)雜的動(dòng)畫(huà)會(huì)卡頓主線程,如相機(jī),為了解決這個(gè)問(wèn)題,Android提供了SurfaceView,即在非主線程繪制UI。

SurfaceView在android.view包下,從Android1.0開(kāi)始支持。

public class MySurface extends SurfaceView implements Runnable{}

從中可以看出,我們?cè)谑褂?code>SurfaceView時(shí),一般是自定義一個(gè)類,并繼承SurfaceViewRunnable,熟悉Java的應(yīng)該能知道,Runnable是實(shí)現(xiàn)多線程的接口,由此可見(jiàn),我們定義的MySurface有多線程的特征。

SurfaceView又是什么呢?

SurfaceView

從官方文檔看,SurfaceView繼承自android.view.View,也就是說(shuō),SurfaceView也是和ImageViewTextView類似的一個(gè)普通的View。

然后再看看官方對(duì)SurfaceView的介紹:

SurfaceView官方介紹

第一句提供一個(gè)嵌入在View樹(shù),專用于繪制Surface,View樹(shù)我想大家都知道類似如下,可以用Android Tool:View Hierarchy查看

View Tree

那什么是Surface呢?
Surface

從中可以看到,Surface繼承自Object而不是View,且實(shí)現(xiàn)了Parcelable,可見(jiàn)Surface不是一個(gè)傳統(tǒng)意義上的View
再看看官方介紹

Surface官方介紹

介紹很簡(jiǎn)短的一句話:由屏幕顯示內(nèi)容合成器(screen compositor)所管理的原始緩沖區(qū)的句柄,從中可以看到,Surface是個(gè)句柄,通過(guò)這個(gè)句柄,可以獲得原始緩沖區(qū)及其內(nèi)容,原始緩沖區(qū)用于保存當(dāng)前窗口的像素?cái)?shù)據(jù)。

Surface的公開(kāi)方法中,可以看到有一個(gè)lockCanvas方法,傳入一個(gè)矩形區(qū)域,返回一個(gè)Canvas
Canvas大家應(yīng)該很熟悉,從字面直譯是畫(huà)布的意思,也就是說(shuō),你可以在Canvas這塊畫(huà)布上繪制你想要的圖像,實(shí)際上也是這個(gè)用途

Surface的方法

看一下lockCanvas的介紹

lockCanvas方法介紹

Surface獲取一塊畫(huà)布用于繪制,在繪制結(jié)束后,調(diào)用者必須執(zhí)行unlockCanvasAndPost(Canvas)來(lái)將新繪制的內(nèi)容發(fā)送到Surface

再看看參數(shù)inOutDirty:調(diào)用者想要重新繪制的一塊廢棄區(qū)域,這個(gè)方法可以被用于擴(kuò)展dirty區(qū)域,比如像縮放Surface,調(diào)用者也可以傳遞null,如果是這樣的話,整個(gè)Surface應(yīng)該被重新繪制。
unlockCanvasAndPost(Canvas)這個(gè)方法則是將Canvas中繪制的內(nèi)容發(fā)送給Surface

由此可見(jiàn),雖然Surface沒(méi)有繼承自View,但是它擁有一塊可繪制區(qū)域用于繪制內(nèi)容,但是因?yàn)樗鼪](méi)有繼承自View,所以不能直接用于View樹(shù)。

說(shuō)到這里,應(yīng)該能明白SurfaceView是什么了吧,接著看SurfaceView官方文檔:

You can control the format of this surface and, if you like, its size; the SurfaceView takes care of placing the surface at the correct location on the screen:“你可以控制Surface的格式,甚至尺寸,和位置”,從這里可以看出,SurfaceView存在的意義就是將不可以插入View hierarchy的Surface轉(zhuǎn)為可以插入的SurfaceView

The surface is Z ordered so that it is behind the window holding its SurfaceView; the SurfaceView punches a hole in its window to allow its surface to be displayed. The view hierarchy will take care of correctly compositing with the Surface any siblings of the SurfaceView that would normally appear on top of it. This can be used to place overlays such as buttons on top of the Surface, though note however that it can have an impact on performance since a full alpha-blended composite will be performed each time the Surface changes.
Surface是在Z軸的,所以它應(yīng)該在SurfaceView的底部,SurfaceView在自己身上打了個(gè)洞以便讓Surface能被看到,View hierarchy會(huì)正確的顯示Surface的位置,其他的View也可以出現(xiàn)在它的上方,這可以用于將一個(gè)按鈕放置在Surface的上方,需要注意的是,將一個(gè)透明的按鈕放置在Surface的上方,每次Surface的變化都會(huì)導(dǎo)致按鈕的重新繪制。

再看看這句Access to the underlying surface is provided via the SurfaceHolder interface, which can be retrieved by calling getHolder()“需要訪問(wèn)底層的Surface,你可以通過(guò)提供的SurfaceHolder來(lái)訪問(wèn),SurfaceHolder可以通過(guò)getHolder()得到”。

The Surface will be created for you while the SurfaceView's window is visible; you should implement surfaceCreated(SurfaceHolder) and surfaceDestoryed(SurfaceHolder) to discover when the Surface is created and destroyed as the window is shown and hidden.
只有SurfaceView可見(jiàn)是,Surface才會(huì)被創(chuàng)建,你可以繼承surfaceCreatedsurfaceDestoryed獲得。

到此,SurfaceView是什么應(yīng)該能明白了吧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,488評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,034評(píng)論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 175,327評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 62,554評(píng)論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,337評(píng)論 6 404
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 54,883評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,975評(píng)論 3 439
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,114評(píng)論 0 286
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,625評(píng)論 1 332
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,555評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,737評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,244評(píng)論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 43,973評(píng)論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,362評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,615評(píng)論 1 280
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,343評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,699評(píng)論 2 370

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