atributo personalizado en el botón personalizado no se muestra

Extendí el widget Button para poder aplicar varios atributos personalizados.
Uno de los atributos es un filtro de color que trato de aplicar a su fondo cuando se crea el botón. No funciona. (Vea las capturas de pantalla y el código a continuación)
Intenté establecer directamente el color de fondo, en el mismo lugar del código, y cambia el color de fondo, pero no es lo que necesito, ya que estoy usando mis propios PNG de botones.

hay 2 problemas hasta ahora:

El filtro de color no se aplica.El botón personalizado se desplaza, se recorta y no se puede hacer clic

El segundo botón utiliza el botón normal, se coloca como se espera y se puede hacer clic. La segunda captura de pantalla muestra que, de hecho, se elige el color correcto, y que es posible cambiar el color de fondo del botón en ese punto del código.

Código:

public class MyButton extends Button {
    private int backGroundColor;

    public MyButton(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        TypedArray a = context.getTheme().obtainStyledAttributes(
            attrs, 
            R.styleable.MyButton, 
            defStyle, 
            0);

        try {
            Resources res = getResources();
            switch( a.getInteger(R.styleable.MyButton_type, 0) ) {
            case 0: 
                backGroundColor = res.getColor(R.color.Black); break;
            case 1: 
                backGroundColor = res.getColor(R.color.Red); break;
            case 2: 
                backGroundColor = res.getColor(R.color.DimGray); break;
            }
            getBackground().setColorFilter(backGroundColor, Mode.MULTIPLY);
            //setBackgroundColor(backGroundColor)
        } finally {
            a.recycle();
        }
    }
    public MyButton(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }
    public MyButton(Context context) {
        this(context, null, 0);
    }
}

El XML que utilicé:

<LinearLayout 
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <com.example.test.MyButton
        android:id="@+id/btn1"
        android:text="BTN1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:textSize="14sp"
        android:textColor="@color/Blue"
        android:padding="2dp"
        android:layout_margin="4dp"
        android:background="@drawable/key_selector"
        app:type="RedButton"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:textSize="14sp"
        android:textColor="@color/Blue"
        android:padding="2dp"
        android:layout_margin="4dp"
        android:background="@drawable/key_selector"
        android:id="@+id/btn2"
        android:text="BTN2"/>
</LinearLayout>

Captura de pantalla del resultado de setColorFilter ()

Captura de pantalla del resultado de setBackgroundColor ()

EDITAR Este es el selector XML que uso para los estados normales y presionados.

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:drawable="@drawable/key1_pressed"
        android:state_pressed="true"/>

    <item 
        android:drawable="@drawable/key1"/>


</selector>

Respuestas a la pregunta(1)

Su respuesta a la pregunta