注:background
がのインスタンスであるシナリオをカバーするように回答が更新されましたColorDrawable
。これを指摘してくれたTyler Pfaffに感謝します。
ドローアブルは楕円形で、ImageViewの背景です。
Drawable
をimageView
使用してから取得getBackground()
:
Drawable background = imageView.getBackground();
通常の容疑者と照合します。
if (background instanceof ShapeDrawable) {
// cast to 'ShapeDrawable'
ShapeDrawable shapeDrawable = (ShapeDrawable) background;
shapeDrawable.getPaint().setColor(ContextCompat.getColor(mContext,R.color.colorToSet));
} else if (background instanceof GradientDrawable) {
// cast to 'GradientDrawable'
GradientDrawable gradientDrawable = (GradientDrawable) background;
gradientDrawable.setColor(ContextCompat.getColor(mContext,R.color.colorToSet));
} else if (background instanceof ColorDrawable) {
// alpha value may need to be set again after this call
ColorDrawable colorDrawable = (ColorDrawable) background;
colorDrawable.setColor(ContextCompat.getColor(mContext,R.color.colorToSet));
}
コンパクトバージョン:
Drawable background = imageView.getBackground();
if (background instanceof ShapeDrawable) {
((ShapeDrawable)background).getPaint().setColor(ContextCompat.getColor(mContext,R.color.colorToSet));
} else if (background instanceof GradientDrawable) {
((GradientDrawable)background).setColor(ContextCompat.getColor(mContext,R.color.colorToSet));
} else if (background instanceof ColorDrawable) {
((ColorDrawable)background).setColor(ContextCompat.getColor(mContext,R.color.colorToSet));
}
nullチェックは必要ないことに注意してください。
ただし、mutate()
他の場所で使用されている場合は、変更する前にドローアブルで使用する必要があります。(デフォルトでは、XMLからロードされたドローアブルは同じ状態を共有します。)