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

Android SurfaceView基礎(chǔ)用法詳解

 更新時(shí)間:2021年08月17日 11:52:07   作者:樓上的大叔阿  
這篇文章主要介紹了Android SurfaceView基礎(chǔ)用法詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

Android 游戲開(kāi)發(fā)框架核心組件

這里寫(xiě)圖片描述

核心組件介紹

SurfaceView 介紹

  1. SurfaceView 介紹 SurfaceView 就是帶 Surface 的 view,它是一個(gè) View,是 View 的子類,所以和其他 View 一樣,可以在屏幕上展示東西接收用戶輸入,具有 View 的生命周期回調(diào)函數(shù),如 onMeasure、onLayout、onDraw、onTouchEvent 等
  2. SurfaceView 帶有獨(dú)立的 Surface(獨(dú)立與 window 的 surface),這可以讓子線程在獨(dú)立的 Surface 上面繪制東西,進(jìn)行 SurfaceView 的界面繪制,這個(gè)子線程就叫做渲染線程,但是要讓獨(dú)立的 Surface 上面的東西在 View 上面展示出來(lái),需要 post 一個(gè)消息給主線程,目的是把該 Surface 中 canvas 上的東西繪制到 View 的真正的畫(huà)布上面(window 的 surface 的 canvas上),這樣就可以把 UI 線程空閑出來(lái)處理用戶的交互
  3. Surface 可能被銷毀,它只在SurfaceHolder.Callback.surfaceCreated() 和 SurfaceHolder.Callback.surfaceDestroyed() 之間有效,這只是說(shuō) Surface 創(chuàng)建和銷毀的時(shí)候會(huì)回到前面兩個(gè)方法,所以要確保渲染線程訪問(wèn)的是合法有效的 surface
  4. SurfaceHolder.CallBack 是通過(guò) SurfaceView 的 SurfaceHolder 的 addCallback 來(lái)設(shè)置給 SurfaceHolder 的,讓 SurfaceView 實(shí)現(xiàn) CallBack 并設(shè)置給 SurfaceHolder,SurfaceView 就可以監(jiān)聽(tīng)這個(gè)獨(dú)立 Surface 的創(chuàng)建和銷毀了。

sdk 中的介紹

SurfaceView是視圖(View)的繼承類,這個(gè)視圖里內(nèi)嵌了一個(gè)專門(mén)用于繪制的Surface。你可以控制這個(gè)Surface的格式和尺寸。Surfaceview控制這個(gè)Surface的繪制位置。
surface是縱深排序(Z-ordered)的,這表明它總在自己所在窗口的后面。surfaceview提供了一個(gè)可見(jiàn)區(qū)域,只有在這個(gè)可見(jiàn)區(qū)域內(nèi) surface 部分內(nèi)容才可見(jiàn),可見(jiàn)區(qū)域外的部分不可見(jiàn)。
surface 的排版顯示受到視圖層級(jí)關(guān)系的影響,它的兄弟視圖結(jié)點(diǎn)會(huì)在頂端顯示。這意味者 surface
的內(nèi)容會(huì)被它的兄弟視圖遮擋,這一特性可以用來(lái)放置遮蓋物(overlays)(例如,文本和按鈕等控件)。注意,如果 surface 上面有透明控件,那么它的每次變化都會(huì)引起框架重新計(jì)算它和頂層控件之間的透明效果,這會(huì)影響性能。
你可以通過(guò) surfaceHolder 接口訪問(wèn)這個(gè)surface,getHolder() 方法可以得到這個(gè)接口。
surfaceview 變得可見(jiàn)時(shí),surface被創(chuàng)建;surfaceview隱藏前,surface被銷毀。這樣能節(jié)省資源。如果你要查看 surface 被創(chuàng)建和銷毀的時(shí)機(jī),可以重載surfaceCreated(SurfaceHolder)和 surfaceDestroyed(SurfaceHolder) surfaceView 的核心在于提供了兩個(gè)線程:UI線程和渲染線程。
這里應(yīng)注意:
1. 所有 SurfaceView 和 SurfaceHolder.Callback 的方法都會(huì)在UI線程里調(diào)用,一般來(lái)說(shuō)就是應(yīng)用程序主線程。所以渲染線程所要訪問(wèn)的各種變量應(yīng)該作同步處理。
2. 由于surface可能被銷毀,它只在SurfaceHolder.Callback.surfaceCreated()和 SurfaceHolder.Callback.surfaceDestroyed()之間有效,所以要確保渲染線程訪問(wèn)的是合法有效的
surface。

