Стандартная кнопка Android с другим цветом - PullRequest
718 голосов
/ 05 октября 2009

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

Наилучший способ, который я нашел до сих пор, - это изменить рисование Button на рисование, расположенное в res/drawable/red_button.xml:

<?xml version="1.0" encoding="utf-8"?>    
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@drawable/red_button_pressed" />
    <item android:state_focused="true" android:drawable="@drawable/red_button_focus" />
    <item android:drawable="@drawable/red_button_rest" />
</selector>

Но для этого требуется, чтобы я фактически создал три разных рисунка для каждой кнопки, которую я хочу настроить (один для кнопки в покое, один в фокусе и один при нажатии). Это кажется более сложным и не СУХИМ, чем мне нужно.

Все, что я действительно хочу сделать, это применить какое-то преобразование цвета к кнопке. Есть ли более простой способ изменить цвет кнопки, чем я?

Ответы [ 20 ]

8 голосов
/ 23 июля 2015

Используйте это следующим образом:

buttonOBJ.getBackground().setColorFilter(Color.parseColor("#YOUR_HEX_COLOR_CODE"), PorterDuff.Mode.MULTIPLY);
4 голосов
/ 01 марта 2014

В <Button> используйте android:background="#33b5e5". или лучше android:background="@color/navig_button"

3 голосов
/ 05 августа 2011

Библиотека компонентов DroidUX имеет виджет ColorButton, цвет которого можно легко изменять как с помощью определения XML, так и программно во время выполнения, так что вы даже можете позволить установите цвет / тему кнопки, если ваше приложение это позволяет.

3 голосов
/ 11 мая 2014

Вы также можете использовать этот онлайн-инструмент для настройки кнопки http://angrytools.com/android/button/ и использовать android:background="@drawable/custom_btn" для определения настраиваемой кнопки в макете.

2 голосов
/ 07 октября 2016

Вы можете установить тему своей кнопки на

<style name="AppTheme.ButtonBlue" parent="Widget.AppCompat.Button.Colored">
 <item name="colorButtonNormal">@color/HEXColor</item>
 <item name="android:textColor">@color/HEXColor</item>
</style>
1 голос
/ 13 января 2015

Простой способ - просто определить пользовательский класс Button, который принимает все свойства, которые вам нужны, такие как радиус, градиент, цвет нажатия, нормальный цвет и т. Д., А затем просто использовать это в макетах XML вместо настройки фона с помощью XML. Образец здесь

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

Результат (Селектор фона не использовался).

Обычная кнопка

Normal Image

Нажатая кнопка

enter image description here

0 голосов
/ 01 апреля 2019

Это просто .. добавить эту зависимость в ваш проект и создать кнопку 1. Любая форма 2. Любой цвет 3. Любая граница 4. С материальными эффектами

https://github.com/manojbhadane/QButton

<com.manojbhadane.QButton
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:text="OK"
       app:qb_backgroundColor="@color/green"
       app:qb_radius="100"
       app:qb_strokeColor="@color/darkGreen"
       app:qb_strokeWidth="5" />
0 голосов
/ 21 марта 2019

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

<style name="MyButton" parent="Theme.AppCompat.Light>
    <item name="colorControlHighlight">#F36F21</item>
    <item name="colorControlHighlight">#FF8D00</item>
</style>

и в макете добавьте это свойство к своей кнопке

    android:theme="@style/MyButton"
0 голосов
/ 06 апреля 2017

значения \ styles.xml

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

<style name="RedAccentButton" parent="ThemeOverlay.AppCompat.Light">
    <item name="colorAccent">#ff0000</item>
</style>

тогда:

<Button
    style="@style/Widget.AppCompat.Button.Colored"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="text" />

<Button
    style="@style/Widget.AppCompat.Button.Colored"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:enabled="false"
    android:text="text" />

<Button
    style="@style/Widget.AppCompat.Button.Colored"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="text"
    android:theme="@style/RedAccentButton" />

<Button
    style="@style/Widget.AppCompat.Button.Colored"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:enabled="false"
    android:text="text"
    android:theme="@style/RedAccentButton" />

result

0 голосов
/ 25 июля 2016

Способ создания кнопки с другим стилем, которая работает достаточно хорошо, заключается в создании подкласса объекта Button и применении цветового фильтра. Это также обрабатывает включенные и отключенные состояния, применяя альфа к кнопке.

import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.LightingColorFilter;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;
import android.os.Build;
import android.util.AttributeSet;
import android.widget.Button;

public class DimmableButton extends Button {

    public DimmableButton(Context context) {
        super(context);
    }

    public DimmableButton(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public DimmableButton(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @SuppressWarnings("deprecation")
    @Override
    public void setBackgroundDrawable(Drawable d) {
        // Replace the original background drawable (e.g. image) with a LayerDrawable that
        // contains the original drawable.
        DimmableButtonBackgroundDrawable layer = new DimmableButtonBackgroundDrawable(d);
        super.setBackgroundDrawable(layer);
    }

    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    @Override
    public void setBackground(Drawable d) {
        // Replace the original background drawable (e.g. image) with a LayerDrawable that
        // contains the original drawable.
        DimmableButtonBackgroundDrawable layer = new DimmableButtonBackgroundDrawable(d);
        super.setBackground(layer);
    }

    /**
     * The stateful LayerDrawable used by this button.
     */
    protected class DimmableButtonBackgroundDrawable extends LayerDrawable {

        // The color filter to apply when the button is pressed
        protected ColorFilter _pressedFilter = new LightingColorFilter(Color.LTGRAY, 1);
        // Alpha value when the button is disabled
        protected int _disabledAlpha = 100;
        // Alpha value when the button is enabled
        protected int _fullAlpha = 255;

        public DimmableButtonBackgroundDrawable(Drawable d) {
            super(new Drawable[] { d });
        }

        @Override
        protected boolean onStateChange(int[] states) {
            boolean enabled = false;
            boolean pressed = false;

            for (int state : states) {
                if (state == android.R.attr.state_enabled)
                    enabled = true;
                else if (state == android.R.attr.state_pressed)
                    pressed = true;
            }

            mutate();
            if (enabled && pressed) {
                setColorFilter(_pressedFilter);
            } else if (!enabled) {
                setColorFilter(null);
                setAlpha(_disabledAlpha);
            } else {
                setColorFilter(null);
                setAlpha(_fullAlpha);
            }

            invalidateSelf();

            return super.onStateChange(states);
        }

        @Override
        public boolean isStateful() {
            return true;
        }
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...