Android 如何在谷歌地图的多段线上添加文字?
我有两个标记,我想在它们之间画一条线,并有一个文本显示线上方的距离,就像谷歌地图的网络版一样Android 如何在谷歌地图的多段线上添加文字?,android,google-maps,google-maps-android-api-2,Android,Google Maps,Google Maps Android Api 2,我有两个标记,我想在它们之间画一条线,并有一个文本显示线上方的距离,就像谷歌地图的网络版一样 我已经找到了关于在两个标记之间绘制一条线的示例,但是如何在该线上方添加文本?一个想法是使用两个标记的横向坐标和纵向坐标计算两个标记之间的中点,然后放置一个包含您想要显示的任何信息的信息窗口。或者类似下面的内容可能会有所帮助:我遇到了一个情况,可以显示多段线上方两个标记之间的距离 以下是我的要求: 我设法用另一种方式来实现它,这是一种非常有趣的方式,通过这种方式你可以定制它来实现任何事情 步骤: 使用
我已经找到了关于在两个标记之间绘制一条线的示例,但是如何在该线上方添加文本?一个想法是使用两个标记的横向坐标和纵向坐标计算两个标记之间的中点,然后放置一个包含您想要显示的任何信息的信息窗口。或者类似下面的内容可能会有所帮助:我遇到了一个情况,可以显示多段线上方两个标记之间的距离 以下是我的要求: 我设法用另一种方式来实现它,这是一种非常有趣的方式,通过这种方式你可以定制它来实现任何事情 步骤:
Layout XML
文件,并创建要为文本显示的任何类型的UI
。在我的例子中,它只包含一个TextView
文本视图中设置计算的距离
XML布局
转换为位图
位图
对象创建一个位图描述符
位图描述符添加自定义标记,即可完成
希望它能帮助您。好主意,但根据,一次只能看到一个信息窗口,并且必须绑定到标记。因此,我必须使用一个不可见的标记,而不使用任何其他信息窗口。或者另一个想法是自定义覆盖。使用文本作为行顶部的自定义覆盖。但我怀疑这是否更容易实现。不幸的是,目前似乎还没有支持的将文本附加到多段线的方法。与此同时,我已经尝试了infowindow hack,速度非常慢。我需要在每次拖动事件中更新它,使其处于正确的位置,即使只有一个textview,速度也非常慢~拖动过程中1-2fps(在galaxy tab GT-P5200上)。如果最终得到更好的解决方案,请告诉我。我一直在寻找一个更好的答案。我可能会坚持你的答案(信息窗口的位置可能每5次就更新一次,甚至只更新一次):)正是我所需要的,你在@gprathour为我节省了一天,谢谢。@AmitabhSarkar Welcome:)你是怎么想到的?!你真是个天才。所有这些计算有什么用呢?只需使用(lat1+lat2)/2,lon1和lon2也一样lon2@stevemoretz谢谢你,伙计!当时我只是想出了一个方法来做这件事,并想与大家分享,这样它也可以帮助其他人。除此之外,到目前为止,我不记得计算结果以及为什么需要这些计算。如果你有更好的方法,请随时分享。
float[] distance1 = new float[1];
Location.distanceBetween(userMarker.getPosition().latitude, userMarker.getPosition().longitude, positionMarker.getPosition().latitude, positionMarker.getPosition().longitude, distance1);
LinearLayout distanceMarkerLayout = (LinearLayout) getLayoutInflater().inflate(R.layout.distance_marker_layout, null);
distanceMarkerLayout.setDrawingCacheEnabled(true);
distanceMarkerLayout.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
distanceMarkerLayout.layout(0, 0, distanceMarkerLayout.getMeasuredWidth(), distanceMarkerLayout.getMeasuredHeight());
distanceMarkerLayout.buildDrawingCache(true);
TextView positionDistance = (TextView) distanceMarkerLayout.findViewById(R.id.positionDistance);
positionDistance.setText(distance1[0]+" meters");
Bitmap flagBitmap = Bitmap.createBitmap(distanceMarkerLayout.getDrawingCache());
distanceMarkerLayout.setDrawingCacheEnabled(false);
BitmapDescriptor flagBitmapDescriptor = BitmapDescriptorFactory.fromBitmap(flagBitmap);
double dLon = Math.toRadians(flagMarker.getPosition().longitude - positionMarker.getPosition().longitude);
double lat1 = Math.toRadians(positionMarker.getPosition().latitude);
double lat2 = Math.toRadians(flagMarker.getPosition().latitude);
double lon1 = Math.toRadians(positionMarker.getPosition().longitude);
double Bx = Math.cos(lat2) * Math.cos(dLon);
double By = Math.cos(lat2) * Math.sin(dLon);
double lat3 = Math.atan2(Math.sin(lat1) + Math.sin(lat2), Math.sqrt((Math.cos(lat1) + Bx) * (Math.cos(lat1) + Bx) + By * By));
double lon3 = lon1 + Math.atan2(By, Math.cos(lat1) + Bx);
lat3 = Math.toDegrees(lat3);
lon3 = Math.toDegrees(lon3);
Marker centerOneMarker = mMap.addMarker(new MarkerOptions()
.position(new LatLng(lat3, lon3))
.icon(flagBitmapDescriptor));