Android - 通过数组在点之间绘制线条

时间:2012-06-20 12:25:59

标签: java android arrays mobile

我正在尝试使用for循环通过数组在点之间绘制线条,但我似乎遇到了一些问题。我创建了一个循环遍历数组的for循环但是在尝试使用projection.toPixels(arraylist,point)时;它不断抛出错误。我见过其他人使用它,他们似乎没有出错,请帮忙:

我写的代码如下:

public class MyPositionOverlay extends ItemizedOverlay<OverlayItem> {

public List<GeoPoint> geoPointsArrayList = new ArrayList<GeoPoint>();
public ArrayList<OverlayItem> overlayItemList = new ArrayList<OverlayItem>();
Context context;
int listSize = overlayItemList.size();
//Vector <overlayItemList> vectorList;
public MyPositionOverlay(Drawable marker, Context c) {
    super(boundCenterBottom(marker));
    // TODO Auto-generated constructor stub
    populate();
    context = c;
}
private final int mRadius = 5;
Location location;
public Location getLocation() {
    return location;
}
public void setLocation(Location location) {;
this.location = location;
}

public void addItem(GeoPoint point, String title, String snippet){
    OverlayItem newItem = new OverlayItem(point, title, snippet);
    overlayItemList.add(newItem);
    populate();
}
@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
    Projection projection = mapView.getProjection();
    Double latitude = location.getLatitude()*1E6;
    Double longitude = location.getLongitude()*1E6;
    GeoPoint geoPoint; 
    geoPoint = new 
            GeoPoint(latitude.intValue(),longitude.intValue());
    GeoPoint prePoint = null, currentPoint = null;
    Path linePath = new Path();
    Point screenCoords = new Point();
    Point screenCoords2 = new Point();
    Point lastPoint = new Point();
    Point linePoint = new Point();
    if (shadow == false) {
        // Get the current location    
        // Convert the location to screen pixels     
        Point point = new Point();
        projection.toPixels(geoPoint, point);
        RectF oval = new RectF(point.x - mRadius, point.y - mRadius, 
                point.x + mRadius, point.y + mRadius);
        // Setup the paint
        Paint paint = new Paint();
        paint.setARGB(250, 255, 255, 255);
        paint.setAntiAlias(true);
        paint.setFakeBoldText(true);
        //Text set up
        Paint textPaint = new Paint();
        textPaint.setColor(Color.BLACK);
        Paint backPaint = new Paint();
        backPaint.setARGB(175, 50, 50, 50);
        backPaint.setAntiAlias(true);
        RectF backRect = new RectF(point.x + 2 + mRadius, 
                point.y - 3*mRadius,
                point.x + 65, point.y + mRadius);
        // Draw the marker    
        canvas.drawOval(oval, paint);
        canvas.drawRoundRect(backRect, 5, 5, backPaint);
        canvas.drawText("Here I Am", 
                point.x + 2*mRadius, point.y, 
                textPaint);

        for (int j = 1; j < overlayItemList.size();j++){
            linePath.setLastPoint(4, j - 1);
            linePath.lineTo(4, j);
        }
        linePath.close();
        canvas.drawPath(linePath, linePaint);
    } // End of If statement
    super.draw(canvas, mapView, shadow);
} // End of draw method
public void drawLine(MapView mapView){

    System.out.println("Drawing line");
    Path linePath = new Path();
    Canvas lineCanvas = new Canvas();
    Projection lineProjection = mapView.getProjection();


    //Line Settings
    Paint linePaint = new Paint();
    linePaint.setStyle(Style.FILL);
    linePaint.setStrokeWidth(2);
    linePaint.setARGB(0, 0, 0, 255);
    linePaint.setAntiAlias(true);
    linePaint.setStrokeJoin(Paint.Join.ROUND);
    linePaint.setStrokeCap(Paint.Cap.ROUND);
    /****************************************************************************/

    for (int k = 0; k<overlayItemList.size(); k++){
        if(k == overlayItemList.size() -1){
            break;
        }
        Point from = new Point();
        Point to = new Point();

        lineProjection.toPixels(overlayItemList.get(k), from);
        lineProjection.toPixels(overlayItemList.get(k + 1), to);

        linePath.moveTo(from.x, from.y);
        linePath.lineTo(to.x, to.y);
    }

    lineCanvas.drawPath(linePath, linePaint);


}//End of drawLine method

} *

1 个答案:

答案 0 :(得分:1)

  

投影类型中的方法toPixels(GeoPoint,Point)不适用于参数(OverlayItem,Point)

您收到此错误是因为您尝试将类型为OverlayItem的对象传递给期望类型为GeoPoint的对象的方法。这不起作用,因为OverlayItem不会从GeoPoint延伸。它确实有一个getPoint()方法,可以返回叠加层的GeoPoint,因此您可以使用它。

在您的代码中,您只需更改以下两行:

lineProjection.toPixels(overlayItemList.get(k), from);
lineProjection.toPixels(overlayItemList.get(k + 1), to);

这些行应该是

lineProjection.toPixels(overlayItemList.get(k).getPoint(), from);
lineProjection.toPixels(overlayItemList.get(k + 1).getPoint(), to);