7

我在Google地图上有3 markersPolyline路径上的动画标记

  1. Two Markers显示starting and ending points

下面是使用绘制折线这两个点之间的代码:

private void polyLine() { 

    LatLng starting = new LatLng(##.######, ##.######); 
    LatLng ending = new LatLng(##.######, ##.######); 

    PolylineOptions line = new PolylineOptions().add(starting, ending); 

    mGoogleMap.addMarker(new MarkerOptions().position(starting).title("Start")); 
    mGoogleMap.addMarker(new MarkerOptions().position(ending).title("End")); 

    mGoogleMap.addPolyline(line); 

} 
  • One Marker显示current Location [HUE_ROSE]
  • 并以animate marker to current location使用:

    @Override 
    public void onLocationChanged(Location location) 
    { 
        Toast.makeText(this, "Location Changed " + location.getLatitude() 
          + location.getLongitude(), Toast.LENGTH_LONG).show(); 
    
        mLastLocation = location; 
    
        if (mCurrLocationMarker != null) { 
         mCurrLocationMarker.remove(); 
        } 
    
        LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); 
    
        if(ourGlobalMarker == null) { // First time adding marker to map 
         ourGlobalMarker = mGoogleMap.addMarker(new MarkerOptions().position(latLng) 
           .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ROSE))); 
         MarkerAnimation.animateMarkerToICS(ourGlobalMarker, latLng, new LatLngInterpolator.Spherical()); 
         mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 18)); 
        } else { 
         MarkerAnimation.animateMarkerToICS(ourGlobalMarker, latLng, new LatLngInterpolator.Spherical()); 
         mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 18)); 
        } 
    
    } 
    

    问题:

    Getting Animating Marker, but right side of Polyline

    SOLUTION:

    How Can I show Animated Marker on Polyline Path

    尝试了很多找到solution这一个,但did not find任何东西,分享你的suggestions

    +0

    看看[this](https://stackoverflow.com/q/40526350/6950238)问题和答案。 –

    +0

    可以分享截图和演示项目 –

    +0

    @PhanVanLinh看到这是我想要在结尾处得到的:stackoverflow.com/questions/46103680/map-and-moving-marker-using-google-maps-api如果可以帮助我解决这个问题,这意味着你回答了两个问题:)我已经在SO问题中分享了我的最新代码... – Sophie

    回答

    1

    试试用设置锚状如下

    mDetailPositionMarker = mDetailGoogleMap.addMarker(new MarkerOptions() 
            .position(newLatLonValue) 
            .anchor(0.5f, 0.5f) 
            .rotation(bearingValue) 
            .flat(true) 
            .icon(BitmapDescriptorFactory.fromResource(R.drawable.biketopicon))); 
    

    并确保你的图标将不会有任何填充或保证金。避免图标图像中的空间不如以下所示的内容。

    enter image description here

    1

    我假设你有3个标志 1.源点 2.目标点 3.移动标记

    你一定要试试这种方式它会帮助你

    private void animateMarkerNew(final LatLng startPosition, final LatLng destination, final Marker marker) { 
    
         if (marker != null) { 
    
          final LatLng endPosition = new LatLng(destination.latitude, destination.longitude); 
    
          final float startRotation = marker.getRotation(); 
          final LatLngInterpolatorNew latLngInterpolator = new LatLngInterpolatorNew.LinearFixed(); 
    
          ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 1); 
          valueAnimator.setDuration(2000); // duration 3 second 
          valueAnimator.setInterpolator(new LinearInterpolator()); 
          valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
           @Override 
           public void onAnimationUpdate(ValueAnimator animation) { 
            try { 
             float v = animation.getAnimatedFraction(); 
             LatLng newPosition = latLngInterpolator.interpolate(v, startPosition, endPosition); 
             marker.setPosition(newPosition); 
             googleMap.moveCamera(CameraUpdateFactory.newCameraPosition(new CameraPosition.Builder() 
               .target(newPosition) 
               .zoom(18f) 
               .build())); 
    
             marker.setRotation(getBearing(startPosition, new LatLng(destination.latitude, destination.longitude))); 
            } catch (Exception ex) { 
             //I don't care atm.. 
            } 
           } 
          }); 
          valueAnimator.addListener(new AnimatorListenerAdapter() { 
           @Override 
           public void onAnimationEnd(Animator animation) { 
            super.onAnimationEnd(animation); 
    
            // if (mMarker != null) { 
            // mMarker.remove(); 
            // } 
            // mMarker = googleMap.addMarker(new MarkerOptions().position(endPosition).icon(BitmapDescriptorFactory.fromResource(R.drawable.icon_car))); 
    
           } 
          }); 
          valueAnimator.start(); 
         } 
        } 
    

    注意:marker是指您想要为其中一个设置动画的标记。

    private interface LatLngInterpolatorNew { 
         LatLng interpolate(float fraction, LatLng a, LatLng b); 
    
         class LinearFixed implements LatLngInterpolatorNew { 
          @Override 
          public LatLng interpolate(float fraction, LatLng a, LatLng b) { 
           double lat = (b.latitude - a.latitude) * fraction + a.latitude; 
           double lngDelta = b.longitude - a.longitude; 
           // Take the shortest path across the 180th meridian. 
           if (Math.abs(lngDelta) > 180) { 
            lngDelta -= Math.signum(lngDelta) * 360; 
           } 
           double lng = lngDelta * fraction + a.longitude; 
           return new LatLng(lat, lng); 
          } 
         } 
        } 
    
    
    //Method for finding bearing between two points 
    private float getBearing(LatLng begin, LatLng end) { 
        double lat = Math.abs(begin.latitude - end.latitude); 
        double lng = Math.abs(begin.longitude - end.longitude); 
    
        if (begin.latitude < end.latitude && begin.longitude < end.longitude) 
         return (float) (Math.toDegrees(Math.atan(lng/lat))); 
        else if (begin.latitude >= end.latitude && begin.longitude < end.longitude) 
         return (float) ((90 - Math.toDegrees(Math.atan(lng/lat))) + 90); 
        else if (begin.latitude >= end.latitude && begin.longitude >= end.longitude) 
         return (float) (Math.toDegrees(Math.atan(lng/lat)) + 180); 
        else if (begin.latitude < end.latitude && begin.longitude >= end.longitude) 
         return (float) ((90 - Math.toDegrees(Math.atan(lng/lat))) + 270); 
        return -1; 
    } 
    
    +0

    节省时间:“走180号子午线的最短路径” – Mbt925

    0
    // Animation handler for old APIs without animation support 
    private void animateMarkerTo(final Marker marker, final double lat, final double lng) { 
        final Handler handler = new Handler(); 
        final long start = SystemClock.uptimeMillis(); 
        final long DURATION_MS = 3000; 
        final Interpolator interpolator = new AccelerateDecelerateInterpolator(); 
        final LatLng startPosition = marker.getPosition(); 
        handler.post(new Runnable() { 
         @Override 
         public void run() { 
          float elapsed = SystemClock.uptimeMillis() - start; 
          float t = elapsed/DURATION_MS; 
          float v = interpolator.getInterpolation(t); 
    
          double currentLat = (lat - startPosition.latitude) * v + startPosition.latitude; 
          double currentLng = (lng - startPosition.longitude) * v + startPosition.longitude; 
          marker.setPosition(new LatLng(currentLat, currentLng)); 
    
          // if animation is not finished yet, repeat 
          if (t < 1) { 
           handler.postDelayed(this, 16); 
          } 
         } 
        }); 
    } 
    

    呼叫onLocationChange方法中此方法并传入位置经纬度和朗然后你会看到一个神奇;)

    0

    你为什么不使用蓝色位置图标,而不是使用标记的? ????