Google android 地图 api v2 始终显示标记标题

问题描述 投票:0回答:7

我的 Android 应用程序中有一个 google 地图 v2 以及上面的一些标记。当用户单击这些标记之一时,会弹出一个标题。如何在没有用户点击的情况下始终显示这些标题?

java android google-maps google-maps-markers google-maps-android-api-2
7个回答

50
投票

类似这样的事情:

googleMap.addMarker(new MarkerOptions()
    .position(new LatLng(latitude, longitude))
    .title("Your position")).showInfoWindow();

16
投票

你可以这样做:

Marker marker = mMap.addMarker(new MarkerOptions().position(currentPosition).title("Your text"));
marker.showInfoWindow();

10
投票

为了在标记周围的地图上显示标记标题,我在互联网上找到的解决方案都不适合我,所以我卷起袖子制作了这个库来为我解决这个问题,希望它也能帮助其他人:

https://github.com/androidseb/android-google-maps-floating-marker-titles

以下是其工作原理的预览:


3
投票

我在某些实现方面不太擅长,但这是我的代码:

public BitmapDescriptor getBitmapFromView(String title) {
        View view = LayoutInflater.from(activity.getApplicationContext()).inflate(R.layout.marker_tooltip, null);
        ((TextView) view.findViewById(R.id.tooltips_title)).setText(title);

        //Get the dimensions of the view. In my case they are in a dimen file
        int width = activity.getResources().getDimensionPixelSize(R.dimen.tooltips_width);
        int height = activity.getResources().getDimensionPixelSize(R.dimen.tooltips_height);

        int measuredWidth = View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.EXACTLY);
        int measuredHeight = View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.EXACTLY);

        view.measure(measuredWidth, measuredHeight);
        view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());

        Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);

        view.draw(canvas);

        return BitmapDescriptorFactory.fromBitmap(bitmap);
    }

...
marker.setIcon(getBitmapFromView(marker.getTitle()));
...

我在地图应用程序的片段中实现了这一点,但有一些变化。例如,使用自定义信息窗口和地图上的一些事件,但其实现需要同时显示所有标记标题。 如果对您也有帮助,请告诉我

“activity.getResources().getDimensionPixelSize(R.dimen.tooltips_width)”变量的 ACTIVITY 是片段中的属性


1
投票

也许我回答这个问题有点晚了,但下面的代码对我有用:

//添加这个库

implementation 'com.google.maps.android:android-maps-utils:0.5'

//那就用下面的方法

public void makersMaker(GoogleMap googleMap){
    IconGenerator iconFactory = new IconGenerator(this);                            
    Marker marker1 = googleMap.addMarker(new MarkerOptions().position(newLatLng(-1.3177336,36.8251902));                  
    marker1.setIcon(BitmapDescriptorFactory.fromBitmap(iconFactory.makeIcon("Marker 1")));
    Marker marker2 = googleMap.addMarker(new MarkerOptions().position(new LatLng(-1.2857399,36.8214088)));                
    marker2.setIcon(BitmapDescriptorFactory.fromBitmap(iconFactory.makeIcon("Marker 2")));
}

0
投票

使用叠加或自定义标记您可以创建将标题直接包含在标记布局中的自定义标记,而不是依赖默认信息窗口,从而确保标题始终可见:

创建自定义标记布局:设计包含标题的自定义标记布局。以编程方式创建标记:为每个标记使用自定义布局。以下是如何实现这一点的示例:

第 1 步:创建自定义标记布局在 res/layout 文件夹中创建自定义布局 XML 文件 custom_marker.xml:

xml 复制代码

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:gravity="center">

    <TextView
        android:id="@+id/marker_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="5dp"
        android:background="@drawable/marker_background"
        android:textColor="@android:color/black"/>

    <ImageView
        android:id="@+id/marker_icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_marker"/>
</LinearLayout>

您可以使用简单的可绘制背景作为标题(res/drawable 文件夹中的marker_background.xml):

xml 复制代码

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@android:color/white"/>
    <corners android:radius="5dp"/>
    <stroke android:width="1dp" 
    android:color="@android:color/darker_gray"/>
</shape>

第 2 步:创建自定义标记并将其添加到地图中 在您的活动中,以编程方式创建自定义标记并将其添加到地图中:

java 复制代码

private Bitmap createCustomMarker(Context context, String title) {
    View markerView = LayoutInflater.from(context).inflate(R.layout.custom_marker, null);
    TextView titleView = markerView.findViewById(R.id.marker_title);
    titleView.setText(title);

    markerView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
    markerView.layout(0, 0, markerView.getMeasuredWidth(), markerView.getMeasuredHeight());

    Bitmap bitmap = Bitmap.createBitmap(markerView.getMeasuredWidth(), markerView.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    markerView.draw(canvas);

    return bitmap;
}

@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;

    // Adding markers with custom titles
    LatLng room230_1stFloor = new LatLng(34.052235, -118.243683); // example coordinates
    Marker room230_1stFloorMarker = mMap.addMarker(new MarkerOptions()
            .position(room230_1stFloor)
            .icon(BitmapDescriptorFactory.fromBitmap(createCustomMarker(this, "Room 230"))));
    
    LatLng room4822_1stFloor = new LatLng(34.052235, -118.243683); // example coordinates
    Marker room4822_1stFloorMarker = mMap.addMarker(new MarkerOptions()
            .position(room4822_1stFloor)
            .icon(BitmapDescriptorFactory.fromBitmap(createCustomMarker(this, "Room 4822"))));
}

在此方法中,每个标记都将具有自定义布局,标题直接显示在图标下方。

© www.soinside.com 2019 - 2024. All rights reserved.