Как установить определенный цвет для фона при нажатии на кнопку без полей?

Короткий вопрос:

Предположим, я использую этот стиль для кнопки:

    <Button
        style="@style/Widget.AppCompat.Button.Borderless.Colored" ...

(или без "Цветной" части).

Как мне сделать его фон селектором, который при нажатии имеет другой цвет? Цвет по умолчанию довольно смелый на pre-Lollipop...

Я хочу, чтобы все стили работали по умолчанию (включая отступы), кроме цвета селектора.


person android developer    schedule 03.02.2016    source источник


Ответы (1)


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

Из темы Android SDK AppCompat:

<!-- Colored bordered ink button -->
    <style name="Base.Widget.AppCompat.Button.Colored">
        <item name="android:background">@drawable/abc_btn_colored_material</item>
        <item name="android:textAppearance">@style/TextAppearance.AppCompat.Widget.Button.Inverse</item>
    </style>

Они используют рисуемый abc_btn_colored_material, источник которого выглядит следующим образом: https://github.com/dandar3/android-support-v7-appcompat/blob/master/res/drawable/abc_btn_borderless_material.xml

Вы можете видеть, что это просто список слоев со следующим рисунком с несколькими состояниями:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="true" android:drawable="@drawable/abc_btn_default_mtrl_shape"/>
    <item android:state_pressed="true" android:drawable="@drawable/abc_btn_default_mtrl_shape"/>
    <item android:drawable="@android:color/transparent"/>
</selector>

https://github.com/dandar3/android-support-v7-appcompat/blob/master/res/drawable/abc_btn_default_mtrl_shape.xml

<inset xmlns:android="http://schemas.android.com/apk/res/android"
       android:insetLeft="@dimen/abc_button_inset_horizontal_material"
       android:insetTop="@dimen/abc_button_inset_vertical_material"
       android:insetRight="@dimen/abc_button_inset_horizontal_material"
       android:insetBottom="@dimen/abc_button_inset_vertical_material">
    <shape android:shape="rectangle">
        <corners android:radius="@dimen/abc_control_corner_material" />
        <solid android:color="@android:color/white" />
        <padding android:left="@dimen/abc_button_padding_horizontal_material"
                 android:top="@dimen/abc_button_padding_vertical_material"
                 android:right="@dimen/abc_button_padding_horizontal_material"
                 android:bottom="@dimen/abc_button_padding_vertical_material" />
    </shape>
</inset>

Так что просто сделайте его своим :) Скопируйте рисуемый xml в свое приложение и настройте его.

Я не знаю, сможете ли вы получить доступ к @dimen/... вне пакета SDK, эти значения определены в SDK Values.xml, взгляните на https://github.com/dandar3/android-support-v7-appcompat/blob/master/res/values/values.xml . Если это невозможно, просто создайте собственную версию размеров в values.xml

Если есть более чистое решение, которое может указать любой гуру Android, я буду рад узнать!

Запрошенное обновление

Еще один прием — применить ColorFilter ко всему представлению кнопок. Это очень простая вещь, но полезная не во всех ситуациях, так как цветовой фильтр будет слепо изменять вид в целом (включая цвет шрифта, границы и т. д.). Однако разумный выбор альфа-канала для цветов может работать в определенных ситуациях.

Я бы предложил LightningColorFilter. Чтобы применить цветовой фильтр к кнопке или к любому представлению, вы можете сделать что-то вроде

myButton.getBackground().setColorFilter(new LightingColorFilter(Color.WHITE, Color.RED));

Узнайте, что означает каждый цвет, здесь: http://developer.android.com/reference/android/graphics/LightingColorFilter.html

person rupps    schedule 03.02.2016
comment
Где вы видите, что я могу установить здесь цвет? - person android developer; 04.02.2016
comment
фон кнопки имеет прямоугольную форму, просто измените <solid android:color="@android:color/white" /> на цвет по вашему выбору - person rupps; 04.02.2016
comment
Я разместил неправильный селектор, но, надеюсь, вы поняли идею. Я обновил селектор ответа. Вы можете видеть, что для нажатого состояния он просто использует прозрачный цвет, а для нажатых состояний - опубликованный рисунок. - person rupps; 04.02.2016
comment
Я не понимаю. Как эффект нажатия может быть белым, если я вижу эффект кнопки, когда помещаю ее в белый вид? Особенно на пред-Лоллипопе я вижу, что он не белый, а темно-серый. - person android developer; 04.02.2016
comment
ну, может быть, я выбрал неправильный xml для темного скина, просто найдите стиль, который вы используете, в github.com/dandar3/android-support-v7-appcompat/blob/master/res/ , там у вас есть то, что использует стиль drawable, на самом деле так просто, как, что. Затем просто создайте настроенный рисунок, настроенный по вашему вкусу. - person rupps; 04.02.2016
comment
Нельзя ли задать цвет оттенка или что-то в этом роде? - person android developer; 04.02.2016
comment
Ну, вы также можете пойти по этому пути, вы можете применить цветовой фильтр, как и к любому представлению, но ... это другой вид спорта, который может соответствовать или не соответствовать вашим потребностям ... Метод, который я описываю, является стандартным подходом к изменению рисунков. Чтобы применить цветовой фильтр к любому представлению, вы можете сделать что-то вроде `myButton.getBackground().setColorFilter(new LightingColorFilter(Color.WHITE, Color.RED)); узнайте, что означает каждый цвет здесь developer.android.com/reference/android/graphics / - person rupps; 04.02.2016
comment
И это будет работать во всех различных состояниях селектора? Кажется милым. Не могли бы вы поместить это в ответ? - person android developer; 05.02.2016
comment
я не пробовал, но должен, так как цветовой фильтр происходит на более высоком уровне, независимо от отрисовки вида - person rupps; 05.02.2016
comment
Есть ли у его использования недостатки? - person android developer; 06.02.2016