当背景设置为可绘制时如何从按钮获取颜色
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 >= 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)
以上是关于当背景设置为可绘制时如何从按钮获取颜色的主要内容,如果未能解决你的问题,请参考以下文章
如何从 SecondView 中获取选定的背景颜色以传递给 FirstView?