#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"
.)