0

我创建了一个带有半透明边框的相当简单的 shapedrawable,并将其用作两个相邻视图的背景。

如果 srtoke 颜色是部分透明的,我期待一个实心笔触(如右图),但我得到的是一个模糊的笔触(左图)。

我做错了什么?

实际与预期

(图片取自ADT预览,在模拟器中效果更加明显)

这是 ShapeDrawable ( theme_base_bg_framed.xml):

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid
        android:color="@color/base_frame_solid_color"
        />
    <stroke
        android:width="@dimen/frame_border_size"
        android:color="@color/base_frame_border_color"
        />
    <padding
        android:left="@dimen/frame_padding_size"
        android:top="@dimen/frame_padding_size"
        android:right="@dimen/frame_padding_size"
        android:bottom="@dimen/frame_padding_size"
        />
</shape>

它使用这些颜色和尺寸定义:

<color name="base_frame_solid_color">#20ffffff</color>
<color name="base_frame_border_color">#40ffffff</color>

<dimen name="frame_border_size">2dp</dimen>
<dimen name="frame_padding_size">2dp</dimen>

两个drawable都分配给Views背景

<style name="ViewWithBorder">
    <item name="android:background">@drawable/theme_base_bg_framed</item>
</style>

编辑:

ShapeDrawable 中使用的颜色带有字母是有原因的。背景中的视图将包含其他视图和/或图像。这是我得到的(左)和我期望得到的(右)的一个更好的例子。

在此处输入图像描述

4

2 回答 2

1

我使用这些值来获得您想要的结果:colors.xml:

<color name="base_frame_solid_color">#20000000</color>
<color name="base_frame_border_color">#40ffffff</color>

形状:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid
        android:color="@color/base_frame_solid_color"
        />
    <stroke
        android:width="@dimen/frame_border_size"
        android:color="@color/base_frame_border_color"
        />
</shape>

希望这可以帮助!

于 2014-07-12T09:51:07.717 回答
0

好的,我发现了正在发生的事情以及如何解决它。

似乎Android在用边框填充ShapeDrawable时不会将其填充到完整大小,而只是填充到笔划的中间。因此,以 2dp 的笔划,它会在周围留下 1dp 的空间。只有在使用 alphaed 边框时才能注意到这一点,就像我正在做的那样,因为通常边框会覆盖它。

为了解决这个问题,我使用了一个包含两个 ShapeDrawables 的 LayerList drawable,一个用于纯色(没有边框),一个用于描边(没有纯色):

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape
            android:shape="rectangle">
            <solid
                android:color="@color/base_frame_solid_color"
                />
        </shape>
    </item>
    <item>
        <shape
            android:shape="rectangle">
            <stroke
                android:width="@dimen/frame_border_size"
                android:color="@color/base_frame_border_color"
                />
            <padding
                android:left="@dimen/frame_padding_size"
                android:top="@dimen/frame_padding_size"
                android:right="@dimen/frame_padding_size"
                android:bottom="@dimen/frame_padding_size"
                />
        </shape>
    </item>
</layer-list>

它可以工作,但是作为叠加到“纯色”背景的边框,它的颜色需要一些调整。

于 2014-07-12T11:17:38.200 回答