【问题标题】:how to set opacity on a button with a transparent background color programmatically如何以编程方式在具有透明背景颜色的按钮上设置不透明度
【发布时间】:2020-06-08 18:11:36
【问题描述】:

我正在开发一个组件库,我目前正在开发按钮组件,但是当涉及到具有透明背景颜色的禁用按钮时,我遇到了问题,android 只是将按钮设置为灰色背景颜色。

我在这里设置颜色

typeStyles.put("defaultBackgroundColor", context.getResources().getColor(R.color.color_transparent));

我在这里恢复颜色

this.mDefaultBackgroundColor = buttonType.styles.get("defaultBackgroundColor");

我有几种类型的按钮,所以每个按钮都有不同的配置。

导致我出现问题的按钮如下

图像按钮是一个处于禁用状态且背景透明的按钮,问题是它在按钮上设置了灰色。

我在这里设置不透明度。

int mColor = mDefaultBackgroundColor;
byte factor = 125;
float alpha = getResources().getFloat(R.dimen.opacity_intense);
float2ByteArray(alpha);
int color = (factor << 24) | (mColor & 0x00ffffff);
disabledDrawable.setColor(color);
disabledDrawable.setStroke(mBorderWidth, mDefaultBackgroundColor);
if (!mEnabled)
    this.setAlpha(.5f);

【问题讨论】:

  • 背景颜色由选择器定义。禁用状态是其中一种状态。
  • 红色背景的按钮正常工作,只有透明背景的按钮不工作。

标签: java android


【解决方案1】:

我终于设法解决了这个问题。 我修改了下面的代码行。

int mColor = mDefaultBackgroundColor;
        int color = mColor;
        disabledDrawable.setColor(color);
        disabledDrawable.setStroke(mBorderWidth, mBorderColor);
        if (!mEnabled)
            this.setAlpha(.5f);

以前是这样的

int mColor = mDefaultBackgroundColor;
byte factor = 125;
float alpha = getResources().getFloat(R.dimen.opacity_intense);
float2ByteArray(alpha);
int color = (factor << 24) | (mColor & 0x00ffffff);
disabledDrawable.setColor(color);
disabledDrawable.setStroke(mBorderWidth, mDefaultBackgroundColor);
if (!mEnabled)
   this.setAlpha(.5f);

这是结果

expected result

【讨论】:

    【解决方案2】:

    在材质组件库中,这是一个方法(它至少需要版本1.2.0-beta01):

    MaterialColors.compositeARGBWithAlpha(color, alpha);
    

    否则你可以使用androidx.core.graphics.ColorUtils类:

    ColorUtils.setAlphaComponent(originalARGB, alpha);
    

    例子:

    int color = ColorUtils.setAlphaComponent(
               ContextCompat.getColor(this,R.color....),xx);
    
    int color = MaterialColors.compositeARGBWithAlpha(
               ContextCompat.getColor(this,R.color....),xx);
    

    【讨论】:

    • 谢谢,我已经设法解决了。我发布了下面代码的解决方案。
    猜你喜欢
    • 2018-05-18
    • 2011-12-22
    • 1970-01-01
    • 2014-03-22
    • 2019-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    相关资源
    最近更新 更多