Одним из возможных решений, которое я могу придумать, является использование LayerDrawable
в качестве topDrawable вашего TextView. Я обрисую идею, перечислю некоторые детали и прикреплю ссылку на измененный пример проекта ниже.
Код для кнопки (в файле макета):
<Button android:id="@+id/home_btn_schedule"
style="@style/DPDashBoardButton"
android:text="button 1"
android:drawableTop="@drawable/dashboard_icon_bg_selector" />
Две LayerDrawables, одна для состояния «нажатие / фокусировка / выделение» и одна для каждого другого состояния (покой):
dashboard_icon_layer_background_selected.xml:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/dashboard_icon_background_selected" />
<item android:bottom="14dip">
<bitmap android:src="@drawable/btn_star_big_on_pressed"
android:gravity="center" />
</item>
</layer-list>
dashboard_icon_layer_background_rest.xml:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/dashboard_icon_background_rest" />
<item android:bottom="14dip">
<bitmap android:src="@drawable/btn_star_big_on_rest"
android:gravity="center" />
</item>
</layer-list>
Некоторые особенности этого конкретного примера:
- Причина, по которой звездные изображения упоминаются как растровые изображения, заключается в том, что Android не может масштабировать их до полной ширины и высоты контейнера. Нижнее расстояние добавляется, чтобы фактически центрировать звезду относительно фонового изображения (textSize = 12, плюс 2 для отступа), что, честно говоря, довольно уродливо для такого жесткого кода. Без этого смещения центрированная гравитация поместит изображение звезды в центр всего контейнера, включая пространство, которое добавляет текст.
- Таким образом, замена элемента растровым изображением на
<item android:drawable="@drawable/btn_star_big_on_rest" />
приведет к увеличению масштаба изображения звезды. Просто попробуйте один раз, чтобы понять эффект.
- Это явление весьма прискорбно, поскольку мы можем сослаться на другой XML-файл, который можно нарисовать выше, используя все его уже определенные состояния! Вот почему мне фактически пришлось скопировать два звездных изображения из репозитория Android: вы не можете ссылаться на XML, который можно рисовать как источник растрового изображения, и на реальные изображения также нельзя ссылаться публично. Попробуйте заменить определение растрового изображения на
<item android:drawable="@android:drawable/btn_star" />
, чтобы увеличить масштаб изображения, но сохраните предварительно определенные состояния без изменений.
- Вы могли бы потенциально обойти проблему масштабирования, создав 9 патчей из звездных изображений, сделав StateListDrawable для различных состояний и ссылаясь на получаемый XML-объект, который можно нарисовать в элементе слоя. Хотя Android по-прежнему растягивает все изображение до полного размера контейнера, 9 патчей могут обеспечить масштабирование только прозрачных пикселей.
- // Редактировать: я понял, что есть еще одно ограничение в этом подходе, так как нажатие на текст не изменит состояние значка. Это может быть то, что вам нужно, но лично я бы сказал, что с точки зрения пользователя было бы целесообразно, чтобы все это реагировало на сенсорные события ...
Надеюсь, это имеет смысл! Просто чтобы показать вам результат: левый - все в состоянии покоя, правый - при нажатии на верхнюю кнопку.
Застегнутый проект здесь.