以编程方式更改图层列表中形状的颜色

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));

【讨论】:

以上是关于以编程方式更改图层列表中形状的颜色的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式更改图层列表可绘制项的底部属性

使用 iOS6 中的新地图,是不是可以更改图层的颜色(公园、水、建筑物)

如何以编程方式更改背景颜色而不影响边框?

在 matplotlib 中优雅地更改图框的颜色

Android-以编程方式获取列表视图(项目)的背景颜色

如何以编程方式从Android上的渐变中获取颜色列表