
Copyright © Google
Drawableの色(tint)を動的に設定したい
DBから読みだしたカラーコードをDrawableの色として設定したいな~ってシチュエーションがあったので適当に実装しました
方法は2種類思いついたので両方残しておきます
(1) imageTintListプロパティを使用する
Kotlin(or Java)のコード側から設定する場合は、imageTintListプロパティを使用します
val accentColor: Int = 0xFFFFFF
imageView.imageTintList = let {
val selectorArray = arrayOf(intArrayOf(0))
val colorArray = intArrayOf(accentColor)
ColorStateList(selectorArray, colorArray)
}
ImageViewのプロパティには、(レイアウトファイルの)tint属性に対応するようなものが見当たりませんでした
その為このようなちょっと回りくどい書き方になってしまっています
(2) データバインディングで値をセットする
何でこんな単純なことに気づかなかったのか・・・
やってることは単純です
レイアウトファイルに変数を置いておいてその値をtintに設定するだけです
(データバインディングの使用方法はここでは省略します)
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="accentColor"
type="int" />
</data>
...
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="@drawable/example"
app:tint="@{accentColor}" />
...
Activity側ではビューバインディングを使用するようにしておきます
binding = ActivityMainBinding.inflate(layoutInflator)
...
binding.accentColor = 0xFFFFFF
こっちの方がtint以外(backgroundTintとか)に対しても設定できるので良い気がする