- 投稿日:2021-02-25T10:00:07+09:00
続・CameraX でカメラを一時停止する方法
概要
CameraX でカメラを一時停止する方法の続きとなります。
前回の課題
androidx.camera:camera-core:1.0.0-alpha05 までは onPreviewOutputUpdateListener を使ってカメラの映像を一時停止・再開することができた。
以降のバージョンでは、onPreviewOutputUpdateListener が廃止され、一時停止・再開させる方法を検討した結果、暗転せずに一時停止から再開する方法が見つからず困っていた。検証環境
camerax-core:1.1.0-rc01
今回試したもの
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 自体が起動しません結果
前回のエントリでは完全に暗転した状態からカメラのプレビューが再開されていましたが、今回の方法では(一瞬、暗くはなるものの)自然な流れで再開することができました。
- 投稿日:2021-02-25T00:36:23+09:00
AndroidStudio 「Image Asset」の使い方
Image Assetの使い方について
Image Assetは、Androidアプリを開発する上で、簡単にデバイス上に表示するアイコンを作成できるAndroidStudioの機能です。
使い方についてまとめてみました。
まず、Image Assetのウインドウの立ち上げですが、プロジェクトウインドウ上で右クリックします。
メニューの「New」をポイントして、その中から「Image Asset」を選びます。
そうすると、「Configure Image Asset」と書かれたImage Assetのウインドウが立ち上がります。
主に操作するところは①「Foreground Layer」タブと、②「Background Layer」タブのところです。
①「Foreground Layer」タブではアイコンの前面部分の設定をします。
「Asset Type」のラジオボタンがImageの状態で、「Path」の右端に表示されているフォルダのアイコンをクリックすると、PC上に保存されている画像ファイルを選択できるので、画像を選びます。(前面の画像なので背景部分が透過されているPNG画像を選ぶと良いと思います)
画像が表示されましたが、アイコンの画像サイズが大きすぎるので、「Resize」のツマミを操作して丁度良い大きさに変更します。
補足ですが、「Asset Type」のClip ArtとTextは設定してもなぜか実際の端末では画像として認識されないので、使いません。
②「Background Layer」タブではアイコンの背面部分の設定をします。
「Asset Type」のラジオボタンがColorの状態で、Color横の色の付いた長方形をクリックすると「Select Color」ダイアログが表示されるので、背景にしたい色を指定してChooseをクリックします。
「Asset Type」のラジオボタンがImageの場合は「Foreground Layer」のときと同じで、「Path」の右端に表示されているフォルダのアイコンをクリックすると、PC上に保存されている画像ファイルを選択できるので、画像を選びます。
「Resize」のツマミを操作することでいずれの場合も画像サイズを調整できるので、必要に応じてサイズを変更します。
前面の画像と背面の画像を設定し終わったら、「Configure Image Asset」ウインドウ右下の「Next」ボタンをクリックします。
「Confirm Icon Path」ウインドウが表示されますが、「Finish」をクリックするとアイコンの設定が完了します。
「Image Asset」でアイコンを作成すると、いろいろな端末に応じた複数のアイコンサイズをまとめて作成できるので、便利ですね。