以编程方式获取视图的背景资源

时间:2019-02-12 07:05:01

标签: android xml

在问这个问题之前我已经进行了研究,但是建议的答案对我没有用。

我的colors.xml文件中列出了很多颜色,如下所示:

<color name="material_red">#F44336</color>
<color name="material_orange">#FF5722</color>
<color name="material_yellow">#FFC107</color>

在我的主布局中,将一个应用于背景,如下所示:

<RelativeLayout
 ….
 android:background="@color/material_blue"/>

我需要以编程方式获取布局的确切颜色类型,这是我到目前为止已经尝试过的颜色:

RelativeLayout relativeLayout = findViewById(…);
Drawable layoutDrawable = relativeLayout.getBackground();

String layoutColor;
if(layoutDrawable instanceOf ColorDrawable){
     int color = ((ColorDrawable)layoutDrawable).getColor(); 
     layoutColor = Integer.toHexString(color); 
}

但是结果是这样的:ff2196f3

如何获得准确的十六进制值或应用的颜色资源中的颜色?

4 个答案:

答案 0 :(得分:0)

ff2196f3几乎就是您想要的,但不包括造成 opacity 的第一个字节。这样,您的颜色就是2196f3 + ff,因为它是不透明的。


您无法获取颜色资源,因为它不一定是颜色资源,因此可以在没有颜色资源的情况下对其进行动态设置。但是,如果需要,您可以遍历颜色资源并将其与所获得的颜色进行比较。

答案 1 :(得分:0)

尝试一下

String hexColor = "#" + layoutColor.substring(2, layoutColor.length());
Log.e("MainActivity.java", "The hex color is-" + hexColor);

答案 2 :(得分:0)

这很可能是重复的,并且已经here得到了答复。

Android颜色整数是Android上颜色的最常见表示形式,根据文档,它总是使用4个成分(Alpha,红色,绿色,蓝色)在sRGB空间中定义颜色。因此,字符串中的前两位数字是Alpha通道。但是,根据@Josh的建议,您可以通过屏蔽获得后6位数字:

if(layoutDrawable instanceof ColorDrawable){
    int color = ((android.graphics.drawable.ColorDrawable)layoutDrawable).getColor();
    layoutColorWithoutAlpha = String.format("#%06X", (0xFFFFFF & color));
}

答案 3 :(得分:-1)

要获取布局的背景色:

LinearLayout lay = (LinearLayout) findViewById(R.id.lay1);
ColorDrawable viewColor = (ColorDrawable) lay.getBackground();
int colorId = viewColor.getColor();

如果它是RelativeLayout,则只需找到其ID并使用那里的对象而不是LinearLayout。