欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android音頻開發(fā)之SurfaceView的使用詳解

 更新時(shí)間:2022年04月14日 08:11:14   作者:JulyYu  
這篇文章主要為大家介紹了Android中SurfaceView的使用方法,本文通過(guò)簡(jiǎn)要的案例,為大家進(jìn)行了詳細(xì)的講解,需要的朋友可以參考一下

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)SurfaceViewView
繪制結(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)存開銷。因此就有了SurfaceHolderaddCallback方法來(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)文章

  • Android控件陰影顏色調(diào)整示例

    Android控件陰影顏色調(diào)整示例

    這篇文章主要介紹了Android控件陰影顏色調(diào)整示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • Flutter實(shí)現(xiàn)漸變弧形進(jì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-12
  • 淺談Flutter解析JSON三種方式

    淺談Flutter解析JSON三種方式

    這篇文章主要介紹了淺談Flutter解析JSON三種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Android實(shí)現(xiàn)截圖和分享功能的代碼

    Android實(shí)現(xiàn)截圖和分享功能的代碼

    截圖和分享功能大家都玩過(guò),下面通過(guò)本文給大家介紹Android實(shí)現(xiàn)截圖和分享功能,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下吧
    2017-07-07
  • Android 中LayoutInflater.inflate()方法的介紹

    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)菜單效果(附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ì)原理

    這篇文章主要介紹了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)單圖片爬蟲的方法

    本篇文章主要介紹了基于RxJava2實(shí)現(xiàn)的簡(jiǎn)單圖片爬蟲的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-02-02
  • Android實(shí)現(xiàn)自定義ImageView的圓角矩形圖片效果

    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í)例

    Android訪問(wèn)php取回json數(shù)據(jù),實(shí)現(xiàn)代碼如下,遇到訪問(wèn)網(wǎng)絡(luò)的權(quán)限不足在AndroidManifest.xml中,需要進(jìn)行如下配置
    2013-06-06

最新評(píng)論