참고 : 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에서로드 된 드로어 블은 동일한 상태를 공유합니다.)