Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android: How to determine if a touch event is in a circle?

I want to play a media when i touch a circular area, but how can I could determine that my touch position is in the circle?

So far I extend a view and implement the onTouchEvent, and I need the algorithm for deciding if the position is inside or outside the circle.

like image 781
Camus Avatar asked Jan 09 '13 04:01

Camus


2 Answers

You should take position of the view with View.getX() and View.getY() to get x and y of the upper left corner and also assuming You know the radius (or able to obtain width/height of the view to determine radius). After that, obtain xTouch and yTouch using MotionEvent.getX() and MotionEvent.getY() and check if:

double centerX = x + radius;
double centerY = y + radius;
double distanceX = xTouch - centerX;
double distanceY = yTouch - centerY;

boolean isInside() {
    return (distanceX * distanceX) + (distanceY * distanceY) <= radius * radius;
}

The formula is just interpretation of schools geometry for determining if dot is inside circle area or not. Refer to circle equation for Cartesian coordinates for more details.

Values explanation is:

(x + radius) and (y + radius) is the center of circle.

(xTouch - (x + radius)) is distance from touch point to center by X.

(yTouch - (y + radius)) is distance from touch point to center by Y.

like image 131
sandrstar Avatar answered Nov 12 '22 18:11

sandrstar


Another way to do this, and a little simpler I think, is to use the distance between two points formula and compare that distance to your radius. If the calculated distance is less than the radius then the touch is inside your circle.

Here the code

// Distance between two points formula
float touchRadius = (float) Math.sqrt(Math.pow(touchX - mViewCenterPoint.x, 2) + Math.pow(touchY - mViewCenterPoint.y, 2));

if (touchRadius < mCircleRadius)
{
    // TOUCH INSIDE THE CIRCLE!
}
like image 41
Jona Avatar answered Nov 12 '22 18:11

Jona