2014-09-29 14 views
8

में वर्तमान स्थान मार्कर को आसानी से कैसे चलाना जारी रखें मैंने अपने स्थान के लिए मार्कर रखा है। मैं अपने मार्कर को आसानी से Google मानचित्र ऐप की तरह कुछ ले जाना चाहता हूं। जब मैं अपनी कार में आगे बढ़ता रहता हूं तो नीला सर्कल बहुत आसानी से चलता है। मैं अपने ऐप के लिए इसे लागू करना चाहता हूं। मैं इसे अपने ऐप पर कैसे कार्यान्वित करूं?Google मानचित्र v2 एंड्रॉइड

अभी तक मेरा स्थान मार्कर बहुत स्थान परिवर्तन पर अलग-अलग स्थान के लिए कूदता है और वहां मार्कर को चिह्नित करता है।

यहाँ मैं क्या है डॉन है:

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। इसके बजाय मैं Google मानचित्र जैसे मार्कर का एक चिकनी संक्रमण प्राप्त करना चाहता हूं? इसे कैसे कार्यान्वित करें?

अद्यतन:

इस पर समय की जोड़ी काम करने के बाद: मैं इस कोड के लिए आया था अंत में, लेकिन फिर मेरी मार्करों दिख रहे हैं नहीं:

मैं नीचे दी गई विधि का उपयोग कर रहा है और इस 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

आपको स्थान के नए latlng और मार्कर के वर्तमान latlng के बीच एक इंटरपोलेटर एक रैखिक या शायद एक त्वरण interpolator का उपयोग करना होगा। बाउंस इंटरपोलेटर के साथ यहां एक उदाहरण दिया गया है।

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

+0

रननेबल सरल एनिमेशन बनाने के लिए मित्र है। हाँ इसकी मुश्किल मुश्किल नहीं है। आप आसानी से मार्कर latlng। Marker.setPosition (latlng) को बदल सकते हैं लेकिन यह कुछ हद तक गुस्से में भी होगा। – danny117

+0

अंततः इस पर काम करने का मौका मिला। मैंने आपके तर्क का प्रयोग किया + अन्य संदर्भ उपर्युक्त कोड के साथ आया। समस्या यह है कि जब इसका उपयोग होता है तो मुझे अपना मार्कर बिल्कुल नहीं दिखाई देता है। यह आता है और बस चला जाता है। कृपया मेरे कोड को देखें। मुझे बताएं समस्या कहाँ हो सकती है? धन्यवाद! – TheDevMan

संबंधित मुद्दे