ProgressBarでちょっとハマった
こんなの作りたかった
残り時間を表すやーつ
うん。ProgressBarで作れそう…!とやってみた。
ProgressBarおさらい。
ProgressBar | Android Developers
種類
- Determinate Progress:特定量の進行状況を表すときに用いる
- Indeterminate Progress(default):不特定量の進行状況を表すときに用いる
よく見るのはくるぐるぐるしてるやーつ
ハマったその1
ろくにdocument読まずに形で見てIndeterminate Progress
だろうと実装してみて、数値とかそれっぽく書いて実行してみたら、
・・・・ぐるぐるし続ける…!?
じゃCustomView作るしか…?汗
と思ってたけど以下のようにDeterminate Progress
で、背景の設定を円形にすれば良いらしい。
<ProgressBar style="?android:attr/progressBarStyleHorizontal" android:layout_width="36dp" android:layout_height="36dp" android:background="@drawable/bg_progress"★全体時間描画(グレーの部分)設定 android:progressDrawable="@drawable/circle_progress"★残り時間の描画設定 android:rotation="90"// 描画角度(最初は@drawable/circle_progressの中で設定していたがrecyclerViewの中でうまく動かない問題があったためこちらで指定) android:scaleX="-1" android:max="100"// MAX値 android:progress="40"// 進行値 />
2つに分けずともprogressDrawable
にlayer-list
で書いたものをいっぺんに指定することも可能。
だけど今回は色を時間に応じて変えたかったため分けた。
<!-- bg_progress.xmll --> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="ring" android:thickness="5dp"// 線の太さ android:useLevel="false"> <solid android:color="@color/gray" /> </shape>
<!-- circle_progress.xml --> <shape android:shape="ring" android:thickness="5dp" android:useLevel="true"> <solid android:color="@color/green" /> </shape>
ハマったその2
progressの色を時間に応じて変えたかったのでBindingAdapter
でprogressDrawable
を設定してみたらなぜか動かない。。
結論、順番入れ替えたら動いた・・・。
<!-- うごかない -->
android:progress="@{result.progress}"
app:progressDrawable="@{result.progress}"
<!-- うごいた-->
app:progressDrawable="@{result.progress}"
android:progress="@{result.progress}"
うーーん。。これフォーマッターにかけると入れ替わっちゃうんですよね泣
<!-- ちなみにBindingAdapter使わず直指定だとうごく。。-->
android:progress="@{result.progress}"
android:progressDrawable="@drawable/circle_progress_green"
xmlじゃなくてプログラム上からも同様で、progressDrawableを設定後にprogressを設定しなきゃうまく反映されない模様。。
なのでProgressBar側の仕様ってことなのかな;時間ある時src追ってみます。
勿論ご存知の方いらっしゃれば教えてください🙏🙇