如何在 Google 地图 Android SDK 中的折线之上添加形状
How to add shape on top of polylines in Google Maps Android SDK
我有一个应用程序,其中包含使用 Google 地图 Android SDK 以及 Polyline
和 PolylineOptions
[=23] 在源点和目标点之间绘制多段线的代码=].
我的问题是如何添加一个小形状 - 例如,从源指向目标的箭头,绘制在多段线的顶部 - 以便通过缩放和旋转来改变它的方向和角度地图 UI,很像流行导航应用程序中的标准箭头吗?
如有任何帮助,我们将不胜感激。
无论如何,您可以创建基于 MapView-
或 MapFragment-
的自定义视图并绘制任何您想要的内容(如 中的回答)。在这种情况下,您需要直接在自定义视图 canvas 上绘制折线,而不是通过使用 Google 地图 Polyline
。
如果你想在你需要的路径段的中间绘制单箭头:
确定方向,例如,computeHeading() method of SphericalUtil
class of Maps SDK for Android Utility Library;
确定路径段的中间,例如,via interpolate()
method of SphericalUtil
class:
LatLng middle = interpolate(from, to, 0.5);
如果您想沿着所有折线绘制小箭头,您可以使用 setPathEffect()
方法 Paint
来自定义线条样式class。为此,您应该为“箭头标记”(以像素为单位)创建路径,这将重复每个“前进”(也以像素为单位)-完全像 示例中的“钻石”:
mPathDiamondStamp = new Path();
mPathDiamondStamp.moveTo(-DIAMOND_WIDTH / 2, 0);
mPathDiamondStamp.lineTo(0, DIAMOND_HEIGHT / 2);
mPathDiamondStamp.lineTo(DIAMOND_WIDTH / 2, 0);
mPathDiamondStamp.lineTo(0, -DIAMOND_HEIGHT / 2);
mPathDiamondStamp.close();
mPathDiamondStamp.moveTo(-DIAMOND_WIDTH / 2 + DIAMOND_BORDER_WIDTH, 0);
mPathDiamondStamp.lineTo(0, -DIAMOND_HEIGHT / 2 + DIAMOND_BORDER_WIDTH / 2);
mPathDiamondStamp.lineTo(DIAMOND_WIDTH / 2 - DIAMOND_BORDER_WIDTH, 0);
mPathDiamondStamp.lineTo(0, DIAMOND_HEIGHT / 2 - DIAMOND_BORDER_WIDTH / 2);
mPathDiamondStamp.close();
mPathDiamondStamp.setFillType(Path.FillType.EVEN_ODD);
mDiamondPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mDiamondPaint.setColor(Color.BLUE);
mDiamondPaint.setStrokeWidth(2);
mDiamondPaint.setStyle(Paint.Style.FILL_AND_STROKE);
mDiamondPaint.setStyle(Paint.Style.STROKE);
mDiamondPaint.setPathEffect(new PathDashPathEffect(mPathDiamondStamp, DIAMOND_ADVANCE, DIAMOND_PHASE, PathDashPathEffect.Style.ROTATE));
在这种情况下,所有“通过缩放和旋转地图 UI 来改变方向和角度”的工作都在处理 Paint
class 为您“开箱即用” - 您只需需要设置“印章”样式和印章之间的间隔。
要将 LatLng
坐标转换为屏幕坐标,您可以使用 toScreenLocation()
of Projection
class。因此,根据 MapView
或 SupportMapFragment
制作自定义视图,并使用 Canvas
和 Paint
.
绘制任何你想要的东西
Here and there 您还可以找到很好的 setPathEffect()
用法示例。
我有一个应用程序,其中包含使用 Google 地图 Android SDK 以及 Polyline
和 PolylineOptions
[=23] 在源点和目标点之间绘制多段线的代码=].
我的问题是如何添加一个小形状 - 例如,从源指向目标的箭头,绘制在多段线的顶部 - 以便通过缩放和旋转来改变它的方向和角度地图 UI,很像流行导航应用程序中的标准箭头吗?
如有任何帮助,我们将不胜感激。
无论如何,您可以创建基于 MapView-
或 MapFragment-
的自定义视图并绘制任何您想要的内容(如 Polyline
。
如果你想在你需要的路径段的中间绘制单箭头:
确定方向,例如,computeHeading() method of
SphericalUtil
class of Maps SDK for Android Utility Library;确定路径段的中间,例如,via
interpolate()
method ofSphericalUtil
class:LatLng middle = interpolate(from, to, 0.5);
如果您想沿着所有折线绘制小箭头,您可以使用 setPathEffect()
方法 Paint
来自定义线条样式class。为此,您应该为“箭头标记”(以像素为单位)创建路径,这将重复每个“前进”(也以像素为单位)-完全像
mPathDiamondStamp = new Path();
mPathDiamondStamp.moveTo(-DIAMOND_WIDTH / 2, 0);
mPathDiamondStamp.lineTo(0, DIAMOND_HEIGHT / 2);
mPathDiamondStamp.lineTo(DIAMOND_WIDTH / 2, 0);
mPathDiamondStamp.lineTo(0, -DIAMOND_HEIGHT / 2);
mPathDiamondStamp.close();
mPathDiamondStamp.moveTo(-DIAMOND_WIDTH / 2 + DIAMOND_BORDER_WIDTH, 0);
mPathDiamondStamp.lineTo(0, -DIAMOND_HEIGHT / 2 + DIAMOND_BORDER_WIDTH / 2);
mPathDiamondStamp.lineTo(DIAMOND_WIDTH / 2 - DIAMOND_BORDER_WIDTH, 0);
mPathDiamondStamp.lineTo(0, DIAMOND_HEIGHT / 2 - DIAMOND_BORDER_WIDTH / 2);
mPathDiamondStamp.close();
mPathDiamondStamp.setFillType(Path.FillType.EVEN_ODD);
mDiamondPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mDiamondPaint.setColor(Color.BLUE);
mDiamondPaint.setStrokeWidth(2);
mDiamondPaint.setStyle(Paint.Style.FILL_AND_STROKE);
mDiamondPaint.setStyle(Paint.Style.STROKE);
mDiamondPaint.setPathEffect(new PathDashPathEffect(mPathDiamondStamp, DIAMOND_ADVANCE, DIAMOND_PHASE, PathDashPathEffect.Style.ROTATE));
在这种情况下,所有“通过缩放和旋转地图 UI 来改变方向和角度”的工作都在处理 Paint
class 为您“开箱即用” - 您只需需要设置“印章”样式和印章之间的间隔。
要将 LatLng
坐标转换为屏幕坐标,您可以使用 toScreenLocation()
of Projection
class。因此,根据 MapView
或 SupportMapFragment
制作自定义视图,并使用 Canvas
和 Paint
.
Here and there 您还可以找到很好的 setPathEffect()
用法示例。