SurfaceHolder 介紹

SurfaceHolder 是對(duì) SurfaceView 的 Surface 的包裝,不但在 SurfaceHolder.callback 接口中負(fù)責(zé) Surface 創(chuàng)建和銷毀的回調(diào),而且還對(duì) Surface 的關(guān)鍵方法 LockCanvas()、unLockCanvasAndPost() 方法進(jìn)行了線程安全的包裝,所以 SurfaceHolder 是 Surface 對(duì)象的持有者,負(fù)責(zé) Surface 的生命周期中的對(duì) Surface 操作的方法的調(diào)用
臟矩形 Rect dirty,是指標(biāo)記這塊矩形區(qū)域的數(shù)據(jù)作廢,也就是需要重寫(xiě)繪制的矩形區(qū)域,LockCanvas(Rect dirty),可以指定一個(gè)矩形區(qū)域,讓 Surface 中的 Canvas 上部分?jǐn)?shù)據(jù)重繪。

SurfaceView、SurfaceHolder、Surface 之間的關(guān)系

這里寫(xiě)圖片描述

SurfaceView 使用的步驟

  1. 獲取到 SurfaceView 對(duì)應(yīng)的 SurfaceHolder,給 SurfaceHolder 添加一個(gè) SurfaceHolder.callback 對(duì)象。
  2. 創(chuàng)建渲染線程對(duì)象
  3. 在子線程中開(kāi)始在 Surface 上面繪制圖形,因?yàn)镾urfaceView沒(méi)有對(duì)我們暴露 Surface,而只是暴露了 Surface 的包裝器 SurfaceHolder,所以使用 SurfaceHolder 的 lockCanvas()獲取 Surface 上面指定區(qū)域的 Canvas,在該 Canvas 上繪制圖形,繪制結(jié)束后,使用 SurfaceHolder 的 unlockCanvasAndPost()方法解鎖 Canvas,并且讓 UI 線程把 Surface 上面的東西繪制到 View 的 Canvas 上面

SurfaceView 使用的 demo

public class GameUI extends SurfaceView implements SurfaceHolder.Callback {

    private SurfaceHolder holder;
    private RenderThread renderThread;
    private boolean isDraw = false;// 控制繪制的開(kāi)關(guān)

    public GameUI(Context context) {
        super(context);
        holder = this.getHolder();
        holder.addCallback(this);

        renderThread = new RenderThread();
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        isDraw = true;
        renderThread.start();

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        isDraw = false;

    }

    /**
    * 繪制界面的線程
    * 
    * @author Administrator
    * 
    */
    private class RenderThread extends Thread {
        @Override
        public void run() {
            // 不停繪制界面
            while (isDraw) {
                drawUI();
            }
            super.run();
        }
    }

    /**
    * 界面繪制
    */
    public void drawUI() {
        Canvas canvas = holder.lockCanvas();
        try {
            drawCanvas(canvas);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            holder.unlockCanvasAndPost(canvas);
        }
    }

    private void drawCanvas(Canvas canvas) {
        // 在 canvas 上繪制需要的圖形
    }
}

到此這篇關(guān)于Android SurfaceView基礎(chǔ)用法詳解的文章就介紹到這了,更多相關(guān)Android SurfaceView基礎(chǔ)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論