Razl-Dazl

eyecatch
Copyright © Google

Drawableの色(tint)を動的に設定したい

Posted at — 2023-06-30

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とか)に対しても設定できるので良い気がする

Author@zakuro

Mastodon: 396@vivaldi.net