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

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

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

SurfaceView

SurfaceView從源碼上看繼承自View,但在內(nèi)部實現(xiàn)上SurfaceView和其他View有很多區(qū)別。 SurfaceView主要作用是提供一個直接繪圖表面嵌入到視圖結(jié)構(gòu)中,實際上真正做繪制能力的是Surface。因此SurfaceView和宿主窗口是分離的。正常情況下窗口的View共享同一個Window,而Window也對應(yīng)一個Surface,所有View也就共享同一個Surface。所以SurfaceView具備獨立的Surface,相當于和宿主窗口繪制是分離互不干擾。

不同點

不同點SurfaceViewView
繪制結(jié)構(gòu)在View當中,但繪制表面是獨立的。內(nèi)部擁有自己的Canvas進行繪制操作和宿主窗口共享同一個繪圖表面
刷新窗口刷新不需要重繪宿主窗口任何一個子元素或是局部刷新都會使得整個視圖結(jié)構(gòu)發(fā)生重繪
線程線程獨立,不影響主線程 使用界面頻繁刷新在UI主線程使用
操作低版本不支持平移、縮放、旋轉(zhuǎn)等動畫 不具備View屬性控制均可正常操作
刷新可控制刷新頻率、雙緩存機制只在主線程刷新更新

雙緩沖機制

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

SurfaceHolder

SurfaceView雙緩沖機制事實上是比較消耗系統(tǒng)內(nèi)存。因此當SurfaceView在不可見狀態(tài)下就會去銷毀SurfaceHolder來減輕內(nèi)存開銷。因此就有了SurfaceHolderaddCallback方法來監(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)容。當創(chuàng)建SurfaceHolder成功后再surfaceCreated回調(diào)中調(diào)用lockCanvas獲取到SurfaceHolder的畫布并鎖定,然后繪制內(nèi)容。繪制結(jié)束后調(diào)用unlockCanvasAndPost釋放并提交畫布改動信息,讓新數(shù)據(jù)在畫布上進行展示。

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的使用詳解的詳細內(nèi)容,更多關(guān)于Android SurfaceView的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論

常山县| 昭苏县| 吉水县| 钟山县| 宿州市| 舟山市| 永福县| 英山县| 高唐县| 临猗县| 林口县| 兰考县| 惠东县| 吉林市| 灌南县| 永定县| 苍山县| 鲜城| 洞口县| 太保市| 霞浦县| 曲周县| 克什克腾旗| 乐至县| 三都| 西宁市| 静海县| 大理市| 绥德县| 青阳县| 辛集市| 昂仁县| 镇原县| 襄城县| 和田市| 宜章县| 耿马| 张掖市| 瑞安市| 鄄城县| 玛曲县|