Google отображает пучок, чтобы отображать указания пользователя/заголовок в android MapFragment

введите описание изображения здесь

Можно ли использовать сияющий синий луч вместо незаметной стрелки в android google MapFragment? Эта новая функция доступна для Google Maps на Android. как реализовать его в приложении? Пожалуйста, поделитесь своими мыслями, пожалуйста.

Спасибо!

Ответ 1

Я предполагаю, что вы по сути хотите заменить указатель поворота своим собственным? Если вы ищете полные "линии до места назначения", там уже есть ответы.

Этот ответ предлагает начать с переопределения LocationListener для установки пользовательского значка (.icon(yourIcon) в MarkerOptions):

public class MyLocationLayer implements LocationListener {
    private GoogleMap map;

    private BitmapDescriptor markerDescriptor;
    private boolean drawAccuracy = true;
    private int accuracyStrokeColor = Color.argb(255, 130, 182, 228);
    private int accuracyFillColor = Color.argb(100, 130, 182, 228);

    private Marker positionMarker;
    private Circle accuracyCircle;

    public MyLocationLayer(GoogleMap map, int markerResource) {
        this.map = map;

        markerDescriptor = BitmapDescriptorFactory.fromResource(markerResource);
    }

    public void setDrawAccuracy(boolean drawAccuracy) {
        this.drawAccuracy = drawAccuracy;
    }

    public void setAccuracyStrokeColor(int color) {
        this.accuracyStrokeColor = color;
    }

    public void setAccuracyFillColor(int color) {
        this.accuracyFillColor = color;
    }

    @Override
    public void onLocationChanged(Location location) {
        double latitude = location.getLatitude();
        double longitude = location.getLongitude();
        float accuracy = location.getAccuracy();

        if (positionMarker != null) {
            positionMarker.remove();
        }
        final MarkerOptions positionMarkerOptions = new MarkerOptions()
                .position(new LatLng(latitude, longitude))
                .icon(markerDescriptor)
                .anchor(0.5f, 0.5f);
        positionMarker = map.addMarker(positionMarkerOptions);

        if (accuracyCircle != null) {
            accuracyCircle.remove();
        }
        if (drawAccuracy) {
            final CircleOptions accuracyCircleOptions = new CircleOptions()
                    .center(new LatLng(latitude, longitude))
                    .radius(accuracy)
                    .fillColor(accuracyFillColor)
                    .strokeColor(accuracyStrokeColor)
                    .strokeWidth(2.0f);
            accuracyCircle = map.addCircle(accuracyCircleOptions);
        }
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {

    }

    @Override
    public void onProviderEnabled(String provider) {

    }

    @Override
    public void onProviderDisabled(String provider) {

    }
}

После этого вы можете добавить .rotation() после new MarkerOptions() чтобы установить текущее вращение устройства. Это можно сделать, указав параметр в вашем фрагменте/активности (например, private Int rotation = 0) и обновив его.

Это обновление будет выполнено путем реализации SensorEventListener в вашем Fragment/Activity и внутри onSensorChanged(event: SensorEvent) обновляющего ваш кэш вращения устройства.

Ответ на этот вопрос довольно сложный, чтобы получить вращение (азимут) от акселерометра и магнитного поля, а также несколько альтернатив.

Убедитесь, что вы отменили регистрацию своих слушателей соответствующим образом!