设置机器人形状颜色编程设置机器人形状颜色编程(Set android shape color pro

2019-05-08 17:31发布

我编辑,使问题更简单,希望有助于实现一个准确的答案。

说我有以下的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>

如何设置的颜色编程,从活动类中?

Answer 1:

:答案已被更新,以覆盖场景background是一个实例ColorDrawable 。 由于泰勒百福 ,指出了这一点。

被拉伸是椭圆形,并且是ImageView的背景

获取DrawableimageView使用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));
}

需要注意的是空的检查不是必需的。

但是,你应该使用mutate()修改他们,如果他们在其他地方使用之前在绘图资源。 (默认情况下,图形的XML共享相同的状态加载。)



Answer 2:

这样做:

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


Answer 3:

试试这个:

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

为更详细检查此链接此

希望帮助。



Answer 4:

希望这能帮助别人用同样的问题

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


Answer 5:

一个简单的办法目前是使用你的形状作为背景,然后通过编程改变其颜色

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

编辑:

喜欢一个人在正确的评论中指出的,你可能想使用PorterDuff.Mode.SRC_ATOP相反,如果你的背景有圆角等。

下面是官方文档上的不同更多的细节PorterDuff.Mode ,你有选择。



Answer 6:

扩展在维克拉姆的答案,如果你着色动态视图,如回收视图中的项目,等等....那么你可能要调用发生变异()设置的颜色了。 如果你不这样做,有一个共同的绘制(即背景)也将有自己的绘制任何看法改变/彩色。

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

}


Answer 7:

这个问题得到的回答而回,但它可以通过改写为科特林扩展功能的现代化。

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


Answer 8:

这是对我的作品的解决方案......在另一个问题写以及: 如何动态地改变形状颜色?

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


Answer 9:

最简单的方法,与RADIUS服务器来填充形状是:

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


Answer 10:

没有工作,但对我来说,当我设置色调颜色它适用于形状绘制对象

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

需要的是Android 5.0 API 21



文章来源: Set android shape color programmatically