【Android Pie】Auto-rotate (自動回転) OFF のときの挙動

「Auto-rotate (自動回転)」 機能は、ON にしてますか?

ONにすると画面を自動回転してくれてます。

画面を縦長で見てるときに、

端末を横向きにすると、自動で回転してくれます。

しかし、寝転んでスマホ画面を見る場合、視線の方向と直角に向いてしまいます。

私たちを見てくれているのではなく、地球に合わせて自動回転していたのです。

また、意図しない回転を始めることが多く、回転終了までにも時間がかかるので、私は、OFF にして縦に固定していました。

しかし、たまに横長の画面で見たくなる場合があります。

そんなときは、以下の手順です。

1. 通知バーから Auto-rotate を ON にする。
2. 端末を横に向ける。
3. 画面が自動回転して横長になる。
4. だが、横長画面にならないアプリもある。
5. Auto-rotate を OFF にする。
6. だが、今度は横長画面で固定されてる。

面倒ですよね。

これを寝転がった状態でやろうとするとかなり辛いものがあります。

このことを解消してくれる機能が、Android Pie にあります。

ナビゲーションバーを Pieスタイルに変更したら試してみましょう。

【Android Pie】ナビゲーションバー の ホームボタン を ピル型 にする方法

端末が回転されたとき、表示しているアプリが回転可能なものであれば、ナビゲーションバーの右側に、「回転しますか?」的に数秒間だけボタンを表示して提案してくれます。


回転するならタップ、しないなら無視で画面はそのままです。

端末を回転させたとき、回転の提案ボタンが表示されるのは、以下の条件が必要なようです。

- アプリが回転可能 (orientation の指定なし)
- 端末設定の Auto-rotate 機能が OFF

まとめ?

「Auto-rotate(自動回転)機能」をONにする場面はどんなとき?

Android 9 Pie 使ってみた
【Android Pie】ナビゲーションバー の ホームボタン を ピル型 にする方法
【Android Pie】Google Digital Wellbeing を使う
【Android Pie】Auto-rotate (自動回転) OFF のときの挙動
【Android Pie】使いやすくなった音量設定
【Android Pie】スクリーンショット取得→編集 は「電源ボタン長押し」から
【Android Pie】「通知」設定のシンプルな考え方
👉【公式 2018-05-07】Android Pie のバージョンシェア がやっと 10%超えている件


Fizz Buzz on Kotlin

How do you think your code structure and logic?

My policy:
– Exclude magic number "15".
– Consider dividing with a view codes and creating data codes.
– Use StringBuilder for a string combination.


(1..100).map {

  // P
  StringBuilder().apply {
    if (it % 3 == 0) append("Fizz")
    if (it % 5 == 0) append("Buzz")
    if (isEmpty()) append(it)
  }.toString()

}.forEach {

  // V
  println(it)

}


1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
...

How do you assemble standard code fragments about this common simple challenge?

Fizz buzz - Wikipedia


【Android】Kotlin でモダンな concurrency その5

ライフサイクルとコルーチン

Actor は、UI管理にも便利で、タスクのキャンセルをシンプルにし、UIスレッドのオーバーロードを避けることができます。

まず、Activity に適用する JobHolder インターフェースを作成します。これは、セットしたタスクの親となり、それのキャンセルを可能にします。


interface JobHolder {
  val job: Job
}

Activity が destroy されるときに、job.cancel() を行います。


class MyActivity : AppCompatActivity(), JobHolder {

  override val job: Job = Job() // the instance of a Job for this activity

  override fun onDestroy() {
    super.onDestroy()
    job.cancel() // cancel the job when activity is destroyed
  }
}

Extension Function にして、JobHolder の すべての View からアクセス可能にします。


val View.contextJob: Job
  get() = (context as? JobHolder)?.job ?: NonCancellable

これらを組み合わせて、setOnClick に onClick のアクションを管理させるための conflated な Actor を作らせます。複数回の連続クリックは無視され、ANR を避けることができます。

そして、これらのアクションは、contextJob のコンテキストで実行されます。

また、Activity が destroy されるとキャンセルもされます。


fun View.setOnClick(action: suspend () -> Unit) {
  val eventActor = actor<Unit>(
    context = UI,
    start = CoroutineStart.UNDISPATCHED,
    capacity = Channel.CONFLATED,
    parent = contextJob
  ) {
    for (event in channel) action()
  }
  setOnClickListener { eventActor.offer(Unit) }
}

この例では、ここでは多すぎるイベントを無視するために Channel を conflated としてセットしています。すべてをイベントキューとしたい場合は、Channel.UNLIMITED とすることができます。その場合でも ANR は発生しません。

コルーチンとライフサイクルを組み合わせて、UIタスクのキャンセルを自動化することもできます。


val LifecycleOwner.untilDestroy: Job get() {
  val job = Job()

  lifecycle.addObserver(object: LifecycleObserver {
    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    fun onDestroy() { job.cancel() }
  })
  return job
}

// 使い方
launch(UI, parent = untilDestroy) {
  // 何らかの処理
}

【Android】Kotlin でモダンな concurrency その1
【Android】Kotlin でモダンな concurrency その2
【Android】Kotlin でモダンな concurrency その3
【Android】Kotlin でモダンな concurrency その4


関連ワード:  Kotlin開発