Android Maps - animateCamera()方法无法正常工作

时间:2013-05-28 16:05:38

标签: android google-maps-android-api-2 android-maps-v2

问题:

1)地图获取动画以达到所需位置(代码中的第4行),但它已缩放到默认位置(代码中的第5行)

[将地图保留在指定缩放级别的默认位置]

2)我理解为什么会出现这个问题,但我不知道如何解决它。

3)如果我将第4行更改为moveCamera而不是可以使用的animateCamera,但我确实需要animateCamera()方法。

以下是代码:

map=((MapFragment)getFragmentManager().findFragmentById(R.id.map)).getMap();
MarkerOptions options=new MarkerOptions().position(new LatLng(13.0810,80.2740));
map.addMarker(options);
map.animateCamera(CameraUpdateFactory.newLatLng(new LatLng(13.0810,80.2740)),4000,null);
map.animateCamera(CameraUpdateFactory.zoomTo(15.5f),2000,null);

3 个答案:

答案 0 :(得分:36)

问题是您在开始动画到新位置后立即致电zoom。这就是为什么它只是将新的相机更新动作替换为新的动作。

您可以通过创建更准确的相机更新操作(包括拉链更改和缩放级别更改)来解决此问题:

CameraPosition newCamPos = new CameraPosition(new LatLng(13.0810,80.2740), 
                                                  15.5f, 
                                                  map.getCameraPosition().tilt, //use old tilt 
                                                  map.getCameraPosition().bearing); //use old bearing
map.animateCamera(CameraUpdateFactory.newCameraPosition(newCamPos), 4000, null);
MaciejGórski指出

ALTERNATIVELY ,您可以使用包含newLatLngZoomLatLng更改的zoom界面:

map.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(13.0810,80.2740), 15.5f), 4000, null);

答案 1 :(得分:1)

animateCamera前使用CancelableCallback,在animateCamera中拨打第二个onFinish

示例:AnimateCameraChainingExampleActivity.java

答案 2 :(得分:0)

  useEffect(() => {
    const fetchLocation = async () => {
      const hasLocationPermission =
        Platform.OS === 'ios'
          ? await Geolocation.requestAuthorization('whenInUse')
          : await PermissionsAndroid.request(
              PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
            );

      if (hasLocationPermission === 'granted') {
        await Geolocation.getCurrentPosition(
          position => {
            const {
              coords: {latitude, longitude},
            } = position;

            setLocation({
              latitude,
              longitude,
              latitudeDelta: 1,
              longitudeDelta: 1,
            });
          },
          error => {
            // See error code charts below.
            console.log(error.code, error.message);
          },
          {enableHighAccuracy: true, timeout: 15000, maximumAge: 10000},
        );
      }
    };

    fetchLocation();
  }, []);

  useEffect(() => {
    if (location && _map.current) {
      _map.current.animateCamera(
        {
          center: {
            latitude: location.latitude,
            longitude: location.longitude,
          },
          zoom: 15,
        },
        {duration: 5000},
      );
    }
  }, [location]);

  return (
    <View style={styles.container}>
      <MapView style={styles.map} provider={PROVIDER_GOOGLE} ref={_map}>
        {location && <Marker coordinate={location} />}
      </MapView>
    </View>
  );
};