使用Android TextView作为" drawable"同时仍保持编辑功能

时间:2017-10-25 13:17:12

标签: android overlay drawable osmdroid

我正在创建一个使用Open Street Map的Android公共交通应用程序。问题是 - 我需要将这么多站点分成城市区域,每个区域都有几百个区域。计划是仅显示与该区域相关的各个公交车站,同时将其他公交车站隐藏在其组中,以节省内存,CPU并使界面流畅。

我希望能够在某个点之后缩小地图时显示某个区域中的工作站数量,并且我已经实现了此行为。问题是 - 我不知道如何将电台数量显示为"文字可绘制"。

我已经实现了一个位于地图上的文本视图,其中包含了进入应用程序时城市中心的公交车站总数,并且运行良好。但是,执行此操作的TextViewRelativeLayout MapActivity的一部分 - 这不是我想要的 - 我希望将TextView锚定到地图。现在,如果您滚动地图,TextView只是位于屏幕中间,因为它是RelativeLayout的一部分,而不是实际地图的一部分,作为项目在地图上。

以下是MapActivity在布局方面的样子:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">

<org.osmdroid.views.MapView
    android:id="@+id/map_activity_map_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clickable="true"
    android:focusable="true" />

<TextView
    android:id="@+id/map_activity_station_number_textview"
    android:visibility="invisible"
    android:layout_width="100dp"
    android:layout_centerInParent="true"
    android:layout_height="100dp"
    android:background="@drawable/text_view_circle"
    android:text="10"
    android:textSize="@dimen/text_size_medium"
    android:padding="8dp"
    android:gravity="center"
    android:textColor="@android:color/white"/>

</RelativeLayout>

现在,TextView用作背景的drawable是:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">

<solid android:color="@color/applicationBackground"/>

<stroke
    android:width="4dp"
    android:color="@android:color/white"/>

<corners
    android:radius="50dp"/>

</shape>

这可以在屏幕中央创建一个TextView,并填充城市公交车站的总数。

同样,问题是我想创建其中的几个,并且必须在地图上修复它们。我们可以这样做&#34;映射项目&#34;。问题是,为了成为一个地图项目,你必须是一个可绘制的而不是TextView

以下是这样的:

//set the icon for the bus station group (in this case, the text in the circle with the number of stations)
    busStationDrawableOverlay = this.getDrawable(R.drawable.bus_station_small);

for (GeoPoint busStationGroup : busStationGroupList){
    //create the overlay that will appear on the map as the station icon
    OverlayItem busStationGroupItem = new OverlayItem(null, null, busStationGroup);
    //set the bus station icon as the busStationDrawableOverlay the we declared above (and set the right icon)
    busStationGroupItem.setMarker(busStationDrawableOverlay);
    //add the station to the stationLocation list so it can be displayed on the map
    busStationGroupLocation.add(busStationGroupItem);
}

这个问题是它只适用于drawable。所以,如果我使用一个图标,我会在地图上找到&#34;锚定&#34;行为。我需要能够对TextView执行相同的操作,以便我可以实际写入该区域中的站点数。

知道怎么做吗?如何将TextView实现为&#34; Drawable&#34;并且仍然能够编辑并控制它吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

您可以使用标记覆盖,使用几乎隐藏的功能:当标记没有图标但标题时,此标题可以绘制为文本。这样:

foo

您可以使用:setTextLabelBackgroundColor,setTextLabelForegroundColor,setTextLabelForegroundColor调整外观和感觉。

每次更改标记标题时,都必须调用myMarker.setIcon(null)。

如果你不喜欢这个结果,一个简单的选择就是使用Marker,每当你的文字发生变化时,就可以从你的文字中建立一个可绘制的图标。 查看Marker.setIcon源代码,这将为您提供执行类似操作所需的一切。