〈kotlin〉Android studio使い方メモ13:Surface View

金宏和實さんの「作ればわかる!Androidプログラミング kotlin対応」を参考に
Android studioでkotlinを使ってAndroidアプリ作成。

画面を描写する時に使用するSurface Viewの使い方。

Surface Viewとは

アニメーションなど高度な画面の描写が必要な時に使用する。
サーフェイスという描写専用のレイヤーを持っており、
SurfaceHolderというインターフェイスを通じてサーフェイスにアクセスする。
実際にはSurfaceHolder.Callbackインターフェイスを実装する。

SurfaceHolder.Callbackインターフェイスを実装したクラスは
以下のコールバックメソッドを実装する必要がある。

コールバックメソッド 呼び出されるタイミング
surfaceCreated() Viewが生成されたとき(初期画面)
surfaceChanged() Viewが変更されたとき(画面更新)
surfaceDestroyed() Viewが破棄されたとき(後処理)

実装

SurfaceHolder.Callback
class MainActivity : AppCompatActivity(), SurfaceHolder.Callback{
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        val holder = binding.surfaceView.holder
        holder.addCallback(this)

addCallback()メソッドでholderのコールバックに自分を設定することで
次に呼ばれる処理がsurfaceCreated()メソッドになる。

コールバックメソッド
override fun surfaceCreated(holder: SurfaceHolder) {
    val canvas = binding.surfaceView.holder.lockCanvas()
    //初期画面の描写を記述

    binding.surfaceView.holder.unlockCanvasAndPost(canvas)
}


override fun surfaceChanged(holder: SurfaceHolder, format: Int, width: Int, height: Int) {
    //更新時
}

override fun surfaceDestroyed(holder: SurfaceHolder) {
    //破棄時
}

lockCanvas()メソッドはサーフェイスの表示をロックしてCanvasオブジェクトを返す。
変数canvasにオブジェクトを取得できたので、
CanvasクラスやPaintクラスのメソッドを使用して必要な描写を記述する。
記述できたらunlockCanvasAndPost()でアンロックしてサーフェイスを更新する。
lockCanvas()とlockCanvasAndPost()はペアで使用する。