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

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

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