In order to reset the ActionButton state on an UP_ACTION outside of the view bounds, I had to include the following workaround:
actionButton.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(@NonNull View view, @NonNull MotionEvent event) {
int action = event.getAction();
if((action == MotionEvent.ACTION_CANCEL) || (action == MotionEvent.ACTION_UP)) {
actionButton.setState(ActionButton.State.NORMAL); // fix ripple handling
}
return false; // default handling
}
});