Android音頻開(kāi)發(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在不可見(jiàn)狀態(tài)下就會(huì)去銷毀SurfaceHolder來(lái)減輕內(nèi)存開(kāi)銷。因此就有了SurfaceHolder的addCallback方法來(lái)監(jiān)聽(tīng)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音頻開(kāi)發(fā)之SurfaceView的使用詳解的詳細(xì)內(nèi)容,更多關(guān)于Android SurfaceView的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Flutter實(shí)現(xiàn)漸變弧形進(jìn)度條的示例詳解
在Flutter開(kāi)發(fā)中,構(gòu)建一個(gè)具有視覺(jué)吸引力的、反映進(jìn)度的圓形弧形進(jìn)度條是一個(gè)常見(jiàn)需求,本文將詳細(xì)介紹如何使用Flutter和Dart語(yǔ)言實(shí)現(xiàn)這一功能,需要的可以參考下2023-12-12
Android實(shí)現(xiàn)截圖和分享功能的代碼
截圖和分享功能大家都玩過(guò),下面通過(guò)本文給大家介紹Android實(shí)現(xiàn)截圖和分享功能,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下吧2017-07-07
Android 中LayoutInflater.inflate()方法的介紹
這篇文章主要介紹了Android 中LayoutInflater.inflate()方法的介紹的相關(guān)資料,希望通過(guò)本文大家能掌握這部分內(nèi)容,需要的朋友可以參考下2017-09-09
Android編程實(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-12
Android 適配器模式應(yīng)用及設(shè)計(jì)原理
這篇文章主要介紹了Android 適配器模式應(yīng)用及設(shè)計(jì)原理的相關(guān)資料,Android開(kāi)發(fā)者應(yīng)該都知道適配器會(huì)用,但是不是多清楚原理,這里幫大家分析下原理,需要的朋友可以參考下2016-10-10
基于RxJava2實(shí)現(xiàn)的簡(jiǎn)單圖片爬蟲(chóng)的方法
本篇文章主要介紹了基于RxJava2實(shí)現(xiàn)的簡(jiǎn)單圖片爬蟲(chóng)的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-02-02
Android實(shí)現(xiàn)自定義ImageView的圓角矩形圖片效果
android顯示圓角矩形的圖片其原理就是首先獲取到圖片的Bitmap,然后進(jìn)行裁剪對(duì)應(yīng)的圓角矩形的bitmap,然后在onDraw()進(jìn)行繪制圓角矩形圖片輸出2018-05-05
Android訪問(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

