自作androidアプリ Flexible Dice
では、TextViewを動的に変更することでダイスロールを表現しています。その際に結構迷ったので備忘録的にメモします。
方法
色々調べた結果、以下のことがわかりました。
・画面更新の方法としてinvalidate()
という命令文があるが、これはどうやら更新を予約するだけのものらしい。
・その場では更新されずinvalidate()
のスレッドが終了した後(アイドル時)に画面の更新が行われる。
・そもそもinvalidate()
はステータスを更新するほとんどの命令文(set○○()
など)の際に暗黙に実行されているらしい。
結論としては、invalidate()
は書く必要がなく、別スレッドでステータスを変更して元のスレッドに戻ればよいです。
そうすれば別スレッドが終了した時点で画面の更新が行われ、変更点が反映されます。
例
Thread{ }.start()
で別スレッドを生成することができます。
例えば、下記のプログラムは Flexible Dice の左上に表示されているさいころの面と数を表すテキスト(1D10など)を動的に変更するスクリプトです。
Thread{
activity?.runOnUiThread {
val textViewDice = view.findViewById<TextView>(R.id.textView_dice)
textViewDice.text = "DICE: " + number.toString() + "D" + face.toString()
}
}.start()
アイデア次第でいろいろできそうですね。