Создайте ровную границу вокруг TextView с 1 ​​символом

Создайте ровную границу вокруг TextView с 1 ​​символом

Здравствуйте, я хочу воссоздать этот "дизайн" в представлении Android. По сути, это ровная граница вокруг TextView.

Я создал TextView:

            <TextView
            android:id = "@+id/textView4"
            android:layout_width = "wrap_content"
            android:layout_height = "wrap_content"
            android:text = "R"
            android:textSize = "30sp"
            android:background = "@drawable/border_red"
            android:gravity = "center" />

И я добавил фигуру, которую можно рисовать:

<?xml version = "1.0" encoding = "utf-8" ?>
<shape xmlns:android = "http://schemas.android.com/apk/res/android"
    android:shape = "rectangle">

    <solid android:color = "@android:color/transparent"/>
    <stroke
        android:width = "4dp"
        android:color = "#ff687b" />
    <corners android:radius = "4dp"/>
    <padding android:right = "0dp" android:left = "0dp" android:bottom = "0dp" android:top = "0dp"/>
</shape>

Странное поведение в программе предварительного просмотра Android и в приложении. Я получаю такое странное поведение:

Создайте ровную границу вокруг TextView с 1 ​​символом

Я еще не определил отступы. Все они настроены на 0dp, но кажется, что у границы уже есть какие-то поля / отступы.

Такое поведение затрудняет создание ровной прямоугольной границы вокруг персонажа. :-(

В чем проблема, что я делаю не так?

поместите текстовое представление внутри линейного или относительного макета ... добавьте отступы к этому макету ... а затем добавьте границу к ТО, а не к текстовому представлению.

letsCode 28.11.2018 17:17

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

rubiktubik 29.11.2018 08:50

ты ошибаешься .. но ок.

letsCode 29.11.2018 16:48
0
3
131
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Используйте android:includeFontPadding = "false", чтобы удалить отступ шрифта с TextView

<TextView
            android:id = "@+id/textView4"
            android:layout_width = "wrap_content"
            android:layout_height = "wrap_content"
            android:text = "R"
            android:textSize = "30sp"
            android:includeFontPadding = "false"
            android:background = "@drawable/border_red"
            android:gravity = "center" />

Это удалит большую часть padding сверху и снизу TextView.

Чтобы получить идеальный квадрат, вам нужно передать исправления width и height на TextView.

@rubiktubik вы пробовали вышеуказанное решение?

Prithvi Bhola 29.11.2018 07:30

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

rubiktubik 29.11.2018 08:53

@rubiktubik нет способа уменьшить размеры TextView до точного размера текста с точностью до пикселя. Для желаемого результата необходимо указать фиксированный размер вместо wrap_content. А также на изображении (R) левый и правый отступы больше, чем верхний и нижний отступ. Таким образом, вы можете получить результат, задав различное заполнение для top and bottom и left and right.

Prithvi Bhola 29.11.2018 08:58

это не лучшее решение. смотри мой ответ. давать представление статической ширины и высоты нехорошо, поскольку есть устройства, которые меньше / больше, когда дело доходит до dp. Я не буду голосовать против получения ненависти, но это неправильно @PrithviBhola

letsCode 29.11.2018 17:00

@DroiDev Я не понимаю, зачем оборачивать TextView внутри LinearLayout. Это не будет иметь никакого значения. И я предложил использовать разные отступы для top and bottom и left and right, что является необходимым случаем.

Prithvi Bhola 29.11.2018 17:39

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

Используя тот же XML, что и выше ...

Вот мой макет.

<?xml version = "1.0" encoding = "utf-8"?>
<LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
    xmlns:app = "http://schemas.android.com/apk/res-auto"
    xmlns:tools = "http://schemas.android.com/tools"
    android:layout_width = "match_parent"
    android:layout_height = "match_parent"
    tools:context = "com.vzw.www.myapplication.MainActivity"
    android:orientation = "vertical"
    android:padding = "10dp">


    <LinearLayout
        android:layout_width = "wrap_content"
        android:layout_height = "wrap_content"
        android:background = "@drawable/red_border"
        android:padding = "10dp">


        <TextView
            android:layout_width = "wrap_content"
            android:layout_height = "wrap_content"
            android:includeFontPadding = "false"
            android:text = "H"
            android:textStyle = "bold"/>

    </LinearLayout>

</LinearLayout>

Вот результат этого ...

Вы также можете добиться этого, создав собственный TextView ... но я не буду вдаваться в это ... но если хотите, можете. На самом деле это даже лучшее решение.

В этом случае также неправильное заполнение top and bottom и left and right. Пожалуйста, проверьте образ (R) в вопросе, заполнение top and bottom и left and right отличается. Таким образом, требуется разное заполнение для top and bottom и left and right.

Prithvi Bhola 29.11.2018 17:45

тогда создание пользовательского представления лучше, чем я начал.

letsCode 29.11.2018 17:46

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

Prithvi Bhola 29.11.2018 17:52

не когда вы работаете с Paint / Rect / Canvas. вы можете нарисовать произвольную рамку. Советую разобраться. вы можете полностью исключить отступы, найти высоту, посчитать и рассчитать правильные отступы.

letsCode 29.11.2018 17:55

Другие вопросы по теме