我工作的一个简单的Android应用时,在地图上绘制路线。 一切都进展顺利,但在我的三星Galaxy S2放大时,我有一个问题。 它适用于银河S3罚款,所以我不知道是否它的内存管理相关的较低specced设备上。 它还在模拟器上正常工作。
下面是等效的代码位于该覆盖的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);
这不是太不相似的大部分示例代码左右浮动这样做的。 我只是想知道如果任何人都可以证实我的怀疑,并建议如果有什么我可以配置或调整方面做,我可以做强制在所有缩放级别绘图?
提前致谢。
欢呼声,弥敦道
你说上面的代码是等效的(不是你正在运行的实际代码),因为你是返回一个很清晰的Path
在对象onDraw()
你不能。
“压缩形式”的代码,你应该展示工作,以及使用drawLine()
所以,问题应该来自别的东西(可能原码)。
无论如何,我给你一对夫妇的提示:
- 当对象的你是画在画布的顶部和底部都出入画面时,物体会被忽略,而不是绘制。 检查,如果这不是什么与你的路径发生。 见我的答案在这个岗位Android的地图覆盖图上放大消失
- 你不需要每次重建的路径对象。 你可能已经在做了,这就是为什么你做上面的短版。 请参阅这篇文章的一些建议,以改善道路图纸我的答案: 覆盖操作变焦时
如果由于某种原因,你真的想用较慢的方法drawLine()
您可以使用follwing使线更好看:
paint = new Paint(); paint.setStyle(Paint.Style.STROKE); paint.setStrokeJoin(Paint.Join.ROUND); paint.setStrokeCap(Paint.Cap.ROUND); paint.setColor(...); paint.setAlpha(...); paint.setStrokeWidth(...);
最后,如果问题仍然存在,与更多的相关代码更新您的问题,让我知道。 也许我可以进一步帮助。
问候。
问题是,你是你自己画的覆盖了的MapView的一个非常特殊的状态。 您应该使用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;
}
}