Як намалювати межу лише на одній стороні лінійного макета?


186

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


ви можете використовувати dravableLeft у своєму макеті
njzk2

Відповіді:


359

Ви можете використовувати це для отримання межі з одного боку

<?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 для повного джерела.


5
що робити, якщо ви хочете суцільний колір на основі альфа з нижньою облямівкою? Я думав над тим, як вирішити це за допомогою api Android Dravable XML, але я не можу цього зрозуміти.
Маріо Ленчі

Це не спрацювало для мене - як не дивно, зробило зворотне, чого я хотів темнішого кольору зсередини, із сірим градієнтом, який я наклав на бордюри. Подумав над тим, щоб зробити прямокутник, який можна малювати певного розміру, щоб поставити його як елемент, який можна малювати. Це не здається настільки обтічним.
jbenowitz

@jbenowitz: Порядок елемента в списку шарів важливіший. Якщо ви зворотний, тоді ви отримаєте ці результати.
Вівек Ханделваль

Я вирішив це, додавши обведення кольором рамки та формою, що залишилася кольором кнопки. Це зробило трюк.
jbenowitz

242

Легкий, як пиріг, дозволяє прозорий 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 = верх

19
Це, безумовно, найкраща відповідь тут, занадто погано, що це не анульовано
mittelmania

11
Приємно, проте я, звичайно, не назвав би це "легким, як пиріг".
funkybro

7
Це не працює, якщо вам потрібна товста рамка або якщо вам потрібні рамки з декількох сторін.
голографічний принцип

1
@codeman - використовуйте це як тло для перегляду, тоді він успадкує його висоту.
Одід Брейнер

2
як відрегулювати штрих або ширину кордону?
Рутурай Патіл

101

також можливо реалізувати те, що ви хочете, використовуючи один шар

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


3
Це, безумовно, корисно, якщо ви маєте інший колір фону і хочете накласти цей малюнок у форматі bg межею. (y)
Aung Pyae

3
Саме те, що мені потрібно, але чи правильно використовувати негативні прокладки?
ІлляЕремін

1
Це найкраще рішення. Мене турбує, що там робить -5dp.
Аміт Кумар

1
Негативні прокладки поширені в HTML / CSS. Це просто підштовхує речі в іншому напрямку. На мій досвід, він виглядає цілком дійсним і в Android.
spaaarky21

Реалізації, що використовують негативні поля, не спрацьовують, якщо у вашому макеті є clipChildren = false або clipToPadding = false. Якщо це так, ви можете використовувати рішення з двома перекритими прямокутниками, як запропоновано
Jesús Barrera

80

Щоб отримати облямівку лише на одній стороні рисунка, застосуйте мінус 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.


4
Це найкраща відповідь ІМО
Джеймс

дуже хороша відповідь, мені просто потрібно змінити ширину і вставку на 10dp :) І більше, мені потрібна межа зліва, тому я міняю android: insetLeft на android: insetRight. Так просто! Натискання кнопки "Матеріал": D
Phuong

Саме те, що мені було потрібно, зміни insertXвгорі, щоб вирішити, які межі показати, а що ні.
CularBytes

Я навіть можу мати суцільний колір @null, і тоді цей метод не спричиняє жодного перевищення. Геніальність. Дякую!
Unknownweirdo

2
Увага: Це змістить вміст вашого перегляду, а також змінить його розмір. Використовуйте обережно.
vovahost

7

Як альтернативу (якщо ви не хочете використовувати фон), ви можете легко зробити це, зробивши подання наступним чином:

<View
    android:layout_width="2dp"
    android:layout_height="match_parent"
    android:background="#000000" />

Щоб мати лише правильну межу, розмістіть це після макета (там, де ви хочете мати межу):

<View
    android:layout_width="2dp"
    android:layout_height="match_parent"
    android:background="#000000" />

Для того, щоб мати лише ліву межу, поставте це перед макетом (там, де ви хочете мати межу):

Працював для мене ... Сподіваюся, що це допоможе ...


6

Я зміг досягти ефекту за допомогою наступного коду

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

Ви можете налаштувати свої потреби в рубежі, змінивши напрямок переміщення


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>

5

Інший чудовий приклад приклад

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<inset xmlns:android="http://schemas.android.com/apk/res/android"
     android:insetRight="-2dp">

     <shape android:shape="rectangle">
         <corners
             android:bottomLeftRadius="4dp"
             android:bottomRightRadius="0dp"
             android:topLeftRadius="4dp"
             android:topRightRadius="0dp" />
         <stroke
             android:width="1dp"
             android:color="@color/nasty_green" />
         <solid android:color="@android:color/transparent" />
     </shape>

</inset>

2

Тут не згадується про дев’ять патч- файлів. Так, ви повинні створити файл, однак це досить проста робота, і це дійсно рішення " крос-версія та підтримка прозорості ". Якщо файл розміщено в drawable-nodpiкаталозі, він працює pxна основі, і drawable-mdpiпрацює приблизно як база dp (завдяки resample).

Приклад файлу для оригінального запитання ( рамка праворуч: 1px суцільний червоний колір; ) знаходиться тут:

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

Просто помістіть його в drawable-nodpiкаталог.


2

Межі різних кольорів. Я використав 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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.