Подлинный оттенок кнопки 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"