Как выровнять текст по вертикали в кнопке с нарисованным фоном? - PullRequest
3 голосов
/ 06 мая 2010

У меня была простая кнопка с фоновым изображением, определенным как

android:background="?attr/button"

где ?attr/button было ссылкой на простой 9-патчовый png. Все работало нормально, текст в кнопке был выровнен правильно.

Тогда мне нужно было иметь другой фон для нажатого состояния кнопки. Поэтому я изменил это на

android:background="@drawable/state_button"

где @drawable/state_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/button_pressed" /> <!-- pressed -->
    <item android:state_focused="true"
        android:drawable="@drawable/button_pressed" /> <!-- focused -->
    <item android:drawable="@drawable/button" /> <!-- default -->
</selector>

И после этого я не могу правильно выровнять текст. Если я поставлю android:gravity="center_vertical", текст будет нарисован примерно на 1/4 высоты кнопки сверху.

Я дважды проверил свои 9-патч-образы, с ними все в порядке. И я также попытался использовать обычные png для фона, это тоже ничего не меняет.

Ответы [ 2 ]

1 голос
/ 17 ноября 2010

У меня была точно такая же проблема, но мои 9 прорисовок патча были в порядке. Причина была все та же, просто я использовал пользовательские элементы рисования, используя элемент layer-list.

Похоже, что когда Button выкладывает свой текст, она учитывает все состояний в вашем селекторе. Как только я обновил все состояния, чтобы они соответствовали друг другу, мой текст впоследствии выровнялся правильно.

1 голос
/ 06 мая 2010

Вы должны дважды проверить 9 используемых патчей. Стандартные кнопки Android содержат огромное количество отступов вверху и внизу кнопок, благодаря чему текст выглядит всегда по центру. Вы можете увидеть это, открыв файл с 9 патчами, увеличив масштаб и посмотрев на разницу между пикселями слева / сверху и справа / снизу. Левые / верхние стороны отмечают, какие части изображения могут быть растянуты, чтобы вместить больше текста, а правые / нижние стороны отмечают пространство, которое фактически будет заполнено текстом. Таким образом, разница между правой / нижней стороной и левой / верхней частью будет заполнением. Сначала это не имеет смысла, но после игры с ним все не так плохо.

На тот случай, если вы не знакомы с ним, полезным инструментом для редактирования 9patches является программа draw9patch.bat в папке инструментов SDK.

...