2014-09-29 42 views
8

我已經爲我的位置放置了一個標記。我想平穩地移動我的標記,就像Google地圖應用程序一樣。當我繼續在我的車中移動時,藍色圓圈運動非常順暢。我想爲我的應用實現相同的功能。我如何在我的應用程序上實現這個功能?如何在Google Maps v2中順利地保持移動當前位置標記android

截至目前,我的位置標記只是跳轉到非常位置變化的不同位置,並在那裏標記標記。

這裏是我有唐:

googleMap.setMyLocationEnabled(true); 

所以onMyLocationChange方法是自動調用:

@Override 
public void onMyLocationChange(Location location) 
{ 
    curlat = location.getLatitude(); 
    curlong = location.getLongitude(); 

    if (markermylocation != null) 
    { 
     markermylocation.remove(); 
    } 

     curlat = location.getLatitude(); 
     curlong = location.getLongitude(); 
     myLocation(curlat, curlong, username, imageURL, ZOOMVALUE); 
} 
在mylocaiton方法

private void myLocation(double lat, double lng, String name, String url, float zoom) 
{ 
    if(firsttime == 1) 
    { 
     LatLng ll = new LatLng(lat,lng); 
     CameraUpdate update = CameraUpdateFactory.newLatLngZoom(ll, zoom); 
     googleMap.animateCamera(update); 
     firsttime = 0; 
    } 

    final String uname = name; 
    curlat = lat; 
    curlong = lng; 
    LatLng position = new LatLng(curlat, curlong); 

    markerOptionsmylocaiton = new MarkerOptions().position(position).icon(BitmapDescriptorFactory.fromBitmap(icon)).title(uname).anchor(0.5f, 1f); 
    markermylocation = googleMap.addMarker(markerOptionsmylocaiton); 

    LatLng latlang = new LatLng(curlat, curlong); 
    animateMarker(markermylocation, latlang, false); 
} 

所以每次mylocation被稱爲標記被移除並調用mylocation方法,然後在新建中創建標記postition。相反,我希望像谷歌地圖這樣的標記平穩過渡?如何實現這一點?

更新:

工作幾次在這之後我來到這個代碼終於但後來我的標誌沒有顯示出來:

我使用下面的方法,並且此調用myLocation每次方法。

public void animateMarker(final Marker marker, final LatLng toPosition, 
     final boolean hideMarker) 
{ 
    final Handler handler = new Handler(); 
    final long start = SystemClock.uptimeMillis(); 
    Projection proj = googleMap.getProjection(); 
    Point startPoint = proj.toScreenLocation(marker.getPosition()); 
    final LatLng startLatLng = proj.fromScreenLocation(startPoint); 
    final long duration = 500; 

    final Interpolator interpolator = new LinearInterpolator(); 

    handler.post(new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      long elapsed = SystemClock.uptimeMillis() - start; 
      float t = interpolator.getInterpolation((float) elapsed 
        /duration); 
      double lng = t * toPosition.longitude + (1 - t) 
        * startLatLng.longitude; 
      double lat = t * toPosition.latitude + (1 - t) 
        * startLatLng.latitude; 
      marker.setPosition(new LatLng(lat, lng)); 

      if (t < 1.0) 
      { 
       // Post again 16ms later. 
       handler.postDelayed(this, 16); 
      } 
      else 
      { 
       if (hideMarker) 
       { 
        marker.setVisible(false); 
       } 
       else 
       { 
        marker.setVisible(true); 
       } 
      } 
     } 
    }); 
} 

謝謝!

回答

0

您必須在位置的新位置和標記的當前位置之間使用內插器,它可以是線性的,也可以是加速度內插器。這裏有一個反射內插器的例子。

final Handler handler = new Handler(); 
     final long start = SystemClock.uptimeMillis(); 
     final long duration = 2500; 

     final Interpolator interpolator = new BounceInterpolator(); 
     marker.setVisible(true); 

     handler.post(new Runnable() { 
      @Override 
      public void run() { 
       long elapsed = SystemClock.uptimeMillis() - start; 
       float t = Math.max(
         1 - interpolator.getInterpolation((float) elapsed 
           /duration), 0); 

       marker.setAnchor(0.5f, 1.0f + 6 * t); 
       marker.setPosition(latlng) 

       if (t > 0.0) { 
        // Post again 16ms later. 
        handler.postDelayed(this, 16); 
       } 
      } 
     }); 
+0

感謝您的快速回復。讓我工作並回來。我很驚訝的是,難以順利移動標記。 :( – TheDevMan 2014-09-29 04:36:00

+0

runnable是製作簡單動畫的朋友,是的,它的技巧並不難,你可以很容易地改變標記latlng.mark.setPosition(latlng),但它也會有點笨拙 – danny117 2014-09-29 04:47:18

+0

終於有機會做這件事了。我用你的邏輯+其他參考來了上面的代碼,問題是,當它使用它時,我根本沒有看到我的標記,它出現並消失,請看看我的代碼。問題可能出在哪裏?謝謝! – TheDevMan 2014-10-16 12:15:56

相關問題