Rotate marker as per user direction on Google Maps V2 Android

前端 未结 3 591
情书的邮戳
情书的邮戳 2020-12-07 23:20

I want to rotate marker as per bearing or sensor value received from Accelerometer to show the user where actually he is moving. I have set marker icon and flat value to tru

3条回答
  •  北荒
    北荒 (楼主)
    2020-12-07 23:51

    Im posting this answer because people like me who are searching for a solution related to the above question might find it useful.

    So here how i did it.

    As @colin said you must enable .flat(true) to rotate markers.

    1.For bearing angle i have used the following code.

    Here latLng1 - my old location && latLng2 - my new location

    private double bearingBetweenLocations(LatLng latLng1,LatLng latLng2) {
    
            double PI = 3.14159;
            double lat1 = latLng1.latitude * PI / 180;
            double long1 = latLng1.longitude * PI / 180;
            double lat2 = latLng2.latitude * PI / 180;
            double long2 = latLng2.longitude * PI / 180;
    
            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 brng = Math.atan2(y, x);
    
            brng = Math.toDegrees(brng);
            brng = (brng + 360) % 360;
    
            return brng;
        }
    

    2.To rotate marker using above bearing angle i have used this code

    Here isMarkerRotating is a boolean value. Add isMarkerRotating = false in OnCreate method

    private void rotateMarker(final Marker marker, final float toRotation) {
            if(!isMarkerRotating) {
                final Handler handler = new Handler();
                final long start = SystemClock.uptimeMillis();
                final float startRotation = marker.getRotation();
                final long duration = 2000;
    
                final Interpolator interpolator = new LinearInterpolator();
    
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        isMarkerRotating = true;
    
                        long elapsed = SystemClock.uptimeMillis() - start;
                        float t = interpolator.getInterpolation((float) elapsed / duration);
    
                        float rot = t * toRotation + (1 - t) * startRotation;
    
                        float bearing =  -rot > 180 ? rot / 2 : rot;
    
                        marker.setRotation(bearing);
    
                        if (t < 1.0) {
                            // Post again 16ms later.
                            handler.postDelayed(this, 16);
                        } else {
                            isMarkerRotating = false;
                        }
                    }
                });
            }
        }
    

    3.using above code

    LatLng oldLocation, newLocaation;
    
    float bearing = (float) bearingBetweenLocations(oldLocation, newLocaation);
    rotateMarker(start_marker, bearing);
    

提交回复
热议问题