从下面的代码我在地图上添加标记,每15秒刷新一次,从数据库中获取新的经度和经度。标记(公共汽车图像)成功地添加到地图上并从一个位置平稳地移动到另一个位置,就像汽车在道路上行驶一样。现在我想要的是我想根据方向旋转总线标记。我怎样才能做到这一点?我没有得到toRotation和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);
}
}
}
});
}
/*--------------------------------------------------------------------*/
答案 0 :(得分:9)
您可以参考此related thread。使用Location
对象的bearing,然后将其设置为CameraPosition
。
如果您使用GPS定位用户,那么
Location
对象就是您 getonLocationChanged
包含bearing。如果您只有两个坐标(例如,您只有坐标 从网络位置提供商),您可以使用
Location.bearingTo()
计算两个坐标的方位:Location prevLoc = ... ; Location newLoc = ... ; float bearing = prevLoc.bearingTo(newLoc) ;
如果您有方位,可以使用标记设置旋转
MarkerOptions.rotation()
:mMap.addMarker(new MarkerOptions() .position(markerLatLng) .icon(BitmapDescriptorFactory.fromResource(R.drawable.map_marker)) .anchor(0.5f, 0.5f) .rotation(bearing) .flat(true));
您必须将anchor设置为您要旋转的点 周围,这也是你想要在你设置的位置 到标记。 (0.5,0.5)是图像的中心。
以下是一些可能也有帮助的帖子:
答案 1 :(得分:0)
尝试以下代码。 它很容易实现。
这里latLng1 =旧你的位置&amp; latLng2 =您的新位置。
<强>步骤= 1 强>
private double getBearingBetweenTwoPoints1(LatLng latLng1, LatLng latLng2) {
double lat1 = degreesToRadians(latLng1.latitude);
double long1 = degreesToRadians(latLng1.longitude);
double lat2 = degreesToRadians(latLng2.latitude);
double long2 = degreesToRadians(latLng2.longitude);
double dLon = (long2 - long1);
double y = Math.sin(dLon) * Math.cos(lat2);
double x = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1)
* Math.cos(lat2) * Math.cos(dLon);
double radiansBearing = Math.atan2(y, x);
return radiansToDegrees(radiansBearing);
}
<强>步骤= 2 强>
private double degreesToRadians(double degrees) {
return degrees * Math.PI / 180.0;
}
<强>步骤= 3 强>
private double radiansToDegrees(double radians) {
return radians * 180.0 / Math.PI;
}
Step = 4 设置标记旋转。
mPositionMarker.setRotation((float) getBearingBetweenTwoPoints1(new LatLng(lastLocLati, lastLocLongi), new LatLng(lati, longi)));