Открытым Android ход? - PullRequest
       31

Открытым Android ход?

86 голосов
/ 11 марта 2010

Можно ли создать объект в форме Android с обводкой только на определенных сторонах?

Например, у меня есть:

<stroke 
 android:width="3dip" 
 android:color="#000000"
    android:dashWidth="10dip" 
    android:dashGap="6dip" />

Что похоже на этот CSS:

border: 3px dashed black;

Как я могу установить ход только на одной стороне? Вот как я бы сделал это в CSS:

border-left: 3px dashed black;

Как вы делаете это в Android XML?

Ответы [ 7 ]

118 голосов
/ 14 декабря 2011

Я достиг хорошего решения с этим:

<?xml version="1.0" encoding="utf-8"?>

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- This is the line -->
    <item android:top="-1dp" android:right="-1dp" android:left="-1dp">
      <shape>
            <solid android:color="@android:color/transparent" />
            <stroke android:width="1dp" android:color="#ffffff" />
      </shape>
    </item>

</layer-list>

Это хорошо работает, если вам нужен прозрачный фон , но по-прежнему цвет открытого обводки (в моем случае мне нужна была только нижняя строка) Если вам нужен цвет фона, вы можете добавить цвет сплошной формы, как в ответе Maragues.

РЕДАКТИРОВАТЬ 1

Иногда для устройств с высокой плотностью использование низких значений падения может заканчиваться очень тонкими или невидимыми штрихами или расстояниями. Это может произойти и с вами при настройке разделителей ListView.

Самый простой обходной путь - использовать расстояние 1px вместо 1dp. Это сделает линию всегда видимой при любой плотности. Лучшим решением будет создание ресурсов измерений для каждой плотности, чтобы получить наилучший размер для каждого устройства.

Редактировать 2

Забавно, но я попытался использовать это 6 лет спустя и не могу получить хороший результат на устройствах Lollipop.

Вероятно, текущим решением является использование 9-патча. После всего этого времени Android должен был легко решить эту проблему.

38 голосов
/ 30 марта 2010

Я решил это, используя слой со списком, объединив две фигуры, одна из которых с высотой 1dp размещена внизу

optionscreen_bottomrectangle.xml:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- This is the line -->
<item>
      <shape>
            <solid android:color="#535353" />
      </shape>
</item>
<!-- This is the main color -->
<item android:bottom="1dp">
     <shape>
           <solid android:color="#252525" />
     </shape>
</item>
</layer-list>

Затем в файле layout / main.xml

<TextView
    android:id="@+id/bottom_rectangle"
    android:background="@drawable/optionscreen_bottomrectangle"
    android:layout_width="fill_parent"
    android:layout_height="0dp"
    android:layout_below="@id/table_options"
    android:layout_above="@id/exit_bar"/>

Который заполняет пробел между table_options и exit_bar фоном и непосредственно перед exit_bar печатает линию 1dp. Это помогло мне, надеюсь, это поможет кому-то еще.

Ответ отредактирован для размещения слоев в правильном порядке. Спасибо Алекс!

36 голосов
/ 21 августа 2015

Я знаю, что этот вопрос был опубликован давно, поэтому ответ не будет использоваться человеком, который опубликовал этот вопрос, но он все еще может помочь другим.

 <?xml version="1.0" encoding="UTF-8"?>
    <!-- inset is used to remove border from top, it can remove border from any other side-->
    <inset xmlns:android="http://schemas.android.com/apk/res/android"
        android:insetTop="-2dp"
        >
    <shape xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/rectangle">
        <stroke android:width="1dp" android:color="#b7b7b7" />
        <corners android:bottomRightRadius="5dp"  android:bottomLeftRadius="5dp"/>

        <solid android:color="#454444"/>
    </shape>
    </inset>

Используйте тег inset и задайте отрицательное значение для боковой границы, которую вы хотите удалить.

Возможные значения:

android:insetTop="-1dp" android:insetBottom="-1dp" android:insetLeft="-1dp" android:insetRight="-1dp"

30 голосов
/ 11 апреля 2013

Еще один ответ на другие ответы с использованием дополнения. Этот маленький отрывок делает границу сверху и снизу.

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- This is the line -->
    <item>
          <shape>
                <padding android:left="0dp" android:top="1dp" android:right="0dp" android:bottom="1dp"/>
                <solid android:color="#898989" />
          </shape>
    </item>
    <!-- This is the main color -->
    <item>
         <shape>
             <solid android:color="#ffffff" />
         </shape>
    </item>
</layer-list>
25 голосов
/ 13 сентября 2011

@ Ответ Марагуса задом наперед, так как нарисованные списки слоев рисуются сверху вниз (то есть последний элемент в списке рисуется сверху):

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- This is the line -->
<item>
      <shape>
            <solid android:color="#535353" />
      </shape>
</item>
<!-- This is the main color -->
<item android:bottom="1dp">
     <shape>
           <solid android:color="#252525" />
     </shape>
</item>

</layer-list>

Это эффективно заполнит форму цветом линии, затем нарисует цвет фона поверх него, оставляя последний 1dp прозрачным для цвета линии, чтобы показать сквозь.

2 голосов
/ 25 марта 2016

Я использовал следующий код.

<?xml version="1.0" encoding="UTF-8"?>
<!-- inset is used to remove border from top, it can remove border from any other side-->
<inset xmlns:android="http://schemas.android.com/apk/res/android"
    android:insetTop="-2dp" android:insetLeft="-2dp" android:insetRight="-2dp"
    >
    <shape xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/rectangle">
        <stroke android:width="1dp" android:color="@color/colorPrimary" />
        <solid android:color="#0000"/>
        <padding android:left="2dp" android:top="2dp" android:bottom="2dp" android:right="2dp"/>
    </shape>
</inset>
2 голосов
/ 07 ноября 2013
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >


<item>
    <shape android:shape="rectangle" >
        <stroke  android:width="2dp"
                 android:color="#BBBBBB" />
        <solid android:color="@android:color/transparent" />
    </shape>
</item>
<item  android:bottom="2dp" >
    <shape android:shape="rectangle" >
        <stroke  android:width="2dp"
                 android:color="@color/main_background_color" />
        <solid android:color="@android:color/transparent" />
    </shape>
</item>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...