I wrote this code a while back. The requirement was to have a user draw a circle with the ESRI Android SDK. Well, their Android SDK doesn't currently support drawing circles. It draws all other types of polygons except for the circle. So what does a Software Engineer do, we come up with our own implementation.
So for the world to see, here it is:
First we capture the OnMotionEvent and the comments are in line.
Hope this helps someone.
public boolean onDragPointerMove(MotionEvent from, MotionEvent to) {
if (tempCircleGraphic != null)
_graphicsLayer.removeGraphic(tempCircleGraphic);
// creates a new polygon to be drawn.
_circleTemp = new Polygon();
Point point = _map.toMapPoint(to.getX(), to.getY());
// If the starting point is null, create a polyline and start a
// path.
if (_startPoint == null) {
_startPoint = _map.toMapPoint(from.getX(), from.getY());
// creates a polyline so we can measure the radius of the
// person
// drawing the circle.
_polylineTemp = new Polyline();
// starts the poly line
_polylineTemp.startPath(_startPoint.getX(), _startPoint.getY());
}
// continues the draw of the poly line
_polylineTemp.lineTo((float) point.getX(), (float) point.getY());
// calculates the circle when getting ready to be drawn.
int pointsAroundCircle = 50; // N
double radius = _polylineTemp.calculateLength2D(); // radius
for (int i = 0; i < pointsAroundCircle; i++) {
double fi = 2 * Math.PI * i / pointsAroundCircle;
double x = radius * Math.sin(fi + Math.PI) + _startPoint.getX();
double y = radius * Math.cos(fi + Math.PI) + _startPoint.getY();
if (i == 0) // starts the drawing of the circle. if
// beginning
// the for loop
_circleTemp.startPath(x, y);
else if (i == pointsAroundCircle - 1) // ends the circle
// when at
// the end of the
// for loop.
_circleTemp.closeAllPaths();
else
// continues drawing the cirlce while it iterates
_circleTemp.lineTo(x, y);
}
// creates a new graphic and sets the geometry to a polygon.
Graphic graphic = new Graphic();
graphic.setGeometry(_circleTemp);
int drawColor = getDrawColor();
int transparentColor = Color.argb(POLYGON_ALPHA, Color.red(drawColor),
Color.green(drawColor), Color.blue(drawColor));
SimpleFillSymbol fillSymbol = new SimpleFillSymbol(transparentColor);
graphic.setSymbol(fillSymbol);
tempCircleGraphic = graphic;
// add the updated graphic to graphics layer
_graphicsLayer.addGraphic(graphic);
// Refresh the graphics layer
_graphicsLayer.postInvalidate();
return true;
}