android: drawableLeft margin и / или padding

Ответы:

466

Как упоминалось выше, cephus android:drawablePaddingбудет принудительно заполнять текст и рисование только в том случае, если кнопка достаточно мала.

При размещении кнопок большего размера вы можете использовать их android:drawablePaddingв сочетании с android:paddingLeftи android:paddingRightдля принудительного ввода текста и рисования внутрь по направлению к центру кнопки. Регулируя левый и правый отступы по отдельности, вы можете сделать очень подробные настройки макета.

Вот пример кнопки, которая использует отступы для сближения текста и значка ближе, чем они были бы по умолчанию:

<Button android:text="@string/button_label" 
    android:id="@+id/buttonId"
    android:layout_width="160dip"
    android:layout_height="60dip"
    android:layout_gravity="center"
    android:textSize="13dip"
    android:drawableLeft="@drawable/button_icon"
    android:drawablePadding="2dip"
    android:paddingLeft="30dip"
    android:paddingRight="26dip"
    android:singleLine="true"
    android:gravity="center" />  
Иордания
источник
22
android: paddingLeft = "30dip" android: paddingRight = "26dip" являются ключевыми здесь!
Игорь Ганапольский
4
это не связано с вопросом, но android: gravity = "center" будет держать текст выровненным по центру прорисовки!
cwhsu
1
Что делать, если у нас есть элементы рисования как слева, так и справа, и нам нужно только настроить правый рисунок?
nmxprime
Я использую только: android: paddingLeft, и это меняет положение изображения. android: drawablePadding используется для пробела между изображением и текстом.
Храбрый
Проблема этого кода заключается в том, что он приводит к passwordToggleDrawableувеличению разрыва левого отступа, поскольку он не может указывать только конкретную цель для рисования слева.
Фрукт
184

TextView имеет свойство android: drawablePadding, которое должно помочь:

андроид: drawablePadding

Отступ между рисованными объектами и текстом.

Должно быть значением измерения, которое представляет собой число с плавающей точкой, к которому добавляется единица, такая как «14.5sp». Доступные единицы измерения: px (пиксели), dp (пиксели, не зависящие от плотности), sp (масштабированные пиксели на основе предпочтительного размера шрифта), дюймы (дюймы), мм (миллиметры).

Это также может быть ссылка на ресурс (в форме «@ [package:] type: name») или атрибут темы (в форме «? [Package:] [type:] name»), содержащий значение этого типа ,

Это соответствует глобальному атрибуту ресурса символа drawablePadding.

Шерил Саймон
источник
61

android:drawablePaddingсоздаст пробел между текстом и рисованием только в том случае, если кнопка достаточно мала, чтобы сложить 2 вместе. Если ваша кнопка шире, чем объединенная ширина (для drawableLeft / drawableRight) или высота (для drawableTop / drawableBottom), тогда drawablePadding ничего не делает.

Я борюсь с этим и сейчас. Мои кнопки довольно широкие, значок висит на левом краю кнопки, а текст посередине. Мой единственный способ обойти это сейчас - запекать с полями для рисования, добавляя пустые пиксели к левому краю холста с помощью Photoshop. Не идеально, и не очень рекомендуется. Но это мое временное решение, если не считать перестройки TextView / Button.

Cephus
источник
спасибо за объяснение моей проблемы. Я не понял, что это происходит только тогда, когда кнопка достаточно широка
peter.bartos
У меня такая же проблема. Моя кнопка широкая, поэтому рисунок не близок к тексту
Милад Фаридния,
да, это сработало, спасибо
Дейв о Грейди
43

Да. используйте drawablePadding следующим образом,

<TextView
        android:id="@+id/tvHeader"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Settings and Contents"
        android:drawableLeft="@drawable/icon_success"
        android:drawablePadding="10dp" />
Паринда Раджапакша
источник
37

Сделайте свой drawable resources.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true">
        <inset android:drawable="@drawable/small_m" android:insetLeft="10dp" android:insetTop="10dp" />
    </item>
    <item>
        <inset android:drawable="@drawable/small_p" android:insetLeft="10dp" android:insetTop="10dp" />
    </item>
