Android - Draw a path (array of points) in MapView

来源:互联网 发布:欧洲四猪 知乎 编辑:程序博客网 时间:2024/05/23 15:46

Although this post differs from my blog routine I am writing because I haven’t found an efficient way of displaying a list of GeoPoints to a MapView. This is often useful when you want to display directions from Google service inside your Android application.

Key features:

  • A custom overlay that extends com.google.android.maps.Overlay
  • Efficient way of displaying a path. The path is drawn over the same overlay.
  • Smooth Lines, useful when there are a lot of corners like the example below
  • Easy to use
  • Easy to extend  - Just under 90 lines of code
  • Available on Bitbucket

Here is a sample result of using my overlay to display a list of points (The green marker is not included).

You can use it like this

List<GeoPoint> path = new ArrayList<GeoPoint>();//add your points somehow...mapView.getOverlays().add(new RoutePathOverlay(path));

Here is the complete RoutePathOverlay.java (it's also available on Bitbucket)
import java.util.List;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Path;import android.graphics.Point;import android.graphics.RectF;import com.google.android.maps.GeoPoint;import com.google.android.maps.MapView;import com.google.android.maps.Overlay;import com.google.android.maps.Projection; public class RoutePathOverlay extends Overlay {         private int _pathColor;        private final List<GeoPoint> _points;        private boolean _drawStartEnd;         public RoutePathOverlay(List<GeoPoint> points) {                this(points, Color.RED, true);        }         public RoutePathOverlay(List<GeoPoint> points, int pathColor, boolean drawStartEnd) {                _points = points;                _pathColor = pathColor;                _drawStartEnd = drawStartEnd;        }         private void drawOval(Canvas canvas, Paint paint, Point point) {                Paint ovalPaint = new Paint(paint);                ovalPaint.setStyle(Paint.Style.FILL_AND_STROKE);                ovalPaint.setStrokeWidth(2);                int _radius = 6;                RectF oval = new RectF(point.x - _radius, point.y - _radius, point.x + _radius, point.y + _radius);                canvas.drawOval(oval, ovalPaint);                       }         public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when) {                Projection projection = mapView.getProjection();                if (shadow == false && _points != null) {                        Point startPoint = null, endPoint = null;                        Path path = new Path();                        //We are creating the path                        for (int i = 0; i < _points.size(); i++) {                                GeoPoint gPointA = _points.get(i);                                Point pointA = new Point();                                projection.toPixels(gPointA, pointA);                                if (i == 0) { //This is the start point                                        startPoint = pointA;                                        path.moveTo(pointA.x, pointA.y);                                } else {                                        if (i == _points.size() - 1)//This is the end point                                                endPoint = pointA;                                        path.lineTo(pointA.x, pointA.y);                                }                        }                         Paint paint = new Paint();                        paint.setAntiAlias(true);                        paint.setColor(_pathColor);                        paint.setStyle(Paint.Style.STROKE);                        paint.setStrokeWidth(5);                        paint.setAlpha(90);                        if (getDrawStartEnd()) {                                if (startPoint != null) {                                        drawOval(canvas, paint, startPoint);                                }                                if (endPoint != null) {                                        drawOval(canvas, paint, endPoint);                                }                        }                        if (!path.isEmpty())                                canvas.drawPath(path, paint);                }                return super.draw(canvas, mapView, shadow, when);        }         public boolean getDrawStartEnd() {                return _drawStartEnd;        }         public void setDrawStartEnd(boolean markStartEnd) {                _drawStartEnd = markStartEnd;        }}


转帖:http://john.katsiotis.com/blog/android---draw-a-path-array-of-points-in-mapview

原创粉丝点击