Стиль нижней строки в Android

120

Мне нужно создать фигуру андроида, чтобы только нижняя часть имела обводку (пунктирная линия). Когда я пробую следующее, обводка делит фигуру пополам по центру. Кто-нибудь знает, как правильно сделать? обводка должна быть нижней линией / границей. Я использую фигуру в качестве фона для TextView. Пожалуйста, неважно, зачем мне это нужно.

<?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="#1bd4f6" />
        </shape>
    </item>

    <item>
        <shape android:shape="line" >
            <padding android:bottom="1dp" />

            <stroke
                android:dashGap="10px"
                android:dashWidth="10px"
                android:width="1dp"
                android:color="#ababb2" />
        </shape>
    </item>

</layer-list>
Cote Mounyo
источник
2
Зачем мне искать в вашем проекте git что-то настолько простое? Вы ищете хиты для этого проекта?
Cote Mounyo 08
просто из любопытства, почему вы используете px для указания размеров тире?
Jose_GD 05

Ответы:

313

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

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item>
        <shape android:shape="rectangle" >
            <solid android:color="#1bd4f6" />
        </shape>
    </item>

    <item android:top="-2dp" android:right="-2dp" android:left="-2dp">
        <shape>
            <solid android:color="@android:color/transparent" />
            <stroke
                android:dashGap="10px"
                android:dashWidth="10px"
                android:width="1dp"
                android:color="#ababb2" />
        </shape>
    </item>

</layer-list>

Объяснение:

Вторая форма - прозрачный прямоугольник с пунктирным контуром. Ключ к тому, чтобы граница отображалась только внизу, заключается в отрицательных полях, установленных на других сторонах. Эти отрицательные поля «выталкивают» пунктирную линию за пределы нарисованной области с этих сторон, оставляя только линию внизу. Один потенциальный побочный эффект (который я не пробовал) заключается в том, что для представлений, которые рисуются за пределами своих границ, границы с отрицательными полями могут стать видимыми.

Krylez
источник
5
Действительно умно. Мне потребовалось некоторое время, чтобы понять, что делает эту работу разницей в 1 dp (по абсолютной величине) между верхним, правым и левым
краями
5
Это работает отлично, но не мог бы кто-нибудь дополнить ответ объяснением математики в этом (для бедных душ вроде меня и всех, кто прибудет сюда в ближайшие дни) :)
source.rar
Прекрасно работает. И вы даже можете использовать селектор, который указывает на список слоев xmls в зависимости от состояния. Я должен был это выяснить, и он тоже работает.
Dacker 03
Не вводите ненужную перерисовку. Я думаю, что решение @Anonan лучше. Попробуйте изменить его под свои нужды.
Влад
44

Это трюк ...

<item >
    <shape android:shape="rectangle">
        <solid android:color="#YOUR_BOTTOM_LINE_COLOR"/>
    </shape>
</item>

<item android:bottom="1.5dp">
    <shape android:shape="rectangle">
        <solid android:color="#YOUR_BG_COLOR"/>
    </shape>
</item>
Йонгз Пуангпут
источник
Два прямоугольника перекрывают друг друга и добавляют нижнее пространство, чтобы показать другой цвет в виде линии. так что вы можете применить это, чтобы поступить иначе
Jongz Puangput
3
Хороший ответ, но с избыточной перерисовкой
Лестер
и также не будет работать, если у вас есть цвета с альфа
Дирк
43
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:top="-6dp"
        android:left="-6dp"
        android:right="-6dp"
        android:bottom="0dp">

        <shape android:shape="rectangle">
            <solid android:color="#88FFFF00"/>
            <stroke
                android:width="5dp"
                android:color="#FF000000"/>
        </shape>
    </item>
</layer-list>
Anonan
источник
У меня отлично сработало! Спасибо.
hetsgandhi
19

Этот ответ предназначен для тех, кто ищет в Google, кто хочет показать пунктирную нижнюю границу EditTextкак здесь

образец

Создайте dotted.xmlвнутреннюю drawableпапку и вставьте эти

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:bottom="1dp"
        android:left="-2dp"
        android:right="-2dp"
        android:top="-2dp">
        <shape android:shape="rectangle">
            <stroke
                android:width="0.5dp"
                android:color="@android:color/black" />    
            <solid android:color="#ffffff" />
            <stroke
                android:width="1dp"
                android:color="#030310"
                android:dashGap="5dp"
                android:dashWidth="5dp" />
            <padding
                android:bottom="5dp"
                android:left="5dp"
                android:right="5dp"
                android:top="5dp" />
        </shape>
    </item>
</layer-list>

Затем просто установите android:backgroundатрибут, который dotted.xmlмы только что создали. Вы EditTextвыглядите так.

<EditText
    android:id="@+id/editText"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Some Text"
    android:background="@drawable/dotted" />
Шри Кришна
источник
13

Я считаю, что это просто, без всех этих негативных прокладок и аистов.

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@color/main_bg_color"/>
    <item android:gravity="bottom">
        <shape android:shape="rectangle">
            <size android:height="5dp"/>
            <solid android:color="@color/bottom_bar_color"/>
        </shape>
    </item>
</layer-list>
Саймон К. Гергес
источник
2
Если вам не нужен особый фон, вы можете удалить<item android:drawable="@color/main_bg_color"/>
Overclover
1
Работает с Android 27, с Android 19 не работает ... Остальные версии не тестировал.
Ridcully
10

Попробуйте следующий XML-код:

    <layer-list>
        <item android:top="-2dp" android:right="-2dp" android:left="-2dp">
            <shape>
                <solid android:color="@android:color/transparent" />
                <stroke
                    android:width="1dp"
                    android:color="#fff" />
            </shape>
        </item>
    </layer-list>
