Подлинный оттенок кнопки Android

Можно ли нарисовать drawableLeft в андроидной кнопке? У меня есть черная рамка, которую я хотел бы оттенять белый. Я знаю, как добиться этого с помощью изображения (изображение слева), но я хочу сделать это с помощью кнопки android по умолчанию.

enter image description here

Мой исходный код:

<Button android:layout_height="wrap_content"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:text="@string/drawer_quizzes"
        android:backgroundTint="@color/md_light_green_500"
        android:stateListAnimator="@null"
        android:textColor="#fff"
        android:textSize="12dp"
        android:fontFamily="sans-serif"
        android:drawableLeft="@drawable/ic_action_landscape"
        android:gravity="left|center_vertical"
        android:drawablePadding="8dp"
        />

Есть ли способ подкрасить кнопку? Или существует специальный метод просмотра для достижения этого эффекта?

Ответы

Ответ 1

Вы можете добиться окраски drawableleft на кнопке с помощью этого метода:

Шаг 1: Создайте файл ресурса с возможностью рисования с растровым изображением в качестве родительского элемента, как показано ниже, и назовите его как ic_action_landscape.xml под выпадающей папкой

<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@android:drawable/ic_btn_speak_now"
    android:tint="@color/white" />

Шаг 2: Создайте элемент управления Button в своем макете ниже

<Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:backgroundTint="@color/md_light_green_500"
        android:drawableLeft="@drawable/ic_action_landscape"
        android:drawablePadding="8dp"
        android:fontFamily="sans-serif"
        android:gravity="left|center_vertical"
        android:stateListAnimator="@null"
        android:text="@string/drawer_quizzes"
        android:textColor="#fff"
        android:textSize="12dp" />

Кнопка получает выталкиваемый из ic_action_landscape.xml из выпадающей папки вместо @android: drawable или drawable png (s).

Способ 2:
Шаг 1:
Вы даже можете добавить значок в качестве панели действий и значков вкладки с передним планом как изображение которые могут быть импортированы из пользовательского местоположения или в Clipart

Шаг 2:
В раскрывающемся списке "Тема" выберите "Пользовательский"

Шаг 3:
Затем выберите цвет как #FFFFFF в выборе цвета переднего плана. Method 2 Pictorial representation

Наконец, завершите работу мастера, чтобы добавить изображение, затем добавьте его как изображение.

Pictorial representation for answer to the question

Ответ 2

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

Итак, я решил установить цветовой фильтр в конструкторе следующим образом:

int textColor = getTextColors().getColorForState(EMPTY_STATE_SET, Color.WHITE);
    Drawable[] drawables = getCompoundDrawablesRelative();
    for (Drawable drawable : drawables) {
        if(drawable != null) {
            drawable.setColorFilter(textColor, PorterDuff.Mode.SRC_ATOP);
        }
    }

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

Ответ 3

Как предложили @Boris, вы можете использовать библиотеку поддержки.

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

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

Код интереса:

private void init() {
    PorterDuff.Mode tintMode = PorterDuff.Mode.SRC_IN;
    Drawable[] ds = getCompoundDrawables();
    tint(ds[LEFT], Color.RED, tintMode);
    tint(ds[TOP], Color.YELLOW, tintMode);
    tint(ds[RIGHT], Color.GREEN, tintMode);
    tint(ds[BOTTOM], Color.BLUE, tintMode);
}

private void tint(Drawable d, int color, PorterDuff.Mode tintMode) {
    TintInfo ti = new TintInfo();
    ti.mTintMode = tintMode;
    ti.mTintList = ColorStateList.valueOf(color);
    ti.mHasTintList = true;
    ti.mHasTintMode = true;

    TintManager.tintDrawable(d, ti, new int[]{0});
}

Ответ 4

Вы можете использовать android:drawableTint="@color/yourColor" в> 23 версии для Android.

Ответ 5

Возможно, я опаздываю на это, но если вы используете С#, вы можете сделать это следующим образом:

Color iconColor = Color.Orange; // TODO: Get from settings
Mode mode = Mode.SrcAtop;

Drawable drawable = ResourcesCompat.GetDrawable(Resources, Resource.Drawable.ic_action_arrest, null);

drawable.SetColorFilter(iconColor, mode);

Вам также понадобится:

using Android.Graphics;
using static Android.Graphics.PorterDuff;
using Android.Graphics.Drawables;

Надеюсь, это поможет. Это самый простой способ найти. Также обратите внимание, что ЛЮБОЕ место в вашем приложении, в котором вы используете этот значок, будет таким цветом.

Ответ 6

Мне удалось выполнить ту же самую вещь, используя MaterialButton (из библиотеки поддержки материалов, которую большинство людей, вероятно, уже используют). MaterialButton имеет атрибут с именем icon, который можно разместить слева/по центру/справа (по умолчанию слева). Он также имеет атрибут iconTint, который будет окрашивать значок.

Gradle:

implementation "com.google.android.material:material:1.1.0-alpha09"

Вид:

<com.google.android.material.button.MaterialButton
    android:layout_width="0dp"
    android:layout_weight="1"
    android:text="@string/drawer_quizzes"
    android:backgroundTint="@color/md_light_green_500"
    android:stateListAnimator="@null"
    android:textColor="#fff"
    android:textSize="12dp"
    android:fontFamily="sans-serif"
    app:icon="@drawable/ic_action_landscape"
    app:iconTint="@color/white"
    android:gravity="left|center_vertical"
    android:drawablePadding="8dp"
    />

Ответ 7

Вы можете использовать рисованный фильтр или, если ваш API> = M, вы можете просто

textView.compoundDrawableTintList = ColorStateList.valueOf(Color.WHITE)

или в XML,

android:drawableTint="@color/white"