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來減輕內(nèi)存開銷。因此就有了SurfaceHolder的addCallback方法來監(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)建成功后就能通過線程繪制自定義內(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)文章
Android Selector獲取焦點(diǎn)后文本背景修改的實(shí)現(xiàn)代碼
這篇文章主要介紹了Android Selector獲取焦點(diǎn)后文本背景修改的實(shí)現(xiàn)代碼,本文通過demo展示和實(shí)現(xiàn)代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11
Android中搜索圖標(biāo)和文字居中的EditText實(shí)例
本篇文章主要介紹了Android中搜索圖標(biāo)和文字居中的EditText實(shí)例,具有一定的參考價(jià)值,有興趣的可以了解一下2017-06-06
iOS開發(fā)中TableView類似QQ分組的折疊與展開效果
這篇文章主要介紹了iOS開發(fā)中TableView類似QQ分組的折疊與展開效果,其實(shí)要做這個(gè)效果我先想到的是在tableView中再嵌套多個(gè)tableView。下面通過本文給大家分享實(shí)現(xiàn)思路,需要的朋友可以參考下2016-12-12
Android MaterialCardView的使用介紹與示例
MaterialCardView是一個(gè)基于Android支持庫中的CardView的可自定義組件。 MaterialCardView提供了CardView的所有功能,但增加了一些自定義屬性,使用起來更加方便實(shí)用2021-11-11
Android持久化技術(shù)之SharedPreferences存儲(chǔ)實(shí)例詳解
這篇文章主要介紹了Android持久化技術(shù)之SharedPreferences存儲(chǔ),結(jié)合實(shí)例形式較為詳細(xì)的分析了SharedPreferences存儲(chǔ)的原理、應(yīng)用及具體實(shí)現(xiàn)方法,需要的朋友可以參考下2016-01-01
使用Android Studio實(shí)現(xiàn)為系統(tǒng)級(jí)的app簽名
這篇文章主要介紹了使用Android Studio實(shí)現(xiàn)為系統(tǒng)級(jí)的app簽名,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-03-03

