У меня есть TextView, и я хотел бы добавить черную рамку вдоль ее верхней и нижней границ. Я попытался добавить android:drawableTop
и android:drawableBottom
к TextView, но это только заставило весь вид стать черным.
<TextView
android:background="@android:color/green"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:drawableTop="@android:color/black"
android:drawableBottom="@android:color/black"
android:text="la la la" />
Есть ли способ легко добавить верхнюю и нижнюю границу к представлению (в частности, к TextView) в Android?
Ответы:
В Android 2.2 вы можете сделать следующее.
Создайте отрисовываемый файл XML, например /res/drawable/textlines.xml, и назначьте его в качестве свойства фона TextView.
/res/drawable/textlines.xml
Недостатком является то, что вы должны указать непрозрачный цвет фона, так как прозрачные пленки не будут работать. (По крайней мере, я думал, что они сделали, но я ошибся). В приведенном выше примере вы можете видеть, что сплошной цвет первой фигуры #FFdddddd копируется в цвет обводки 2-й фигуры.
источник
android:color="@null"
чтобы избежать непрозрачной фоновой проблемы.Я использовал трюк, чтобы граница отображалась вне контейнера. С помощью этого трюка рисуется только линия, поэтому будет отображаться фон основного вида.
источник
Вариант 1: Форма Drawable
Это самый простой вариант, если вам нужна рамка вокруг макета или вида, в которой вы можете установить фон. Создайте файл XML в
drawable
папке, которая выглядит примерно так:Вы можете удалить,
solid
если вы не хотите заполнять. Наборbackground="@drawable/your_shape_drawable"
на ваш макет / вид.Вариант 2: фоновый вид
Вот маленький трюк, который я использовал в
RelativeLayout
. По сути, у вас есть черный квадрат под видом, который вы хотите задать рамку, а затем дать этому виду некоторый отступ (не отступ!), Чтобы черный квадрат просвечивал по краям.Очевидно, что это работает правильно, только если у вида нет прозрачных областей. Если это произойдет, я бы порекомендовал вам написать кастом,
BorderView
который рисует только границу - это должно быть всего несколько десятков строк кода.Если вам интересно, что делает работу с
adjustViewBounds=true
. Тем не менее, это не работает, если вы хотите иметь фон целикомRelativeLayout
, потому что есть ошибка, которая мешает вам заполнитьRelativeLayout
сView
. В этом случае я бы порекомендовалShape
Drawable.Вариант 3: 9-патч
Последний вариант - использовать 9-патч, как этот:
Вы можете использовать его в любом представлении, где вы можете установить
android:background="@drawable/..."
. И да, это должно быть 6х6 - я пробовал 5х5, и это не сработало.Недостаток этого метода в том, что вы не можете изменить цвета очень легко, но если вам нужны причудливые границы (например, только границы сверху и снизу, как в этом вопросе), то вы не сможете сделать их с помощью
Shape
рисования. , который не очень мощный.Вариант 4: дополнительные виды
Я забыл упомянуть этот действительно простой вариант, если вы хотите, чтобы границы только выше и ниже вашего обзора. Вы можете поместить свой вид по вертикали
LinearLayout
(если это еще не так), а затем добавить пустыеView
s над и под ним, например:источник
Чтобы добавить
1dp
белую рамку только внизу и иметь прозрачный фон, вы можете использовать следующее, что проще, чем большинство ответов здесь.Для просмотра
TextView
или добавления добавьте:И в
drawable
каталоге добавьте следующий XML, называемыйborderbottom.xml
Если вы хотите границы в верхней части, изменить
android:top="-2dp"
кandroid:bottom="-2dp"
Цвет не обязательно должен быть белым, а фон не обязательно должен быть прозрачным.
solid
Может не быть необходимым элементом. Это будет зависеть от вашего дизайна (спасибо В. Калюжню).По сути, этот XML создаст границу, используя форму прямоугольника, но затем вытолкнет верхнюю, правую и левую стороны за область рендеринга для фигуры. Это оставляет только нижнюю границу видимой.
источник
-2dp
против1dp
)? Кажется, работает, когда они равны по количеству (-1
и1
).-2dp
результат всегда был чистым. Я думаю, что был тестовый случай, где результат не был чистым. Я не могу вспомнить, был ли это экран с низкой или высокой плотностью или даже более старая версия Android (возможно, 2.x).4dp
для ширины хода, я должен использовать-8dp
для позиционирования?-5dp
будет все, что нужно со значением ширины4pd
. Просто нужно быть немного больше, чтобы преодолеть неточность значения с плавающей точкой.В настоящее время принятый ответ не работает. Это создает тонкие вертикальные границы на левой и правой сторонах вида в результате сглаживания.
Эта версия работает отлично. Это также позволяет вам устанавливать ширину границы независимо, и вы также можете добавлять границы слева / справа, если хотите. Единственным недостатком является то, что он не поддерживает прозрачность.
Создайте отрисовываемый файл XML
/res/drawable/top_bottom_borders.xml
с указанным ниже кодом и назначьте его в качестве фонового свойства TextView.Проверено на Android KitKat через Зефир
источник
Поэтому я хотел сделать что-то немного другое: ТОЛЬКО границу снизу, чтобы имитировать разделитель ListView. Я изменил ответ Пита Дельпорта и получил это:
Обратите внимание на использование px вместо dp, чтобы получить ровно 1 пиксельный делитель (некоторые телефонные DPI приводят к исчезновению линии 1dp).
источник
"@color/background_trans_light"
?Как сказал @Nic Hubbard, существует очень простой способ добавить границу.
Вы можете изменить высоту и цвет фона на любой другой.
источник
Мои ответы основаны на версии @Emile, но я использую прозрачный цвет вместо сплошного.
Этот пример нарисует нижнюю границу 2dp.
@ color / bgcolor - это цвет фона, на котором вы рисуете свой вид с рамкой.
Если вы хотите изменить положение границы, измените смещение одним из:
или объедините их, чтобы иметь 2 или более границ:
источник
Вы также можете обернуть вид в FrameLayout, а затем установить цвет фона рамки и отступа на то, что вы хотите; однако у textview по умолчанию имеется «прозрачный» фон, поэтому вам также придется изменить цвет фона textview.
источник
Почему бы просто не создать 1dp высокий вид с цветом фона? Тогда его можно легко разместить там, где вы хотите.
источник
Просто чтобы добавить мое решение в список ..
Я хотел полупрозрачную нижнюю границу, которая выходит за исходную форму (таким образом, полупрозрачная граница была вне родительского прямоугольника).
Что дает мне;
источник
Чтобы изменить это:
Я предпочитаю такой подход в "drawable / top_bottom_border.xml":
Это только делает границы, а не прямоугольник, который появится, если ваш фон имеет цвет.
источник
Сначала создайте XML-файл с содержимым, показанным ниже, назовите его border.xml и поместите его в папку макета внутри директории res
После этого внутри кода используйте
Это сделает черную линию сверху и снизу TextView.
источник
Запишите ниже код
источник
Вот способ достичь этого.
Первый элемент для обводки и второй для сплошного фона. Скрытие левой и правой границ.
источник
Простейший способ добавить границы для вставки границ, используя
InsetDrawable
следующее, покажет только верхнюю границу:источник
Добавить файл в res / drawable
Добавить ссылку на этот файл в фоновое свойство
источник
Попробуйте обернуть изображение линейным макетом и установите его цвет фона в соответствии с желаемым цветом текста. Затем установите отступ для текстового представления так, чтобы он соответствовал толщине вашей границы.
источник
Вы также можете использовать 9-путь, чтобы сделать свою работу. Создайте его так, чтобы цветной пиксель не умножался по высоте, а только был прозрачным пикселем.
источник
источник
Просто добавьте виды сверху и снизу
View
источник
источник
Просто добавьте этот TextView ниже текста, где вы хотите добавить границу
источник
Просто для обеспечения выполнения ответов @phreakhead и user1051892 ,
<item android:bottom|android:left|android:right|android:top>
если они отрицательные, должно быть больше, чем<stroke android:width>
. Если нет, то рисование элемента будет смешано с рисованием мазка, и вы можете подумать, что эти значения не работают.источник