Android音頻開發(fā)之SurfaceView的使用詳解
SurfaceView
SurfaceView
從源碼上看繼承自View
,但在內(nèi)部實(shí)現(xiàn)上SurfaceView
和其他View
有很多區(qū)別。 SurfaceView
主要作用是提供一個(gè)直接繪圖表面嵌入到視圖結(jié)構(gòu)中,實(shí)際上真正做繪制能力的是Surface
。因此SurfaceView
和宿主窗口是分離的。正常情況下窗口的View
共享同一個(gè)Window
,而Window
也對(duì)應(yīng)一個(gè)Surface
,所有View
也就共享同一個(gè)Surface
。所以SurfaceView
具備獨(dú)立的Surface
,相當(dāng)于和宿主窗口繪制是分離互不干擾。
不同點(diǎn)
不同點(diǎn) | SurfaceView | View |
---|---|---|
繪制 | 結(jié)構(gòu)在View當(dāng)中,但繪制表面是獨(dú)立的。內(nèi)部擁有自己的Canvas進(jìn)行繪制操作 | 和宿主窗口共享同一個(gè)繪圖表面 |
刷新 | 窗口刷新不需要重繪宿主窗口 | 任何一個(gè)子元素或是局部刷新都會(huì)使得整個(gè)視圖結(jié)構(gòu)發(fā)生重繪 |
線程 | 線程獨(dú)立,不影響主線程 使用界面頻繁刷新 | 在UI主線程使用 |
操作 | 低版本不支持平移、縮放、旋轉(zhuǎn)等動(dòng)畫 不具備View屬性控制 | 均可正常操作 |
刷新 | 可控制刷新頻率、雙緩存機(jī)制 | 只在主線程刷新更新 |
雙緩沖機(jī)制
SurfaceView
將視頻流解析成一幀幀圖像數(shù)據(jù)顯示。例如一幀圖像顯示后,等待下一幀圖像可能存在還未及時(shí)解析的情況,這種情況下就會(huì)導(dǎo)致畫面不流暢。利用雙緩沖可以避免這種情況,可以理解雙緩沖是兩個(gè)線程輪流解析視頻流圖像數(shù)據(jù)兩者交替進(jìn)行解析和渲染操作從而保證視頻流能夠流暢播放。
SurfaceHolder
SurfaceView
雙緩沖機(jī)制事實(shí)上是比較消耗系統(tǒng)內(nèi)存。因此當(dāng)SurfaceView
在不可見狀態(tài)下就會(huì)去銷毀SurfaceHolder
來(lái)減輕內(nèi)存開銷。因此就有了SurfaceHolder
的addCallback
方法來(lái)監(jiān)聽SurfaceHolder
狀態(tài)。
- void surfaceCreated(@NonNull SurfaceHolder holder); 創(chuàng)建回調(diào)
- void surfaceChanged(@NonNull SurfaceHolder holder, @PixelFormat.Format int format, @IntRange(from = 0) int width, @IntRange(from = 0) int height); 修改回調(diào)
- void surfaceDestroyed(@NonNull SurfaceHolder holder); 銷毀回調(diào)
使用
自定義繼承SurfaceView
可以自定義繪制內(nèi)容。當(dāng)創(chuàng)建SurfaceHolder
成功后再surfaceCreated
回調(diào)中調(diào)用lockCanvas
獲取到SurfaceHolder
的畫布并鎖定,然后繪制內(nèi)容。繪制結(jié)束后調(diào)用unlockCanvasAndPost
釋放并提交畫布改動(dòng)信息,讓新數(shù)據(jù)在畫布上進(jìn)行展示。
public class SurfaceViewTest extends SurfaceView implements SurfaceHolder.Callback{ private SurfaceHolder mSurfaceHolder; private Canvas mCanvas; private Paint paint; public SurfaceViewTest(Context context) { this(context,null,0); } public SurfaceViewTest(Context context, AttributeSet attrs) { this(context, attrs,0); } public SurfaceViewTest(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { mSurfaceHolder = getHolder(); // 初始化 mSurfaceHolder.addCallback(this); setFocusable(true); setFocusableInTouchMode(true); this.setKeepScreenOn(true); paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setColor(Color.RED); paint.setStrokeWidth(5); paint.setStyle(Paint.Style.STROKE); } @Override public void surfaceCreated(SurfaceHolder holder) { // 創(chuàng)建成功后就能通過(guò)線程繪制自定義內(nèi)容 new Thread(new Runnable() { @Override public void run() { draw(); } }).start(); } private void draw() { try { mCanvas = mSurfaceHolder.lockCanvas(); mCanvas.drawCircle(500,500,300,paint); mCanvas.drawCircle(100,100,20,paint); } catch (Exception e) { e.printStackTrace(); } finally { if (mCanvas != null) mSurfaceHolder.unlockCanvasAndPost(mCanvas); } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {} @Override public void surfaceDestroyed(SurfaceHolder holder) {} }
以上就是Android音頻開發(fā)之SurfaceView的使用詳解的詳細(xì)內(nèi)容,更多關(guān)于Android SurfaceView的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Flutter實(shí)現(xiàn)漸變弧形進(jìn)度條的示例詳解
在Flutter開發(fā)中,構(gòu)建一個(gè)具有視覺吸引力的、反映進(jìn)度的圓形弧形進(jìn)度條是一個(gè)常見需求,本文將詳細(xì)介紹如何使用Flutter和Dart語(yǔ)言實(shí)現(xiàn)這一功能,需要的可以參考下2023-12-12Android實(shí)現(xiàn)截圖和分享功能的代碼
截圖和分享功能大家都玩過(guò),下面通過(guò)本文給大家介紹Android實(shí)現(xiàn)截圖和分享功能,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下吧2017-07-07Android 中LayoutInflater.inflate()方法的介紹
這篇文章主要介紹了Android 中LayoutInflater.inflate()方法的介紹的相關(guān)資料,希望通過(guò)本文大家能掌握這部分內(nèi)容,需要的朋友可以參考下2017-09-09Android編程實(shí)現(xiàn)仿優(yōu)酷旋轉(zhuǎn)菜單效果(附demo源碼)
這篇文章主要介紹了Android編程實(shí)現(xiàn)仿優(yōu)酷旋轉(zhuǎn)菜單效果的方法,較為詳細(xì)的分析了Android實(shí)現(xiàn)旋轉(zhuǎn)菜單的布局與功能實(shí)現(xiàn)技巧,并附帶完整的demo源碼供讀者下載參考,需要的朋友可以參考下2015-12-12Android 適配器模式應(yīng)用及設(shè)計(jì)原理
這篇文章主要介紹了Android 適配器模式應(yīng)用及設(shè)計(jì)原理的相關(guān)資料,Android開發(fā)者應(yīng)該都知道適配器會(huì)用,但是不是多清楚原理,這里幫大家分析下原理,需要的朋友可以參考下2016-10-10基于RxJava2實(shí)現(xiàn)的簡(jiǎn)單圖片爬蟲的方法
本篇文章主要介紹了基于RxJava2實(shí)現(xiàn)的簡(jiǎn)單圖片爬蟲的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-02-02Android實(shí)現(xiàn)自定義ImageView的圓角矩形圖片效果
android顯示圓角矩形的圖片其原理就是首先獲取到圖片的Bitmap,然后進(jìn)行裁剪對(duì)應(yīng)的圓角矩形的bitmap,然后在onDraw()進(jìn)行繪制圓角矩形圖片輸出2018-05-05Android訪問(wèn)php取回json數(shù)據(jù)實(shí)例
Android訪問(wèn)php取回json數(shù)據(jù),實(shí)現(xiàn)代碼如下,遇到訪問(wèn)網(wǎng)絡(luò)的權(quán)限不足在AndroidManifest.xml中,需要進(jìn)行如下配置2013-06-06