Обычно для подобных задач - я создал список слоев, который можно нарисовать так:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="@color/underlineColor"/>
</shape>
</item>
<item android:bottom="3dp">
<shape android:shape="rectangle">
<solid android:color="@color/buttonColor"/>
</shape>
</item>
Идея состоит в том, что сначала вы рисуете прямоугольник с помощью underlineColor, а затем поверх этого вы рисуете другой прямоугольник с фактическим buttonColor, но применяя bottomPadding. Это всегда работает.
Но когда мне нужно, чтобы buttonColor был прозрачным, я не мог использовать вышеприведенный объект. Я нашел еще одно решение
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="@android:color/transparent"/>
</shape>
</item>
<item android:drawable="@drawable/white_box" android:gravity="bottom" android:height="2dp"/>
</layer-list>
(как вы можете видеть здесь, mainButtonColor прозрачен, а white_box - это простой прямоугольник, который можно нарисовать белым цветом)