</selector>
Лучший художник
источник
2
@ The Finest Artist Я использую вставку в Drawable, и она отлично работает для новых версий устройств. Я имею в виду, что он не работает в SDK 16, 17, но работает в SDK 23. Есть ли идея?
Бхавин Чаухан
2
developer.android.com/reference/android/graphics/drawable/… его из API 1
Бхавин Чаухан
Хороший ответ и голос за это. Вы просто помогаете мне решить проблему, которая долго смущала меня.
Anthonyeef
34

android:drawablePaddingэто самый простой способ добавить отступ для нарисованного значка, но вы не можете назначить конкретный односторонний отступ, например, paddingRightили paddingLeftдля нарисованного значка. Чтобы добиться этого, вам нужно копаться в нем. И если вы подаете заявление paddingLeftили paddingRightв Edittextто место будет отступы ко всему Edittextвместе с растяжимым значком.

Бхаргав Благодар
источник
12

определите форму для вашего текста редактирования и дайте ему отступ. Например

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >
    <padding
        android:left="5dp"
        android:right="5dp"
    />
    <solid android:color="#F6F6F6" />
    <stroke
        android:width="1px"
        android:color="#C3C3C3" />

    <corners
        android:bottomLeftRadius="1dp"
        android:bottomRightRadius="1dp"
        android:topLeftRadius="1dp"
        android:topRightRadius="1dp" />
</shape>

Заполнение, определенное в этой форме, поможет придать отступу нарисованному левому или правому краю ---------------------- Примените эту форму в EditView

 <EditText
            android:id="@+id/example"
            android:layout_width="fill_parent"
            android:layout_height="36dp"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:background="@drawable/shape2"
            android:drawableLeft="@drawable/icon1"
            android:drawablePadding="@dimen/txtDrwblPadding"
            android:ems="10"
         />

использование этой определенной формы в качестве фона придаст вашему EditText стиль и поле для drawableLeft.

Умешь Н
источник
12

android: drawablePadding - это самый простой способ добавить отступ для нарисованного значка, но вы не можете задать конкретный односторонний отступ, например paddingRight или paddingLeft нарисованного значка. Чтобы добиться этого, вам нужно копаться в нем. И если вы примените paddingLeft или paddingRight к Edittext, тогда он поместит заполнение на весь Edittext вместе с нарисованным значком.

<TextView android:layout_width="match_parent"
    android:padding="5sp"
    android:id="@+id/date"
    android:gravity="center|start"
    android:drawableEnd="@drawable/ic_calendar"
    android:background="@drawable/edit_background"
    android:hint="Not Selected"
    android:drawablePadding="10sp"
    android:paddingStart="10sp"
    android:paddingEnd="10sp"
    android:textColor="@color/black"
    android:layout_height="wrap_content"/>
Sekhon123
источник
Вы должны использовать "дп"
Марк Пазон
11
<TextView
    android:layout_width="wrap_content"
    android:layout_height="32dp"
    android:background="@drawable/a"
    android:drawableLeft="@drawable/concern_black"
    android:gravity="center"
    android:paddingLeft="10dp"
    android:paddingRight="10dp"
    android:drawablePadding="10dp"
    android:text="text"/>

примечание: layout_width должно быть wrap_content и использовать paddingLeft paddingRight drawablePadding для контроля зазора. Если вы укажете значение layout_width, в котором будет разрыв между значком и текстом, я думаю, что однажды передайте layout_width заданное значение, отступ будет измеряться.

王良海
источник
9

Я тоже брошу свой ответ на ринг. Если вы хотите сделать это программно, вы можете сделать следующее.

final Drawable drawable = ContextCompat.getDrawable(getContext(), R.drawable.somedrawable);
final boolean isLTR = ViewCompat.LAYOUT_DIRECTION_LTR == ViewCompat.getLayoutDirection(this);
final int iconInsetPadding = getResources().getDimensionPixelSize(R.dimen.icon_padding);

final Drawable insetDrawable = new InsetDrawable(drawable, isLTR ? 0 : iconInsetPadding, 0, isLTR ? iconInsetPadding : 0, 0);

Это добавит заполнение к концу рисования, где конец будет означать влево / вправо в зависимости от того, находится ли телефон в LTR или RTL.

Даниэль Очоа
источник
7

Вместо Buttonиспользования LinearLayoutс ImageViewи TextViewвнутри. В детских вещах любят ImageViewи TextViewиспользуют android:duplicateParentState="true".

