Как нарисовать границу только на одной стороне линейного макета?

Я могу нарисовать границу с линейной компоновкой, но она нарисована со всех сторон. Я хочу ограничить его только правой стороной, как в 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 на требуемой стороне.

Solutions Collecting From Web of "Как нарисовать границу только на одной стороне линейного макета?"

Вы можете использовать это, чтобы получить границу с одной стороны

 <?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> 

РЕДАКТИРОВАНИЕ

Поскольку многие, включая меня, хотели иметь одну боковую границу с прозрачным фоном, я BorderDrawable который мог бы дать мне границы с разными размерами и цветом так же, как мы используем css. Но это не может быть использовано через xml. Для поддержки XML я добавил BorderFrameLayout в котором ваш макет может быть обернут.

См. Мой github для полного источника.

Легко, как пирог, позволяя прозрачный 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 = слева
  • 90 = нижний
  • 180 = правый
  • 270 = верх

Также возможно реализовать то, что вы хотите, используя один слой

 <?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 элемента

Чтобы получить границу только на одной стороне отрисовки, примените отрицательную 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> 

Введите описание изображения здесь

Такой подход похож на ответ Найки, но без использования layer-list .

В качестве альтернативы (если вы не хотите использовать фон), вы можете легко сделать это, сделав следующее:

Для того, чтобы иметь только правую границу, поместите это после макета (где вы хотите иметь границу):

  <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> 

Работал для меня … Надеюсь, что это поможет …

 <?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> 1 <?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> 

Здесь нет упоминания об файлах с девятью патчами . Да, вам нужно создать файл, однако это довольно простая работа, и это действительно « кросс-версия и поддержка прозрачности ». Если файл помещен в каталог drawable-nodpi , он работает на основе px , а в drawable-mdpi работает примерно как база dp (благодаря повторной выборке).

Пример файла для исходного вопроса ( border-right: 1px solid red; ) находится здесь:

http://ge.tt/517ZIFC2/v/3?c

Просто поместите его в каталог drawable-nodpi .

Boder разного цвета. Я использовал 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> 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="@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> 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="@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> 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="@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> 

Я смог добиться эффекта с помощью следующего кода

 <?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> 

Вы можете приспосабливаться к вашим потребностям в пограничном положении, изменяя направление перемещения