質問をより簡単にするために編集していますが、それが正確な回答に役立つことを願っています。
次のoval
形状があるとします。
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:shape="oval">
<solid Android:angle="270"
Android:color="#FFFF0000"/>
<stroke Android:width="3dp"
Android:color="#FFAA0055"/>
</shape>
アクティビティクラス内からプログラムで色を設定するにはどうすればよいですか?
注:background
がColorDrawable
のインスタンス。 Tyler Pfaff 、これを指摘してくれてありがとう。
ドロアブルは楕円形で、ImageViewの背景です
getBackground()
を使用して、Drawable
からimageView
を取得します。
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からロードされたドロアブルは同じ状態を共有します。)
次のようにします:
ImageView imgIcon = findViewById(R.id.imgIcon);
GradientDrawable backgroundGradient = (GradientDrawable)imgIcon.getBackground();
backgroundGradient.setColor(getResources().getColor(R.color.yellow));
最近の簡単な解決策は、図形を背景として使用し、プログラムで色を変更することです。
view.getBackground().setColorFilter(Color.parseColor("#343434"), PorterDuff.Mode.SRC_OVER)
編集:
コメントで誰かが正しく指摘したように、背景に角が丸い場合など、代わりにPorterDuff.Mode.SRC_ATOP
を使用できます。
公式ドキュメントはこちら さまざまなPorterDuff.Mode
オプションの詳細.
これを試して:
public void setGradientColors(int bottomColor, int topColor) {
GradientDrawable gradient = new GradientDrawable(Orientation.BOTTOM_TOP, new int[]
{bottomColor, topColor});
gradient.setShape(GradientDrawable.RECTANGLE);
gradient.setCornerRadius(10.f);
this.setBackgroundDrawable(gradient);
}
詳細については、このリンクを確認してください this
ヘルプを願っています。
これが同じ問題を抱えている人の助けになることを願っています
GradientDrawable Gd = (GradientDrawable) YourImageView.getBackground();
//To shange the solid color
Gd.setColor(yourColor)
//To change the stroke color
int width_px = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, youStrokeWidth, getResources().getDisplayMetrics());
Gd.setStroke(width_px, yourColor);
Vikram's answerを展開します。リサイクラービューアイテムなどの動的ビューを色付けする場合は、おそらく、色を設定する前にmutate()を呼び出します。これを行わない場合、共通のドローアブル(つまり、背景)を持つビューでも、ドローアブルが変更/色付けされます。
public static void setBackgroundColorAndRetainShape(final int color, final Drawable background) {
if (background instanceof ShapeDrawable) {
((ShapeDrawable) background.mutate()).getPaint().setColor(color);
} else if (background instanceof GradientDrawable) {
((GradientDrawable) background.mutate()).setColor(color);
} else if (background instanceof ColorDrawable) {
((ColorDrawable) background.mutate()).setColor(color);
}else{
Log.w(TAG,"Not a valid background type");
}
}
この質問はしばらく前に回答されましたが、kotlin拡張関数として書き直すことで近代化できます。
fun Drawable.overrideColor(@ColorInt colorInt: Int) {
when (this) {
is GradientDrawable -> setColor(colorInt)
is ShapeDrawable -> Paint.color = colorInt
is ColorDrawable -> color = colorInt
}
}
これは私のために働く解決策です...別の質問でもそれを書きました: 図形の色を動的に変更する方法?
//get the image button by id
ImageButton myImg = (ImageButton) findViewById(R.id.some_id);
//get drawable from image button
GradientDrawable drawable = (GradientDrawable) myImg.getDrawable();
//set color as integer
//can use Color.parseColor(color) if color is a string
drawable.setColor(color)
Radiusで図形を埋める簡単な方法は次のとおりです。
(view.getBackground()).setColorFilter(Color.parseColor("#FFDE03"), PorterDuff.Mode.SRC_IN);
私には何も動作しませんが、色合いを設定すると、Shape Drawableで動作します
Drawable background = imageView.getBackground();
background.setTint(getRandomColor())
require Android 5.0 API 21