DroidKaigiのカンファレンスアプリのソースコードを見ていたら、 ProgressTimeLatch
なるものが使われており、何だろうと思い調べてみると、色々と便利なやつだったので投稿します。
端的にいうと、プログレスバーなどを使っている時に起こるチラつきを、いい感じに制御してくれるやつでした。
ProgressTimeLatchとは
調べてみると、下記のツイートで紹介されたのが最初のようです。(おそらく)
Chris Banes氏と言えば、色々ライブラリを公開されており、お世話になった方も多いのではないかと思います。
https://twitter.com/chrisbanes/status/927928428539580416
Handy class I've just wrote: ProgressTimeLatch. It's basically ContentLoadingProgressBar but works with any view https://t.co/qaMKi9ctxm
— Chris Banes (@chrisbanes) 2017年11月7日
ここで ContentLoadingProgressBar
なるもの出てきますが、そもそも ProgressTimeLatch
は ContentLoadingProgressBar
の機能をどんなViewでも手軽に使えるように作られたもののようです。
ちなみに ContentLoadingProgressBar
はSupport Libraryに入っているらしいです。(知らなかった…)
https://developer.android.com/reference/android/support/v4/widget/ContentLoadingProgressBar
どう便利なのか
アプリを作っていると、下記のようなことがあるかと思います。
- API通信などの非同期処理をする。
- 処理をしている間は、プログレスバーなどを表示して、処理中を表す。
- 処理が終了したら、プログレスバーなどを非表示にする。
あるあるの処理だと思います。
しかしながら、この処理の小さな問題として、APIの通信が一瞬で終わった場合は、プログレスバーの表示・非表示が一瞬で行われ、ユーザーとしては何かがチラついたように感じることがあるかと思います。
これをいい感じに制御してくれるのが ProgressTimeLatch
というわけです。
使い方
かなりシンプルなクラスなので、ソースコードを読めばなんとなくわかるかと思いますが、軽く解説。
( ソースコードはこちら→ https://github.com/chrisbanes/tivi/commit/96e7cae7560ffd358b8c58c47267ed1024df53f6 )
class ProgressTimeLatch(
private val delayMs: Long = 750,
private val minShowTime: Long = 500,
private val viewRefreshingToggle: ((Boolean) -> Unit)
)
コンストラクタは上記のような感じになっています。
delayMs
Viewを表示するまで遅延させる時間をセットします。
minShowTime
Viewの最低限の表示時間をセットします。
viewRefreshingToggle
Viewの表示・非表示のLambdaをセットします。
既存のコードに適用する場合は、こちらのdiffが参考になりそうです。対象のViewをラップするようにして、今まで表示・非表示を切り替えていたところで、 refreshing
を切り替える形。
いい感じに制御してくれる例
下記のような場合を想定します。
ProgressTimeLatch(delayMs = 500, minShowTime = 500) {
// ProgressBarの表示・非表示
}
・非同期処理が早く(100ms)終わった場合
→ delayMs
より小さいのでProgressBarは表示されない(チラつかない)
・非同期処理がやや早く(600ms)終わった場合
→ delayMs
より大きいのでProgressBarは表示される
→ minShowTime
が残っているので、残り時間分表示して非表示になる(チラつかない)
・非同期処理が遅く(2000ms)終わった場合
→ delayMs
より大きいのでProgressBarは表示される
→ delayMs
と minShowTime
の合計以上なので、元の処理が終わったタイミングで非表示になる(チラつかない)
という感じです。便利!
まとめ
-
ProgressTimeLatch
はチラつきをいい感じに制御してくれるやつだった - 使い方もシンプルなので、使っていきたい