我正在制作一个简单的Android应用,用于在地图上绘制路线。一切进展顺利,但在放大我的三星Galaxy S2时我遇到了一个问题。它在Galaxy S3上工作正常,所以我想知道它是否与较低规格的设备上的内存管理有关。它也可以在模拟器上正常工作。
以下是覆盖onDraw方法的等效代码,只是为了在此处发布而压缩:
Point current = new Point();
Path path = new Path();
Projection projection = mapView.getProjection();
Iterator<GeoPoint> iterator = pointList.iterator();
if (iterator.hasNext()) {
projection.toPixels(iterator.next(), current);
path.moveTo((float) current.x, (float) current.y);
} else return path;
while(iterator.hasNext()) {
projection.toPixels(iterator.next(), current);
path.lineTo((float) current.x, (float) current.y);
}
Paint roadPaint = new Paint();
roadPaint.setAntiAlias(true);
roadPaint.setStrokeWidth(8.0f);
roadPaint.setColor(Color.BLACK);
roadPaint.setStyle(Paint.Style.STROKE);
canvas.drawPath(path, roadPaint);
与大多数样本代码相比,它并没有太大的不同。我只是想知道是否有人可以证实我的怀疑,并建议我在配置或调整方面是否可以采取任何措施来强制在所有缩放级别进行绘制?
提前致谢。
干杯, 森
答案 0 :(得分:1)
问题在于您是否正在为地图视图的特定状态绘制叠加层。您应该使用OverlayItem代替。
OverlayItem被添加到MapView覆盖集合中,并且MapView根据它自己的状态(缩放,位置等)处理所有重新绘制
@Override
public void draw( Canvas canvas, MapView mapView, boolean shadow )
{
super.draw( canvas, mapView, shadow );
int x1 = -1;
int y1 = -1;
int x2 = -1;
int y2 = -1;
Paint paint = new Paint();
paint.setStyle( Paint.Style.STROKE );
paint.setColor( GeoLocation.ROUTE_COLOR );
paint.setStrokeWidth( STROKE_WIDTH );
for ( int i = 0; i < mRouteGeoPoints.size(); i++ )
{
Point point = new Point();
mapView.getProjection().toPixels( geoPoints.get( i ), point );
x2 = point.x;
y2 = point.y;
if ( i > 0 )
{
canvas.drawLine( x1, y1, x2, y2, paint );
}
x1 = x2;
y1 = y2;
}
}
答案 1 :(得分:0)
你说上面的代码是等价的(不是你正在运行的真实代码)而且很明显,因为你在Path
中返回了onDraw()
对象,你不能。
您展示的代码的“压缩形式”应该与使用drawLine()
一样有效。所以问题应该来自别的东西(可能是原始代码)。
无论如何,我会给你一些提示:
如果由于某种原因你真的想使用较慢的drawLine()
方法,你可以使用以下方法使线看起来更好:
paint = new Paint();
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeJoin(Paint.Join.ROUND);
paint.setStrokeCap(Paint.Cap.ROUND);
paint.setColor(...);
paint.setAlpha(...);
paint.setStrokeWidth(...);
最后,如果问题仍然存在,请使用更相关的代码更新您的问题并告知我们。也许我可以进一步提供帮助。
问候。