最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android音頻開(kāi)發(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)畫(huà) 不具備View屬性控制均可正常操作
刷新可控制刷新頻率、雙緩存機(jī)制只在主線程刷新更新

雙緩沖機(jī)制

SurfaceView將視頻流解析成一幀幀圖像數(shù)據(jù)顯示。例如一幀圖像顯示后,等待下一幀圖像可能存在還未及時(shí)解析的情況,這種情況下就會(huì)導(dǎo)致畫(huà)面不流暢。利用雙緩沖可以避免這種情況,可以理解雙緩沖是兩個(gè)線程輪流解析視頻流圖像數(shù)據(jù)兩者交替進(jìn)行解析和渲染操作從而保證視頻流能夠流暢播放。

SurfaceHolder

SurfaceView雙緩沖機(jī)制事實(shí)上是比較消耗系統(tǒng)內(nèi)存。因此當(dāng)SurfaceView在不可見(jiàn)狀態(tài)下就會(huì)去銷(xiāo)毀SurfaceHolder來(lái)減輕內(nèi)存開(kāi)銷(xiāo)。因此就有了SurfaceHolderaddCallback方法來(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); 銷(xiāo)毀回調(diào)

使用

自定義繼承SurfaceView可以自定義繪制內(nèi)容。當(dāng)創(chuàng)建SurfaceHolder成功后再surfaceCreated回調(diào)中調(diào)用lockCanvas獲取到SurfaceHolder的畫(huà)布并鎖定,然后繪制內(nèi)容。繪制結(jié)束后調(diào)用unlockCanvasAndPost釋放并提交畫(huà)布改動(dòng)信息,讓新數(shù)據(jù)在畫(huà)布上進(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)文章

最新評(píng)論

赤壁市| 泗阳县| 鲁山县| 徐水县| 那曲县| 界首市| 萍乡市| 永寿县| 罗田县| 内乡县| 子洲县| 淳安县| 崇文区| 青田县| 乌鲁木齐市| 馆陶县| 神池县| 乃东县| 竹北市| 河北省| 临西县| 桐梓县| 饶阳县| 诏安县| 星子县| 华阴市| 淮阳县| 启东市| 宝坻区| 南靖县| 南城县| 沿河| 泰宁县| 桐柏县| 嘉荫县| 嘉兴市| 巴彦县| 云安县| 怀仁县| 陕西省| 方山县|