The way I handle these kinds of 2D physics is to process the X and Y components of the vector separately.
That way if a collision occurs, I know which direction the collider was moving along based on the sign and component of the velocity vector I am processing.
Then when a collision occurs, you can modify the velocity on the appropriate axis. Changing the sign simulates a bounce, while multiplying it by a negative number (eg 0.5) can simluate a bounce where some energy is lost.
For your code
/* Move along X Axis */ for (int i = 0; i < collisionList.size(); i++){ Vec2<Integer> c = collisionList.get(i); int cx = c.getX(); int cy = c.getY(); if (distance(x, y, cx, cy) <= (r - (r / 2))){ xVel = -xVel; } } /* Move along Y Axis */ for (int i = 0; i < collisionList.size(); i++){ Vec2<Integer> c = collisionList.get(i); int cx = c.getX(); int cy = c.getY(); if (distance(x, y, cx, cy) <= (r - (r / 2))){ yVel = -yVel; } }