Android shape 资源工具类GradientDrawable的使用说明,小坑一个

本文探讨了在Android开发中如何动态更改控件背景颜色的方法,并指出使用GradientDrawable类进行颜色更改时可能遇到的问题。当同一shape资源在多个地方被引用时,更改其中一个实例的颜色会导致所有实例的颜色都被改变。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android开发中遇到需要设置一个shape文件A做为背景颜色,在项目中需要动态的更改背景颜色,于是乎想到了使用GradientDrawable这个类来改变控件的背景颜色,使用起来很简单,前提是view的background属性为shape A

GradientDrawable gd = view.getBackground();

gd.setColor();

这样就可以实现动态改变shape的填充色

坑来了 


因为A资源不止在一个地方使用,所以在B页面将A资源的填充色改变之后,访问其他页面的时候,发现使用A资源为背景颜色的控件,背景颜色都变成了在B界面更改的颜色,所以这个GradientDrawable类在使用中,尽量避免将更改了填充色shape资源,在项目中的重复引用!

原因

GradientDrawable.setColor源码有说明

用一个单一的颜色代替一个梯度变化,来更改drawable资源

更改的颜色会影响drawable从资源加载的所有实例,建议在更改颜色之前调用

/**
 * Changes this drawable to use a single color instead of a gradient.
 * <p>
 * <strong>Note</strong>: changing color will affect all instances of a
 * drawable loaded from a resource. It is recommended to invoke
 * {@link #mutate()} before changing the color.
 *
 * @param argb The color used to fill the shape
 *
 * @see #mutate()
 * @see #setColors(int[])
 * @see #getColor
 */
public void setColor(@ColorInt int argb) {
    mGradientState.setSolidColors(ColorStateList.valueOf(argb));
    mFillPaint.setColor(argb);
    invalidateSelf();
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值