当背景设置为可绘制时如何从按钮获取颜色

Posted

技术标签:

【中文标题】当背景设置为可绘制时如何从按钮获取颜色【英文标题】:How to get color from Button when background set as drawable 【发布时间】:2019-02-06 04:56:38 【问题描述】:

我有一个<Button/>

<Button
    android:id="@+id/btn"
    android:background="@drawable/btn_color"
    android:layout_
    android:layout_ />

按钮背景设置为android:background="@drawable/btn_color",其中btn_color

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle"
    android:padding="10dp">
    <solid android:color="#FF0000"/>
    <corners android:radius="10dp"/>
</shape>

我需要在我的代码中获取按钮的颜色#FF0000。我试过的是

val drawable = btn.getBackground().mutate() as GradientDrawable

如何从这个 Drawable 中获取颜色?

【问题讨论】:

测试用例ColorDrawable buttonColor = (ColorDrawable) button.getBackground();***.com/a/13748610/7666442 @NileshRathod 它给出了 GradientDrawable 不能转换为 ColorDrawable 的异常 你应该使用ShapeDrawable而不是GradientDrawable @MuzammilHusnain 你能告诉我更多关于如何在这里使用 ShapeDrawable 【参考方案1】:

试试:

val color = (btn.background as? ShapeDrawable)?.paint.color

【讨论】:

java.lang.ClassCastException: android.graphics.drawable.GradientDrawable cannot be cast to android.graphics.drawable.ShapeDrawable: Ljava/lang/ClassCastException; 异常来了【参考方案2】:

为什么不将 Drawable 转换为 Bitmap(链接:How to convert a Drawable to a Bitmap?),然后将 Pixel 放在它的中心?不是最快的方式,而是最兼容的方式之一(因为渐变、颜色或其他类型的 Drawable 都被展平为兼容的位图,您不需要处理这些差异)

【讨论】:

【参考方案3】:

用途:

val color = (btn.background as? GradientDrawable)?.color?.defaultColor

编辑

但是getColor() 仅适用于 API 24 及更高版本。你应该检查Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.N

val color = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) 
    (btn.background as? GradientDrawable)?.color?.defaultColor
 else null

【讨论】:

它正在抛出java.lang.NoSuchMethodError : Method not found: MemberDescription(ownerInternalName = android/graphics/drawable/GradientDrawable, name = getColor, desc = ()Landroid/content/res/ColorStateList;, isStatic = false)

以上是关于当背景设置为可绘制时如何从按钮获取颜色的主要内容,如果未能解决你的问题,请参考以下文章

java改变按钮颜色

如何从 SecondView 中获取选定的背景颜色以传递给 FirstView?

java 编程 背景颜色的改变

iOS:当视图背景颜色为清晰颜色时,图层背景颜色不显示

如何更改 UITableViewCell 编辑按钮背景颜色?

qt中如何修改按钮的背景颜色?