以编程方式更改图层列表中形状的颜色
Posted
技术标签:
【中文标题】以编程方式更改图层列表中形状的颜色【英文标题】:Programmatically change color of shape in layer list 【发布时间】:2015-11-16 18:59:50 【问题描述】:如何 (#000000
)?
这是我的图层列表:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="#000000" /> // CHANGE THIS COLOR
</shape>
</item>
<item android:left="5dp">
<shape android:shape="rectangle">
<solid android:color="@color/bg" />
</shape>
</item>
</layer-list>
【问题讨论】:
可能重复:***.com/questions/20705992/… Suhail Mehta 给出了详细的回答。并且还解释了如何设置单项形状颜色。应该接受答案 【参考方案1】:<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/gradientDrawble"> // Give id
<shape android:shape="rectangle">
<solid android:color="#000000" /> // CHANGE THIS COLOR
</shape>
</item>
<item android:left="5dp">
<shape android:shape="rectangle">
<solid android:color="@color/bg" />
</shape>
</item>
</layer-list>
然后在你的代码中添加
LayerDrawable layerDrawable = (LayerDrawable) getResources()
.getDrawable(R.drawable.my_drawable);
GradientDrawable gradientDrawable = (GradientDrawable) layerDrawable
.findDrawableByLayerId(R.id.gradientDrawble);
gradientDrawable.setColor(color); // change color
2016 年 10 月更新
getDrawable()
现已弃用,您应该改用 ContextCompat.getDrawable(context, color)
。
此外,如果您通过findDrawableByLayerId()
获得LayerDrawable
,则必须调用view.setBackground(layerDrawable)
才能生效。或者,通过view.getBackground()
实例化layerDrawable
也可以。
【讨论】:
getDrawable()
已弃用。还有其他方法吗?
@user 只需使用 ContextCompat.getDrawable()
有什么理由只在我重新启动我的活动时才有效(例如,使用Instant Run
)?
这是正确答案。另一个选项是gradientDrawable.setColorFilter(color, PorterDuff.Mode.SRC_IN);
,其中color
是已解析的颜色,例如Color.BLACK
【参考方案2】:
首先您需要为您分配 id layer-list
item。
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- First assign id to the list item-->
<item android:id="@+id/your_shape">
<shape android:shape="rectangle">
<solid android:color="#000000" />
</shape>
</item>
<item android:left="5dp">
<shape android:shape="rectangle">
<solid android:color="@color/bg" />
</shape>
</item>
</layer-list>
然后通过 id 获取你的形状。
LayerDrawable shape = (LayerDrawable) getResources().getDrawable(R.drawable.your_shape)
你可以通过调用来改变你的形状的颜色
shape.setColor(Color.Black); // changing to black color
编辑
getDrawable()
已被弃用。使用以下代码行。
LayerDrawable shape = (LayerDrawable) ContextCompat.getDrawable(YourActivity.this,R.drawable.your_shape)
【讨论】:
getDrawable()
已弃用。
对我来说,如果我在拥有它的小部件上获取带有 getBackground 的图层列表而不是从资源中获取它,效果会更好
这个解决方案对我不起作用,your_shape 是一个 id 而不是可绘制的。 Suhail 的回答对我有用。
LayerDrawable drawableFile = (LayerDrawable) getResources().getDrawable(R.drawable.drawable_file_name); GradientDrawable gradientDrawable = (GradientDrawable) drawableFile.findDrawableByLayerId(R.id. your_shape);【参考方案3】:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/outer">
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<size android: android:/>
<padding android:top="3dp" android:bottom="3dp" android:right="3dp" android:left="3dp"/>
<stroke
android:
android:color="#ffffff"/>
</shape>
</item>
<item android:id="@+id/middle">
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<size android: android:/>
<padding android:top="2dp" android:bottom="2dp" android:right="2dp" android:left="2dp"/>
<stroke
android:
android:color="#ffffff"/>
</shape>
</item>
<item android:id="@+id/inner">
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<size android: android:/>
<solid
android:color="#ffffff"/>
</shape>
</item>
</layer-list>
找到你的观点
LayerDrawable layerDrawable = (LayerDrawable) yourView.getBackground();
GradientDrawable outer = (GradientDrawable) layerDrawable.findDrawableByLayerId(R.id.outer);
GradientDrawable middle = (GradientDrawable) layerDrawable.findDrawableByLayerId(R.id.middle);
GradientDrawable inner = (GradientDrawable) layerDrawable.findDrawableByLayerId(R.id.inner);
设置颜色
outer.setColor(Color.parseColor(#000000));
inner.setColor(Color.parseColor(#FFFFFF));
【讨论】:
这是对我有用的。 (我已经尝试了其他两种解决方案。)【参考方案4】:也可以获取view的drawable或者background,如下设置。
LayerDrawable layerDrawable = (LayerDrawable) view.getDrawable(); //view.getBackground()
GradientDrawable gradientDrawable = (GradientDrawable) layerDrawable
.findDrawableByLayerId(R.id.layer_list_item_id);
gradientDrawable.setColor(ContextCompat.getColor(getContext(), R.color.colorPrimary));
【讨论】:
以上是关于以编程方式更改图层列表中形状的颜色的主要内容,如果未能解决你的问题,请参考以下文章