20210225のAndroidに関する記事は2件です。

続・CameraX でカメラを一時停止する方法

概要

CameraX でカメラを一時停止する方法の続きとなります。

前回の課題

androidx.camera:camera-core:1.0.0-alpha05 までは onPreviewOutputUpdateListener を使ってカメラの映像を一時停止・再開することができた。
以降のバージョンでは、onPreviewOutputUpdateListener が廃止され、一時停止・再開させる方法を検討した結果、暗転せずに一時停止から再開する方法が見つからず困っていた。

検証環境

camerax-core:1.1.0-rc01

今回試したもの

カスタムの LifecycleOwner の実装

CameraX は下記のコードでライフサイクルに合わせた処理を自動でやってくれるようになっています

cameraProvider.bindToLifecycle(this as LifecycleOwner, cameraSelector, preview)

サンプルコード全体

preview を unbind / bind したり、 Preview.setSurfaceProvider() で一時停止・再開を試みましたが、再開時に画面が暗転してしまっていましたが、今回は lifecycle を利用することで実現することができました。

カスタム LifecycleOwner の実装

まず LifecycleOwner を独自で定義します。

class CustomLifecycle : LifecycleOwner {
        private val lifecycleRegistry: LifecycleRegistry

        init {
            lifecycleRegistry = LifecycleRegistry(this)
            lifecycleRegistry.markState(Lifecycle.State.CREATED)
        }

        fun doOnResume() {
            lifecycleRegistry.markState(Lifecycle.State.RESUMED)
        }

        fun doStart() {
            lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START)
        }

        fun doPause() {
            lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP)
        }

        override fun getLifecycle(): Lifecycle {
            return lifecycleRegistry
        }
    }

続いて、cameraProvider に渡します

val customLifecycle = CustomLifecycle()

var camera = cameraProvider.bindToLifecycle(customLifecycle, cameraSelector, preview)

ここまでで、CameraX に独自のライフサイクルを伝えられるようにします。

一時停止させる場合

一時停止させたいタイミングで CustomLifecycle#doStop() を呼びます

customLifecycle.doStop()

LifecycleRegistory#handleLifecycleEvent() に対して、Lifecycle.Event.ON_STOP を指定することで ON_STOP 状態を通知することができます。
※ ON_PAUSE では CameraX は停止しませんでした。

再開させる場合

同じように再開させたいタイミングで CustomLifecycle#doStart() を呼びます

customLifecycle.doStart()

LifecycleRegistory#handleLifecycleEvent() に対して、Lifecycle.Event.ON_START を指定することで ON_START 状態を通知することができます。
※ ON_RESUME でも再開しました

注意点

CustomLifecycle の onResume, onPause などを Fragment もしくは Activity と同期する必要があるため、Fragment や Activity から doOnResume() などの呼び出しが必要となります。
※ これを忘れると CameraX 自体が起動しません

結果

前回のエントリでは完全に暗転した状態からカメラのプレビューが再開されていましたが、今回の方法では(一瞬、暗くはなるものの)自然な流れで再開することができました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AndroidStudio 「Image Asset」の使い方

Image Assetの使い方について

Image Assetは、Androidアプリを開発する上で、簡単にデバイス上に表示するアイコンを作成できるAndroidStudioの機能です。

使い方についてまとめてみました。

まず、Image Assetのウインドウの立ち上げですが、プロジェクトウインドウ上で右クリックします。
メニューの「New」をポイントして、その中から「Image Asset」を選びます。
スクリーンショット 2021-02-24 22.46.58.png

そうすると、「Configure Image Asset」と書かれたImage Assetのウインドウが立ち上がります。
スクリーンショット 2021-02-24 22.53.51.png

主に操作するところは①「Foreground Layer」タブと、②「Background Layer」タブのところです。

①「Foreground Layer」タブではアイコンの前面部分の設定をします。
「Asset Type」のラジオボタンがImageの状態で、「Path」の右端に表示されているフォルダのアイコンをクリックすると、PC上に保存されている画像ファイルを選択できるので、画像を選びます。(前面の画像なので背景部分が透過されているPNG画像を選ぶと良いと思います)
2021-02-25_00.15.09_Image.png

画像が表示されましたが、アイコンの画像サイズが大きすぎるので、「Resize」のツマミを操作して丁度良い大きさに変更します。
2021-02-25_00.15.33_Image.png

補足ですが、「Asset Type」のClip ArtとTextは設定してもなぜか実際の端末では画像として認識されないので、使いません。

②「Background Layer」タブではアイコンの背面部分の設定をします。
「Asset Type」のラジオボタンがColorの状態で、Color横の色の付いた長方形をクリックすると「Select Color」ダイアログが表示されるので、背景にしたい色を指定してChooseをクリックします。
スクリーンショット 2021-02-24 23.20.45.png
スクリーンショット 2021-02-24 23.25.18.png
スクリーンショット 2021-02-24 23.25.37.png

「Asset Type」のラジオボタンがImageの場合は「Foreground Layer」のときと同じで、「Path」の右端に表示されているフォルダのアイコンをクリックすると、PC上に保存されている画像ファイルを選択できるので、画像を選びます。
2021-02-25_00.15.52_Image.png

「Resize」のツマミを操作することでいずれの場合も画像サイズを調整できるので、必要に応じてサイズを変更します。

前面の画像と背面の画像を設定し終わったら、「Configure Image Asset」ウインドウ右下の「Next」ボタンをクリックします。
「Confirm Icon Path」ウインドウが表示されますが、「Finish」をクリックするとアイコンの設定が完了します。
スクリーンショット 2021-02-24 23.27.22.png

実際の端末でのアイコンの状態です。
Screenshot_20210224-232837.png

「Image Asset」でアイコンを作成すると、いろいろな端末に応じた複数のアイコンサイズをまとめて作成できるので、便利ですね。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む