Односторонний Android-ход?

Можно ли создать объект формы 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?

Ответ 1

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

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

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

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

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

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

Изменить 2

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

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

Ответ 2

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

Ответ отредактирован, чтобы разместить слои в правильном порядке. спасибо Alex!

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

Ответ на

@Maragues обратный, поскольку draw-draw для слоя-слоя рисует сверху вниз (это означает, что последний элемент в списке нарисован сверху):

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

Ответ 6

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

Ответ 7

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

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