Tom
Это правда, что если вы переопределяете состояние по умолчанию, вы также должны переопределить нажатые и сфокусированные состояния. Причина заключается в том, что по умолчанию для рисования Android используется селектор, поэтому переопределение его статической прорисовкой означает, что вы теряете информацию о состоянии для нажатых и выделенных состояний, поскольку для вас указана только одна отрисовка. Впрочем, реализовать собственный селектор очень просто. Сделайте что-то вроде этого:
<selector
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/custombutton">
<item
android:state_focused="true"
android:drawable="@drawable/focused_button" />
<item
android:state_pressed="true"
android:drawable="@drawable/pressed_button" />
<item
android:state_pressed="false"
android:state_focused="false"
android:drawable="@drawable/normal_button" />
</selector>
Поместите это в свой каталог drawables и загрузите его как обычный drawable для фона ImageButton. Самое сложное для меня - это создание реальных изображений.
Edit:
Только что покопался в источнике EditText, и вот как они установили фон для рисования:
public EditText(/*Context context, AttributeSet attrs, int defStyle*/) {
super(/*context, attrs, defStyle*/);
StateListDrawable mStateContainer = new StateListDrawable();
ShapeDrawable pressedDrawable = new ShapeDrawable(new RoundRectShape(10,10));
pressedDrawable.getPaint().setStyle(Paint.FILL);
pressedDrawable.getPaint().setColor(0xEDEFF1);
ShapeDrawable focusedDrawable = new ShapeDrawable(new RoundRectShape(10,10));
focusedDrawable.getPaint().setStyle(Paint.FILL);
focusedDrawable.getPaint().setColor(0x5A8AC1);
ShapeDrawable defaultDrawable = new ShapeDrawable(new RoundRectShape(10,10));
defaultDrawable.getPaint().setStyle(Paint.FILL);
defaultDrawable.getPaint().setColor(Color.GRAY);
mStateContainer.addState(View.PRESSED_STATE_SET, pressedDrawable);
mStateContainer.addState(View.FOCUSED_STATE_SET, focusedDrawable);
mStateContainer.addState(StateSet.WILD_CARD, defaultDrawable);
this.setBackgroundDrawable(mStateContainer);
}
Я уверен, что вы могли бы адаптировать эту идею к вашим целям. Вот страница, на которой я ее нашел:
http://www.google.com/codesearch/p?hl=en#ML2Ie1A679g/src/android/widget/EditText.java