предотвращение частичного перекрытия обводки для рисования фигуры

#android #android-shapedrawable

#Android #android-shapedrawable

Вопрос:

Есть ли какой-либо способ предотвратить частичное перекрытие stroke на shape drawable . Я предпочитаю полностью перекрывать обводку по границам фигуры.

Вот мой xml

 <?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <padding
        android:bottom="0dp"
        android:top="0dp"
        android:left="0dp"
        android:right="0dp" />
    <solid android:color="@color/green" />
    <stroke android:color="@color/red_50"
        android:width="20dp"
        android:dashGap="2dp"
        android:dashWidth="10dp" />
</shape>
  

colors.xml

 <color name="green">#0f0</color>
<color name="red_50">#8f00</color>
  

И вот что достигнуто
Пример изображения

Как вы можете видеть, обводка перекрывает сплошную часть на 50%, но я хочу, чтобы это было на 100%.

Ответ №1:

Попробуйте разделить ее на две фигуры — одну для штриха и одну для прямоугольника. В этом решении я манипулирую размером прямоугольника, чтобы я мог изменить его связь с границами.

 <?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:bottom="@dimen/offset"
        android:left="@dimen/offset"
        android:right="@dimen/offset"
        android:top="@dimen/offset">

        <shape android:shape="rectangle">
            <solid android:color="@color/green" />
        </shape>

    </item>

    <item>

        <shape android:shape="rectangle">
            <stroke
                android:width="20dp"
                android:color="@color/red_50"
                android:dashGap="2dp"
                android:dashWidth="10dp" />
        </shape>

    </item>

</layer-list>
  

Вы можете настроить смещение, чтобы получить внешний или внутренний обвод.

Внешний и внутренний обводки

Эти значения получены из-за разницы размеров прозрачного прямоугольника (слой обводки) и зеленого. В вашем случае они будут 20dp или отсутствуют.

Комментарии:

1. В случае B заполнение заполненного прямоугольника не равно нулю? Поскольку нет обводки для размещения.

2. @EugenPechanec Если смещения нет, мы получаем результат, показанный в вопросе — зеленый прямоугольник начинается с половины ширины обводки . Вот почему мы должны увеличить ее границы на это значение (путем вычитания ‘ заполнения ‘).

3. Но весь смысл вашего поста в том, что зеленый прямоугольник не имеет обводки , поэтому он заполняет всю доступную область, следовательно, не нуждается в отрицательном смещении, не так ли? (Т.Е. если вам нужно сместить зеленый прямоугольник на 20dp, чтобы приспособиться к обводке шириной 20dp, тогда вам нужно смещение 20-20 = 0dp, чтобы нарисовать зеленый под обводкой.)

4. @EugenPechanec Ты прав. Я отредактировал ответ. Согласны ли вы с этим сейчас? Я пропустил это во время тестирования — это выглядело правильно, но на самом деле ваше предложение правильное 🙂

5. Да, теперь выглядит неплохо. (Примечание: В оригинале было бы 10dp дополнительного зеленого пространства вокруг вида, если бы оно было у его родителя android:clipChildren="false" .)