Google 地图 Android API - 使用 getMapAsync() 的两个地图
Google Maps Android API - Two Maps with getMapAsync()
我在一个视图片段中有两张地图(见下面的屏幕截图),虽然地图 运行 正确并且我可以通过 getMapAsync() 访问一张地图,但我无法理解如何 运行 另一个 getMapAsync() 并将其与第一个区分开来。
两张地图配合使用效果很好:
一个相当简单的视图布局(称为"fragment_map.xml"):
<com.google.android.gms.maps.MapView
android:id="@+id/mapview"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
<android.support.v7.widget.CardView
android:id="@+id/map_card"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_marginLeft="5dp"
android:layout_marginTop="5dp">
<com.google.android.gms.maps.MapView
android:layout_width="100dp"
android:layout_height="100dp"
android:id="@+id/miniMap"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_marginLeft="0dp"
android:layout_marginTop="0dp" />
</android.support.v7.widget.CardView>
在 Activity(在我的例子中是 Fragment):
private MapView mv, miniMap;
private GoogleMap gm;
private View myLayout;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
myLayout = inflater.inflate(R.layout.fragment_map, container, false);
mv = (MapView) myLayout.findViewById(R.id.mapview);
mv.onCreate(savedInstanceState);
miniMap = (MapView) myLayout.findViewById(R.id.miniMap);
miniMap.onCreate(savedInstanceState);
mv.getMapAsync(this);
miniMap.getMapAsync(this);
return myLayout;
}
@Override
public void onMapReady(GoogleMap map) {
gm = map;
gm.setMyLocationEnabled(true);
gm.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {
@Override
public void onCameraChange(CameraPosition position) {
gm.animateCamera(CameraUpdateFactory.newLatLng(position.target));
}
});
}
地图正确充气并且一切顺利,但正如您所猜到的,由于
,我对 "GoogleMap gm" 所做的任何事情都会发生在两张地图上
mv.getMapAsync(this);
miniMap.getMapAsync(this);
都指向一个
@Override
public void onMapReady(GoogleMap map) {
关于如何将单独的 GoogleMap 附加到每个 MapView 的任何想法?
编辑:
感谢 Zeeshan Shabbir,我使用布尔值首先瞄准主地图,然后初始化小地图:
private GoogleMap gm;
private View myLayout;
private boolean miniMapReady = false;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
myLayout = inflater.inflate(R.layout.fragment_map, container, false);
mv = (MapView) myLayout.findViewById(R.id.mapview);
mv.onCreate(savedInstanceState);
miniMap = (MapView) myLayout.findViewById(R.id.miniMap);
miniMap.onCreate(savedInstanceState);
mv.getMapAsync(this);
return myLayout;
}
@Override
public void onMapReady(GoogleMap map) {
if (!miniMapReady) {
gm = map;
gm.setMyLocationEnabled(true);
miniMap.getMapAsync(this);
miniMapReady = true;
} else {
miniGm = map;
}
gm.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {
@Override
public void onCameraChange(CameraPosition position) {
miniGm.animateCamera(CameraUpdateFactory.newCameraPosition(new CameraPosition(position.target, position.zoom - 5.0f, position.tilt, position.bearing)));
}
});
}
这里的 ChangeCamera Listener 允许迷你地图跟随用户在主地图上的交互,同时保持较低的缩放级别。
在 minimap
准备就绪后尝试使用布尔值,将其设置为 false。在 onMapReady
中检查布尔值是否为真,然后为 mv
执行你想要的操作,否则如果布尔值为假,则为 minimap
编写逻辑
我在一个视图片段中有两张地图(见下面的屏幕截图),虽然地图 运行 正确并且我可以通过 getMapAsync() 访问一张地图,但我无法理解如何 运行 另一个 getMapAsync() 并将其与第一个区分开来。
两张地图配合使用效果很好:
一个相当简单的视图布局(称为"fragment_map.xml"):
<com.google.android.gms.maps.MapView
android:id="@+id/mapview"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
<android.support.v7.widget.CardView
android:id="@+id/map_card"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_marginLeft="5dp"
android:layout_marginTop="5dp">
<com.google.android.gms.maps.MapView
android:layout_width="100dp"
android:layout_height="100dp"
android:id="@+id/miniMap"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_marginLeft="0dp"
android:layout_marginTop="0dp" />
</android.support.v7.widget.CardView>
在 Activity(在我的例子中是 Fragment):
private MapView mv, miniMap;
private GoogleMap gm;
private View myLayout;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
myLayout = inflater.inflate(R.layout.fragment_map, container, false);
mv = (MapView) myLayout.findViewById(R.id.mapview);
mv.onCreate(savedInstanceState);
miniMap = (MapView) myLayout.findViewById(R.id.miniMap);
miniMap.onCreate(savedInstanceState);
mv.getMapAsync(this);
miniMap.getMapAsync(this);
return myLayout;
}
@Override
public void onMapReady(GoogleMap map) {
gm = map;
gm.setMyLocationEnabled(true);
gm.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {
@Override
public void onCameraChange(CameraPosition position) {
gm.animateCamera(CameraUpdateFactory.newLatLng(position.target));
}
});
}
地图正确充气并且一切顺利,但正如您所猜到的,由于
,我对 "GoogleMap gm" 所做的任何事情都会发生在两张地图上mv.getMapAsync(this);
miniMap.getMapAsync(this);
都指向一个
@Override
public void onMapReady(GoogleMap map) {
关于如何将单独的 GoogleMap 附加到每个 MapView 的任何想法?
编辑:
感谢 Zeeshan Shabbir,我使用布尔值首先瞄准主地图,然后初始化小地图:
private GoogleMap gm;
private View myLayout;
private boolean miniMapReady = false;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
myLayout = inflater.inflate(R.layout.fragment_map, container, false);
mv = (MapView) myLayout.findViewById(R.id.mapview);
mv.onCreate(savedInstanceState);
miniMap = (MapView) myLayout.findViewById(R.id.miniMap);
miniMap.onCreate(savedInstanceState);
mv.getMapAsync(this);
return myLayout;
}
@Override
public void onMapReady(GoogleMap map) {
if (!miniMapReady) {
gm = map;
gm.setMyLocationEnabled(true);
miniMap.getMapAsync(this);
miniMapReady = true;
} else {
miniGm = map;
}
gm.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {
@Override
public void onCameraChange(CameraPosition position) {
miniGm.animateCamera(CameraUpdateFactory.newCameraPosition(new CameraPosition(position.target, position.zoom - 5.0f, position.tilt, position.bearing)));
}
});
}
这里的 ChangeCamera Listener 允许迷你地图跟随用户在主地图上的交互,同时保持较低的缩放级别。
在 minimap
准备就绪后尝试使用布尔值,将其设置为 false。在 onMapReady
中检查布尔值是否为真,然后为 mv
执行你想要的操作,否则如果布尔值为假,则为 minimap