如何从 google 地图标记获取视图?

How to get View from google maps Marker?

我想将 showcaseview 添加到 android 地图上的标记!? 展示库将视图作为参数。 我如何从标记中获取视图?

我正在尝试此代码

new GuideView.Builder(this)
    .setTitle("Guide Title Text")
    .setContentText("Guide Description Text\n .....Guide Description Text\n .....Guide Description Text .....")
    .setGravity(Gravity.auto) //optional
    .setDismissType(DismissType.anywhere) //optional - default DismissType.targetView
    .setTargetView(view)
    .setContentTextSize(12)//optional
    .setTitleTextSize(14)//optional
    .build()
    .show();

它在 setTargetView 中将视图作为参数,而不是标记对象

这是我想使用的库 https://github.com/mreram/ShowCaseView

Marker 不是视图,您无法从中获取 View。但无论如何,您可以创建虚拟透明 View 并以编程方式将其放置在选定的标记上,然后通过 setTargetView 方法将其传递给 ShowCaseView 库。因此,您需要围绕 MapFragmentMapView 进行根视图,例如 RelativeLayout (activity_main.xml):

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/mapview_root"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="<YOUR_PACKAGE_NAME>.MainActivity">

    <com.google.android.gms.maps.MapView android:id="@+id/mapview"
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        />

</RelativeLayout>

和虚拟透明视图布局(transparent_layout.xml):

<?xml version="1.0" encoding="utf-8"?>
<View
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="20dp"  <- adjust size programmatically or set to default size of Marker
    android:layout_height="30dp"
    android:layout_centerInParent="true"
    android:background="@android:color/transparent">
</View>

比,例如MainActivity,您需要获取根布局并膨胀虚拟透明视图,并且当标记被选中(例如单击)时,您应该获取所选 Marker 的当前屏幕坐标并将虚拟透明视图准确地放置在其上方。对于 RelativeLayout,可以通过 setLeft() 实现 x 坐标,setTop() 实现 y 坐标(当然你需要根据 Marker锚)。类似的东西:

public class MainActivity extends AppCompatActivity {

    private static final String MAP_VIEW_BUNDLE_KEY = "MapViewBundleKey";
    static final LatLng KYIV = new LatLng(50.450311, 30.523730);

    private GoogleMap mGoogleMap;
    private RelativeLayout mMapViewRoot;
    private MapView mGoogleMapView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Bundle mapViewBundle = null;
        if (savedInstanceState != null) {
            mapViewBundle = savedInstanceState.getBundle(MAP_VIEW_BUNDLE_KEY);
        }

        mMapViewRoot = (RelativeLayout) findViewById(R.id.mapview_root);
        // dummy transparent view
        final View transparentView = View.inflate(getApplicationContext(), R.layout.transparent_view, mMapViewRoot);

        mGoogleMapView = (MapView) findViewById(R.id.mapview);
        mGoogleMapView.onCreate(mapViewBundle);
        mGoogleMapView.getMapAsync(new OnMapReadyCallback() {
            @Override
            public void onMapReady(GoogleMap googleMap) {
                mGoogleMap = googleMap;
                mGoogleMap.addMarker(new MarkerOptions().position(KYIV).title("Kyiv"));
                mGoogleMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
                    @Override
                    public boolean onMarkerClick(Marker marker) {
                        // get screen coordinates of the marker
                        Projection projection = mGoogleMap.getProjection();
                        Point viewPosition = projection.toScreenLocation(marker.getPosition());

                        // place dummy transparent view over the marker
                        transparentView.setLeft(viewPosition.x);
                        transparentView.setTop(viewPosition.y);
                        return false;
                    }
                });

                mGoogleMap.animateCamera(CameraUpdateFactory.newLatLng(KYIV));

                ...

            }
        });

    }
...

当然这只是一个想法的例子,你应该改进标记大小、锚点等的代码。