Святослав Зайцев
источник
7

Я думаю, что вам не нужно использовать форму, если я вас понял.

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

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

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<RelativeLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:background="#1bd4f6"
    android:paddingBottom="4dp" >

    <TextView
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:background="#ababb2"
        android:padding="5dp"
        android:text="Hello Android" />
 </RelativeLayout>

 </RelativeLayout>

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

поиграйте с этими свойствами и получите результат

    android:top="dimension"
    android:right="dimension"
    android:bottom="dimension"
    android:left="dimension"

попробуй вот так

<?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="#1bd4f6" />
    </shape>
</item>

<item android:top="20px"
    android:left="0px">
    <shape android:shape="line"  >
        <padding android:bottom="1dp" />

        <stroke
            android:dashGap="10px"
            android:dashWidth="10px"
            android:width="1dp"
            android:color="#ababb2" />
    </shape>
</item>

</layer-list>
Кетан Ахир
источник
мой штрих - пунктирная линия
Cote Mounyo 08
Это работает, единственное предостережение - когда размер представления становится слишком маленьким, форма становится невидимой
Jose_GD 05
Вы всегда должны быть осторожны, чтобы не вызвать ненужного перерисовки.
Влад
5

Простое решение:

Создайте файл с возможностью рисования как edittext_stroke.xml в папке с возможностью рисования . Добавьте приведенный ниже код:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="line"
   >
    <stroke
        android:width="1dp"
        android:color="@android:color/white" >
    </stroke>
</shape>

В файле макета добавьте рисование для редактирования текста как

андроид: drawableBottom = "@ вытяжка / edittext_stroke"

<EditText
      android:textColor="@android:color/white"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:drawableBottom="@drawable/edittext_stroke"
      />
АДХИ
источник
В этом случае ваша линия будет в центре, а не внизу
Святослав Зайцев
4

Обычно для подобных задач я создавал список слоев, который можно рисовать, как этот:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
        <solid android:color="@color/underlineColor"/>
        </shape>
    </item>
<item android:bottom="3dp">
    <shape android:shape="rectangle">
        <solid android:color="@color/buttonColor"/>
    </shape>
</item>

Идея состоит в том, что сначала вы рисуете прямоугольник с underlineColor, а затем поверх этого вы рисуете еще один прямоугольник с фактическим buttonColor, но применяя bottomPadding. Всегда работает.

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

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
    <shape android:shape="rectangle">
        <solid android:color="@android:color/transparent"/>
    </shape>
</item>

<item android:drawable="@drawable/white_box" android:gravity="bottom"     android:height="2dp"/>
</layer-list>

(как вы можете видеть здесь mainButtonColor является прозрачным, а white_box - это просто простой прямоугольник, который можно рисовать с помощью белого Solid)

Lanitka
источник
2

используйте этот xml, чтобы изменить цвет по вашему выбору.

<item>
    <layer-list>
        <item>
            <shape>
                <solid android:color="@color/gray_500" />

            </shape>
        </item>
        <!-- CONTENT LAYER -->
        <item android:bottom="2dp" >
            <shape>
                <solid android:color="#ffffff" />
            </shape>
        </item>
    </layer-list>
</item>

В случае, если вы хотите программно

public static Drawable getStorkLineDrawable(@ColorInt int colorStrok, int    iSize, int left, int top, int right, int bottom)

{
    GradientDrawable gradientDrawable = new GradientDrawable();
    gradientDrawable.setShape(GradientDrawable.RECTANGLE);
    gradientDrawable.setStroke(iSize, colorStrok);
    LayerDrawable layerDrawable = new LayerDrawable(new Drawable[]{gradientDrawable});
    layerDrawable.setLayerInset(0, left, top, right, bottom);
    return layerDrawable;
}

назовите этот метод как

  Drawable yourLineDrawable=  getStorkLineDrawable(yourColor, iSize, -iSize, -iSize, -iSize, 0);
Сурав Пандит
источник
2

У меня это сработало лучше всего:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:top="-5dp" android:left="-5dp" android:right="-5dp" android:bottom="0dp">
        <shape android:shape="rectangle">
            <stroke android:width="4dp" android:color="#ff0000"/>
        </shape>
    </item>
</layer-list>

Показывает линию только внизу. Вы можете легко изменить ширину обводки до нужного размера, а также обновить верхнюю, левую и правую границы соответственно.

Sileria
источник
2

Самый простой способ сделать это - поместить после этого представления, где вы хотите нижнюю границу

    <?xml version="1.0" encoding="utf-8"?>
    <View
    android:layout_width="match_parent"
    android:layout_height="1dp"
    android:background="@color/colorPrimary" />
Рахит Вохера
источник
0

это полностью прозрачный Edittext с прозрачным фоном.

<item>
    <shape android:shape="rectangle" >
        <solid android:color="@color/transparent" />
    </shape>
</item>

<item android:top="-3dp" android:right="-3dp" android:left="-3dp">
    <shape>
        <solid android:color="@android:color/transparent" />
        <stroke

            android:width="2dp"
            android:color="@color/bottomline" />
    </shape>
</item>

Самет ЁЗТОПРАК
источник
0

Простое решение :

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:bottom="-1dp"
        android:left="-1dp"
        android:right="-1dp"
        android:top="-1dp">

        <shape android:shape="rectangle">

            <solid android:color="#AARRGGBB" />

            <stroke
                android:width="5dp"
                android:color="@android:color/red"
                android:dashWidth="10dp"
                android:dashGap="12dp" />

        </shape>
    </item>
</layer-list>

И наконец у нас получилось что-то подобное :)

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

Amirhf
источник