Android ShapeDrawable笔触模糊不清

时间:2014-07-12 08:54:04

标签: android shapedrawable

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

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

我做错了什么?

actual vs expected

(图像来自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都被分配到View的背景

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

编辑:

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

enter image description here

2 个答案:

答案 0 :(得分: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>

希望这有帮助!

答案 1 :(得分:0)

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

似乎Android在填充带边框的ShapeDrawable时,并没有将其填充到它的全尺寸,而只是填充到笔划的中间位置。因此,如果行程为2dp,则会在周围留出1dp的空间。只有在使用字母边框时才会注意到这一点,就像我正在做的那样,因为通常边框覆盖它。

为了解决这个问题,我使用了一个包含两个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>

它有效,但是作为边界叠加在&#34; solid&#34;背景,它的颜色需要一些调整。