Как рисовать границу только на одной стороне линейного макета?
Я могу нарисовать границу с линейной компоновкой, но она нарисована со всех сторон. Я хочу ограничить его только правой стороной, как в CSS (border-right: 1px solid red;).
Я пробовал это, но он все еще рисует со всех сторон:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item>
<shape android:shape="rectangle" >
<stroke
android:height="2dp"
android:width="2dp"
android:color="#FF0000" />
<solid android:color="#000000" />
<padding
android:bottom="0dp"
android:left="0dp"
android:right="1dp"
android:top="0dp" />
<corners
android:bottomLeftRadius="0dp"
android:bottomRightRadius="5dp"
android:radius="1dp"
android:topLeftRadius="5dp"
android:topRightRadius="0dp" />
</shape>
</item>
Любые предложения о том, как это сделать?
Кстати, я не хочу использовать взломать представление ширины 1dp на нужной стороне.
Ответы
Ответ 1
Вы можете использовать это, чтобы получить границу с одной стороны
<?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="#FF0000" />
</shape>
</item>
<item android:left="5dp">
<shape android:shape="rectangle">
<solid android:color="#000000" />
</shape>
</item>
</layer-list>
EDITED
Как и многие другие, я хотел иметь одну сторону границы с прозрачным фоном, я внедрил BorderDrawable
, который мог бы дать мне границы с разными размерами и цветом так же, как мы используем css. Но это не может быть использовано через xml. Для поддержки XML я добавил BorderFrameLayout
, в котором ваш макет может быть обернут.
Посмотрите мой github для полного источника.
Ответ 2
Легко, как пирог, позволяя прозрачный bg:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:angle="0"
android:startColor="#f00"
android:centerColor="@android:color/transparent"
android:centerX="0.01" />
</shape>
Измените угол, чтобы изменить местоположение границы:
- 0 = left
- 90 = нижний
- 180 = right
- 270 = top
Ответ 3
также возможно реализовать то, что вы хотите, используя один слой
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:bottom="-5dp"
android:right="-5dp"
android:top="-5dp">
<shape android:shape="rectangle" >
<solid android:color="@color/color_of_the_background" />
<stroke
android:width="5dp"
android:color="@color/color_of_the_border" />
</shape>
</item>
</layer-list>
Таким образом, только левая граница видна, но вы можете достичь любой комбинации, которую вы хотите, играя с атрибутами bottom
, left
, right
и top
элемента item
Ответ 4
Чтобы получить границу только на одной стороне отрисовки, примените отрицательный inset
к другим 3 сторонам (заставляя эти границы выходить за пределы экрана).
<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:insetTop="-2dp"
android:insetBottom="-2dp"
android:insetLeft="-2dp">
<shape android:shape="rectangle">
<stroke android:width="2dp" android:color="#FF0000" />
<solid android:color="#000000" />
</shape>
</inset>
![enter image description here]()
Этот подход похож на ответ на майка, но без использования layer-list
.
Ответ 5
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" >
<shape>
<solid
android:color="#f28b24" />
<stroke
android:width="1dp"
android:color="#f28b24" />
<corners
android:radius="0dp"/>
<padding
android:left="0dp"
android:top="0dp"
android:right="0dp"
android:bottom="0dp" />
</shape>
</item>
<item>
<shape>
<gradient
android:startColor="#f28b24"
android:endColor="#f28b24"
android:angle="270" />
<stroke
android:width="0dp"
android:color="#f28b24" />
<corners
android:bottomLeftRadius="8dp"
android:bottomRightRadius="0dp"
android:topLeftRadius="0dp"
android:topRightRadius="0dp"/>
<padding
android:left="10dp"
android:top="10dp"
android:right="10dp"
android:bottom="10dp" />
</shape>
</item>
</selector>
Ответ 6
В качестве альтернативы (если вы не хотите использовать фон), вы можете легко сделать это, сделав вид следующим образом:
для наличия только правой границы, поместите это после макета (где вы хотите иметь границу):
<View
android:layout_width="2dp"
android:layout_height="match_parent"
android:background="#000000"
></View>
только для левой границы, поместите это перед макетом (где вы хотите иметь границу):
<View
android:layout_width="2dp"
android:layout_height="match_parent"
android:background="#000000"
></View>
Работал для меня... Надеюсь, что это поможет...
Ответ 7
Здесь нет упоминаний о файле с девятью патчами. Да, вам нужно создать файл, но это довольно простая работа, и это действительно " кросс-версия и прозрачность с поддержкой". Если файл помещен в каталог drawable-nodpi
, он работает px
, а в drawable-mdpi
работает примерно как база dp (благодаря повторной выборке).
Пример файла для исходного вопроса (border-right: 1px solid red;) находится здесь:
http://ge.tt/517ZIFC2/v/3?c
Просто поместите его в каталог drawable-nodpi
.
Ответ 8
Бодер разного цвета. Я использовал 3 пункта ниже, это код.
<?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/colorAccent" />
</shape>
</item>
<item android:top="3dp">
<shape android:shape="rectangle">
<solid android:color="@color/light_grey" />
</shape>
</item>
<item
android:bottom="1dp"
android:left="1dp"
android:right="1dp"
android:top="3dp">
<shape android:shape="rectangle">
<solid android:color="@color/colorPrimary" />
</shape>
</item>
</layer-list>
Ответ 9
Я смог добиться эффекта с помощью следующего кода
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:left="0dp" android:right="-5dp" android:top="-5dp" android:bottom="-5dp">
<shape
android:shape="rectangle">
<stroke android:width="1dp" android:color="#123456" />
</shape>
</item>
</layer-list>
Вы можете приспособиться к вашим потребностям для пограничного положения, изменив направление перемещения