From Below Code I am adding marker on map and every 15 seconds its refreshing and getting new latitude and longitude from database. Marker(Bus Image) are successfully adding on map and moving smoothly from one position to another position like car goes on road. Now what I want that I want to rotate bus marker according to direction. How can I achieve this? I am not getting what is the value of toRotation and st ?
public Runnable runLocation = new Runnable() {
@Override
public void run() {
gps = new GPSTracker(MapActivity.this);
MyLocation1.clear();
if (gps.CanGetLocation()) {
double latitude = gps.getLatitude();
double longitude = gps.getLongitude();
LatLng mylocation = new LatLng(latitude, longitude);
if (marker != null) {
marker.remove();
}
if (circle != null) {
circle.remove();
}
if (busMarker != null){
lastBusPos = busMarker.getPosition();
}
marker = mMap.addMarker(new MarkerOptions()
.icon(BitmapDescriptorFactory.fromResource(R.drawable.location))
.title("My Location")
.position(mylocation));
circle = mMap.addCircle(new CircleOptions()
.center(mylocation)
.radius(1000)
.strokeColor(0x10000000)
.fillColor(0x10000000));
} else {
// gps.showSettingsAlert();
}
String tag_json_obj = "json_obj_req";
String url = AppConfig.RouteData + "i=1&" + "y=1";
JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
JSONObject jObj = new JSONObject(String.valueOf(response));
JSONArray json_user = jObj.getJSONArray("Message");
for (int i = 0; i < json_user.length(); i++) {
try {
JSONObject obj = json_user.getJSONObject(i);
final Double currLat = obj.getDouble("actual_lat");
final Double currLong = obj.getDouble("actual_long");
final LatLng hcmus = new LatLng(currLat, currLong);
List<LatLng> latList = new ArrayList<LatLng>();
latList.add(hcmus);
if (mMarkers.size() != json_user.length()) {
busMarker = mMap.addMarker(new MarkerOptions()
.icon(BitmapDescriptorFactory.fromResource(R.drawable.bus))
.title("Bus No" + obj.getString("bus_id"))
.position(hcmus));
mMarkers.add(busMarker);
} else {
//busMarker.setPosition(hcmus);
animateMarker(hcmus, false);
rotateMarker(busMarker, 45.0f, 45.0f);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(MapActivity.this, "Sorry something went wrong..Try again", Toast.LENGTH_SHORT).show();
}
});
// Adding request to request queue
AppController.getInstance().addToRequestQueue(jsonObjReq, tag_json_obj);
MapActivity.this.handler.postDelayed(MapActivity.this.runLocation, 15000);
}
};
/*-------------------------------Animation----------------------------*/
public void rotateMarker(final Marker marker, final float toRotation, final float st) {
final Handler handler = new Handler();
final long start = SystemClock.uptimeMillis();
final float startRotation = st;
final long duration = 1555;
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);
float rot = t * toRotation + (1 - t) * startRotation;
marker.setRotation(-rot > 180 ? rot / 2 : rot);
if (t < 1.0) {
// Post again 16ms later.
handler.postDelayed(this, 16);
}
}
});
}
public void animateMarker(final LatLng toPosition,final boolean hideMarke) {
final Handler handler = new Handler();
final long start = SystemClock.uptimeMillis();
Projection proj = mMap.getProjection();
Point startPoint = proj.toScreenLocation(lastBusPos);
final LatLng startLatLng = proj.fromScreenLocation(startPoint);
final long duration = 5000;
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;
busMarker.setPosition(new LatLng(lat, lng));
if (t < 1.0) {
// Post again 16ms later.
handler.postDelayed(this, 16);
} else {
if (hideMarke) {
busMarker.setVisible(false);
} else {
busMarker.setVisible(true);
}
}
}
});
}
/*--------------------------------------------------------------------*/