【问题标题】:Android : Unable to animate marker from one position to another in Google mapsAndroid:无法在谷歌地图中将标记从一个位置动画到另一个位置
【发布时间】:2016-06-16 18:57:33
【问题描述】:

您好,我正在尝试在谷歌地图中将标记从一个位置更新到另一个位置。我想用动画改变标记的位置,就像 uber & Ola 一样。下面的示例代码。我没有收到任何错误。我只是没有看到动画。任何简单的动画都可以。

代码

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {

    private GoogleMap mMap;
    private static int SPLASH_TIME_OUT = 5000;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        // Obtain the SupportMapFragment and get notified when the map is ready to be used.
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }



    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;

        // Add a marker in tilak nagar
        LatLng tilkanagar = new LatLng(28.6353, 77.0971);

        LatLng Firstmarker = new LatLng(28.6350, 77.0970);
        LatLng FirstmarkerTo = new LatLng(28.6356, 77.0972);

        LatLng Secondmarker = new  LatLng(28.6345, 77.0969);
        LatLng SecondmarkerTo = new LatLng(28.6347, 77.0967);


        mMap.addMarker(new MarkerOptions().position(tilkanagar).title("Hello I am at Techvision"));
        Marker marker = mMap.addMarker(new MarkerOptions().position(Firstmarker).title("1 Minute Away").icon(BitmapDescriptorFactory.fromResource(R.drawable.car)));
        Marker marker1 = mMap.addMarker(new MarkerOptions().position(Secondmarker).title("2 Minutes Away").icon(BitmapDescriptorFactory.fromResource(R.drawable.car)));


        mMap.moveCamera(CameraUpdateFactory.newLatLng(tilkanagar));
        mMap.animateCamera(CameraUpdateFactory.zoomTo(18.0f));


                    animateMarker(marker, FirstmarkerTo, false);
                    animateMarker(marker1,SecondmarkerTo,false);

    }


    public void animateMarker(final Marker marker, final LatLng toPosition,
                              final boolean hideMarker) {

        Thread background = new Thread() {
            public void run() {

                try {
                    // Thread will sleep for 5 seconds
                    sleep(5*1000);

                    // After 5 seconds redirect to another intent
                    final Handler handler = new Handler();
                    final long start = SystemClock.uptimeMillis();
                    Projection proj = mMap.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);
                                }
                            }
                        }
                    });

                    //Remove activity
                    finish();

                } catch (Exception e) {

                }
            }
        };

        // start thread
        background.start();

            }
}

输出

【问题讨论】:

  • 我觉得没那么难......

标签: android google-maps google-maps-api-2


【解决方案1】:

您可以尝试通过标记选项设置动画。你可以使用setAnimation()

或者你可以使用interpolator,一个插值器定义动画的变化率。这允许加速、减速、重复等基本动画效果(alpha、缩放、平移、旋转)。 变量标记;

public void animateMarker(final Marker marker, final LatLng toPosition,
    final boolean hideMarker) {
    final Handler handler = new Handler();
    final long start = SystemClock.uptimeMillis();
    Projection proj = mGoogleMapObject.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);
                }
            }
        }
    });
}

这是一个相关的 SO 票,您可以尝试社区提供的解决方法:How to animate marker in android map api V2?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多