在谷歌地图v2 android中同时旋转标记组的动画

时间:2016-05-31 12:53:49

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

我实施了汽车组(标记)的动画,以便在Google地图v2中同时旋转。

所以我需要在handler.post()方法中编写动画部分。

通过这样做,动画部分(handler.post()方法)仅针对一个标记运行。

我在for循环中编写了handler.post()方法。它仅在第一次运行,这意味着只有一个标记在旋转。之后它无法正常工作。我的代码如下。

private void animateCarsInMarkers(final MarkerOptions mark, final long bearing, final LatLng startPosition, final int position){

    final Handler handler = new Handler();
    final long start = SystemClock.uptimeMillis();
    final long duration = 3000;
    final Interpolator interpolator = new LinearInterpolator();
    final Marker marker = mGoogleMap.addMarker(mark);

    final float rotationValue = Float.parseFloat(String.valueOf(bearing));

    try {
        if(tempCarsArray != null && !tempCarsArray.isEmpty()){
            sLongitude = tempCarsArray.get(position).getDouble(LONGITUDE);
            sLatitude = tempCarsArray.get(position).getDouble(LATITUDE);
            sBearing = tempCarsArray.get(position).getLong("Bearing");

            final double dLongitude = startPosition.longitude;
            final double dLatitude = startPosition.latitude;
            handler.post(new Runnable() {
                @Override
                public void run() {
                    long elapsed = SystemClock.uptimeMillis() - start;
                    float time = interpolator.getInterpolation((float) elapsed / duration);
                    double lng = time * dLongitude + (1 - time) * sLongitude;
                    double lat = time * dLatitude + (1 - time) * sLatitude;
                    float rotationValue = time *  dbearing + (1-time) * sBearing;
                    marker.setRotation((-rotationValue > 180) ? (rotationValue / 2) : rotationValue);
                    marker.setPosition(new LatLng(lat, lng));
                    if (time < 1.0) {
                        handler.postDelayed(this, 16);
                    }
                }
            });
        tempCarsArray.clear();
    } else {

            marker.setPosition(startPosition);
            marker.setRotation(-rotationValue > 180 ? rotationValue / 2 : rotationValue);
        }
    }catch (JSONException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

这是我在for循环中调用的方法。但它只在循环中第一次运行。后来它无法正常工作。因此,在标记组中只有一个标记是动画的。我的for循环如下:

for(int i=0; i<size; i++){
animateCarsInMarkers(mark, bearing, latLng, i);
}

此循环仅在i = 0的值时运行且不会再次运行。 提前谢谢。

1 个答案:

答案 0 :(得分:0)

如果'for loop'仅运行一次,则表示此实例的“for循环条件部分”i<size已满足条件。我建议您实际记录“大小”并检查其值。

如果您正在寻找the size of an array,请使用tempCarsArray.length,如:

for(int i=0; i < tempCarsArray.length; i++){
    animateCarsInMarkers(mark, bearing, latLng, i);
}

要检查size是否导致问题,请尝试此操作。

如果你知道你想要旋转的标记的实际数量,现在尝试用整数替换,例如:

//if you're expecting 5 markers
for(int i=0; i < 5 ; i++){
     animateCarsInMarkers(mark, bearing, latLng, i);
}

如果所有标记都旋转,则表示您的size变量的值只有1。