Алексей Захаров
источник
На самом деле вам понадобится FrameLayout и Button (и ImageView / TextView внутри их собственного LinearLayout), чтобы воспроизвести пользовательский интерфейс Button и перенести onclicklistener () в часть кнопки
3c71
1
Зачем использовать дополнительный макет, если у вас уже есть drawablePadding в TextView.
Паринда Раджапакша
5

Вы должны рассмотреть возможность использования layer-list

Создайте подобный файл для рисования, назовите его ic_calendar.xml

<?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="@android:color/transparent"/>
    </shape>
</item>
<item android:right="10dp">
    <bitmap android:gravity="center_vertical|left"
        android:src="@drawable/ic_calendar_16dp"
        android:tint="@color/red"
        />
</item>
</layer-list>

Под файлом макета,

<TextView
         android:id="@+id/tvDate"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:drawableLeft="@drawable/ic_calendar"
         android:textColor="@color/colorGrey"
         android:textSize="14sp" 
    />
RayChongJH
источник
4

Вы можете использовать отступы для кнопки и играть с drawablePadding.

 <Button
    style="@style/botonesMenu"
    android:padding="15dp"
    android:drawablePadding="-15dp"
    android:text="@string/actualizarBD"
    android:textAlignment="gravity"
    android:gravity="center"
    android:layout_row="1"
    android:layout_column="0"
    android:drawableTop="@drawable/actualizar"
    android:id="@+id/btnActualizar"
    android:onClick="actualizarBD" />

Вы можете использовать конкретный отступ, в зависимости от того, где вы хотите нарисовать, с помощью android: paddingLeft = "10dp" или android: paddingBottom = "10dp" или android: paddingRight = "10dp" или android: paddingTop = "10dp"

Каролина
источник
2

Вы можете использовать android:drawableLeft="@drawable/your_icon"для отображения рисунка слева. Чтобы установить отступ для рисования, вы должны использовать android:paddingLeftили, android:paddingRightчтобы установить отступ слева / справа соответственно.

android:paddingRight="10dp"
android:paddingLeft="20dp"
android:drawableRight="@drawable/ic_app_manager"
AouledIssa
источник
1

Если размер нарисованного ресурса фиксирован, вы можете сделать это так:

<Button
    android:background="@drawable/rounded_button_green"
    style="?android:attr/selectableItemBackground"
    android:layout_height="wrap_content"
    app:layout_widthPercent="70%"
    android:drawableRight="@drawable/ic_clear_black_24dp"
    android:paddingRight="10dp"
    android:paddingLeft="34dp"
    tools:text="example" />

Ключевым моментом здесь является то, что:

    android:drawableRight="@drawable/ic_clear_black_24dp"
    android:paddingRight="10dp"
    android:paddingLeft="34dp"

То есть размер рисуемого ресурса плюс paddingRight равен paddingLeft.

Вы можете увидеть результат в этом примере

user3344964
источник
1
textView.setCompoundDrawablesWithIntrinsicBounds(AppCompatResources.getDrawable(this,drawable),null,null,null);

addressTitleView.setCompoundDrawablePadding();
Сринивас Коккула
источник
Хотя этот фрагмент кода может решить вопрос, в том числе объяснение действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин, по которым вы предлагаете код.
Росарио Перейра Фернандес
Это работает только для просмотра текста, не например, кнопка, которая также позволяет установить начало / конец drwables
Ixx
1

просто переделать из:

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

    <corners android:radius="40dp"/>

    <solid android:color="@android:color/white"/>

</shape>

в

<layer-list
        xmlns:android="http://schemas.android.com/apk/res/android">
    <item
            android:right="@dimen/_2dp"
            android:left="@dimen/_2dp"
            android:bottom="@dimen/_2dp"
            android:top="@dimen/_2dp"
            >
        <shape
                xmlns:android="http://schemas.android.com/apk/res/android">

            <corners android:radius="40dp"/>

            <solid android:color="@android:color/white"/>

        </shape>
    </item>

</layer-list>
Николай Асинович
источник
-6

Пытается использовать отрицательный отступ

Подобно:

android:paddingLeft="-8dp"
Филипп Стейф
источник