web-dev-qa-db-ja.com

Android図形の色をプログラムで設定します

質問をより簡単にするために編集していますが、それが正確な回答に役立つことを願っています。

次の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>

アクティビティクラス内からプログラムで色を設定するにはどうすればよいですか?

135
Cote Mounyo

backgroundColorDrawableのインスタンス。 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からロードされたドロアブルは同じ状態を共有します。)

221
Vikram

次のようにします:

    ImageView imgIcon = findViewById(R.id.imgIcon);
    GradientDrawable backgroundGradient = (GradientDrawable)imgIcon.getBackground();
    backgroundGradient.setColor(getResources().getColor(R.color.yellow));
41
Leonly91

最近の簡単な解決策は、図形を背景として使用し、プログラムで色を変更することです。

view.getBackground().setColorFilter(Color.parseColor("#343434"), PorterDuff.Mode.SRC_OVER)

編集:

コメントで誰かが正しく指摘したように、背景に角が丸い場合など、代わりにPorterDuff.Mode.SRC_ATOPを使用できます。

公式ドキュメントはこちら さまざまなPorterDuff.Modeオプションの詳細.

15
George

これを試して:

 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

ヘルプを願っています。

13
androidqq6

これが同じ問題を抱えている人の助けになることを願っています

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);
12
medhdj

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");
    }

}
10
Tyler Pfaff

この質問はしばらく前に回答されましたが、kotlin拡張関数として書き直すことで近代化できます。

fun Drawable.overrideColor(@ColorInt colorInt: Int) {
    when (this) {
        is GradientDrawable -> setColor(colorInt)
        is ShapeDrawable -> Paint.color = colorInt
        is ColorDrawable -> color = colorInt
    }
}
9
Carlos Paulino

これは私のために働く解決策です...別の質問でもそれを書きました: 図形の色を動的に変更する方法?

//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)
6
user1750873

Radiusで図形を埋める簡単な方法は次のとおりです。

(view.getBackground()).setColorFilter(Color.parseColor("#FFDE03"), PorterDuff.Mode.SRC_IN);
0
SANAT

私には何も動作しませんが、色合いを設定すると、Shape Drawableで動作します

 Drawable background = imageView.getBackground();
 background.setTint(getRandomColor())

require Android 5.0 API 21

0
Sumit