Установка отступов в 9-patch не работала для меня.Установка отступов в сенсорных слушателях грязная, будет ли мусорить код везде, где используются кнопки.
Я пошел с подклассами Button
, и это оказалось довольно аккуратно.В моем случае я хотел сместить значок (drawableLeft
) и текст на 1 пиксель влево и на 1 пиксель вниз.
Виджет кнопки с подклассами:
package com.myapp.widgets;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.Button;
import com.myapp.R;
public class OffsetButton extends Button {
public OffsetButton(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public OffsetButton(Context context, AttributeSet attrs) {
super(context, attrs);
}
public OffsetButton(Context context) {
super(context);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
boolean value = super.onTouchEvent(event);
if (event.getAction() == MotionEvent.ACTION_UP) {
setBackgroundResource(R.drawable.btn_normal);
} else if (event.getAction() == MotionEvent.ACTION_DOWN) {
setBackgroundResource(R.drawable.btn_pressed);
setPadding(getPaddingLeft() + 1, getPaddingTop() + 1, getPaddingRight() - 1,
getPaddingBottom() - 1);
}
return value;
}
}
И используйте его в макете следующим образом:
<com.myapp.widgets.OffsetButton
android:text="@string/click_me"
android:drawableLeft="@drawable/icon_will_be_offset_too_thats_good" />
Несколько заметок:
Я не не использовал StateListDrawable
для фона, а вместо этого переключаю фон в коде.Когда я пытался использовать StateListDrawable
, между сменой отступов и изменением фона возникала небольшая пауза.Это выглядело не очень хорошо.
Настройка фона сбрасывает отступы, поэтому не нужно настраивать отступ в ACTION_UP
случае
Itбыло важно увеличить верхний и левый отступы, а одновременно уменьшить нижний и правый отступы.Таким образом, размер области содержимого остается неизменным, а область содержимого фактически просто смещается.