简体   繁体   English

如何在谷歌地图中平滑地旋转和移动公共汽车标记? - 安卓工作室

[英]How to rotate and move bus smoothly marker in google maps? - Android Studio

I am trying to create a Uber like app.我正在尝试创建一个类似 Uber 的应用程序。 The bus marker is showing on map but I want to move the marker and rotate smoothly when the bus turn left or right on road.公共汽车标记显示在地图上,但我想移动标记并在公共汽车在道路上左转或右转时平稳旋转。 I called the rotateBusMarker(dl, false) function.我调用了 rotateBusMarker(dl, false) 函数。 The findDriverLocation() function retrieve the data from firebase and shows the bus marker on map. findDriverLocation() 函数从 firebase 检索数据并在地图上显示总线标记。 My code is given below.我的代码如下。

private final HashMap<String, Marker> hm = new HashMap<String, Marker>();

    private void findDriverLocation() {
        DatabaseReference ref = FirebaseDatabase.getInstance().getReference("DrvUserLocation");
        ValueEventListener listener = new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot ds: dataSnapshot.getChildren()){
                    if (ds.exists()) {
                        String dNum = ds.child("drvMobN").getValue(String.class);
                        double lat = ds.child("Latitude").getValue(Double.class);
                        double lng = ds.child("Longitude").getValue(Double.class);
                        LatLng dl = new LatLng(lat, lng);
                        if(hm.containsKey(dNum)) {
                            hm.get(dNum).remove();
                        }
                        busMarker = mMap.addMarker(new MarkerOptions().position(dl).title(dNum).icon(BitmapDescriptorFactory.fromResource(R.drawable.bus_icon)));
                        hm.put(dNum, busMarker);
                        rotateBusMarker(dl, false);
                    } else {
                            Toast.makeText(StdMapsActivity.this, "Latitude and Longitude Value Not Found!.", Toast.LENGTH_SHORT).show();
                    }
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                Toast.makeText(StdMapsActivity.this, "Failed to get data.", Toast.LENGTH_SHORT).show();
            }
        };
        ref.addValueEventListener(listener);
    }

    public void rotateBusMarker(final LatLng toPosition, final boolean hideMarker) {
        final Handler handler = new Handler();
        final long start = SystemClock.uptimeMillis();
        Projection proj = mMap.getProjection();
        Point startPoint = proj.toScreenLocation(busMarker.getPosition());
        final LatLng startLatLng = proj.fromScreenLocation(startPoint);
        final Interpolator interpolator = new LinearInterpolator();

        handler.post(new Runnable() {
            @Override
            public void run() {
                Location prevLoc = new Location("service Provider");
                prevLoc.setLatitude(startLatLng.latitude);
                prevLoc.setLongitude(startLatLng.longitude);

                Location newLoc = new Location("service Provider");
                newLoc.setLatitude(toPosition.latitude);
                newLoc.setLongitude(toPosition.longitude);

                float bearing = prevLoc.bearingTo(newLoc);

                long elapsed = SystemClock.uptimeMillis() - start;
                float t = interpolator.getInterpolation((float) elapsed / 1000);
                double lng = t * toPosition.longitude + (1 - t) * startLatLng.longitude;
                double lat = t * toPosition.latitude + (1 - t) * startLatLng.latitude;
                busMarker.setPosition(new LatLng(lat, lng));
                busMarker.setRotation(bearing);

                if (t < 1.0) {
                    // Post again 16ms later.
                    handler.postDelayed(this, 16);
                } else {
                    if (hideMarker) {
                        busMarker.setVisible(false);
                    } else {
                        busMarker.setVisible(true);
                    }
                }
            }
        });
    }

It looks like you will have to create a custom animator class for the marker.看起来您必须为标记创建一个自定义动画师类。

Demo and code sample from previous StackOverflow question here来自上一个 StackOverflow 问题演示和代码示例

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM