2014-09-29 16 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

相关问题