Я думаю, что проще всего было бы создать типичный рисуемый объект с несколькими состояниями и реплицировать свойства рисования кнопок 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