11

アイコンを変更したいマーカーを削除/再追加せずに、実行時にGoogle Maps Android API v2マーカーのアイコンを変更する方法はありますか?それに変換を適用できますか(回転など)?

ありがとう。

4

6 に答える 6

23

に更新した後、実行時にマーカーアイコンを簡単に変更できるようになりましGoogle Play Services Rev 7

Marker.setIcon(BitmapDescriptorアイコン)

利用可能です、以前私はそれの色を変えるためにマーカーを削除して追加しました。

于 2013-06-19T13:33:36.743 に答える
4

現在、実行時にマーカーを変更することはできません。また、マーカーに回転を適用することもできません。

ただし、回避策を使用できます。実行時にマーカー画像の不透明度を調整する必要があるBlinkingMarkerクラスに取り組んでいます。

現在の唯一の解決策は、異なる回転でビットマップを作成し、それらを定期的に追加/削除することです。このソリューションの問題は、マーカーの追加/削除に多くのメモリ割り当てが必要になるため、ガベージコレクションが継続的に行われることです。より適切でスムーズな回避策は、すべての画像を事前に作成し、それらすべてを一度にマップに追加することです。その後、このMarker.setVisible(boolean)機能を使用して、現在必要なものを表示できます。

注意:これを行う前にビットマップを測定してください。大きなビットマップを多数追加すると、アプリのメモリサイズが非常に大きくなる可能性があるためです。

ここで私の回避策を見ることができます: https ://github.com/balazsbalazs/blinking-marker-mapsv2

これは点滅している(ビットマップの不透明度を変更する)マーカーですが、同じ行に任意の種類の変換を適用できます。

于 2013-01-22T10:38:33.413 に答える
3

ドキュメントはこの問題について非常に明確です-

Icon
    A bitmap that's displayed in place of the default marker image. You can't change the icon once you've created the marker.

マーカーを変更したように見せたい場合は、いくつかのオプションがあります。1つは、ご存知のとおり、マーカーを削除して別のマーカーを追加することです。もう1つは、同じ場所に複数のマーカーを配置し、いつでも表示できるマーカーを切り替えることです。

それに変換を適用できますか(回転など)?

マーカーを作成するために使用するに、画像に任意の変換を適用できます。

于 2013-01-22T02:59:25.697 に答える
3

2013年9月のGoogleMapsAndroid API v2リリースでは、新しいsetRotation()メソッドに加えて、マーカーの新しいメソッドが追加されましたsetFlat()

新機能に関するGoogleの説明は次のとおりです。

マーカーに方向性を与える

マーカーをアンカーポイントを中心に回転できるように、マーカー回転プロパティを追加しました。新しいflatプロパティを使用すると、カメラに向かって飛び出すのではなく、マーカーをマップサーフェス上に平らに置くことができます。これらの2つの新しいプロパティは、マップが回転または傾斜しているときにコンパスの方向を示すのに特に役立ちます。

これが新機能を説明する記事です。

于 2013-09-23T21:36:25.817 に答える
2

実行時に選択したマーカーアイコンを変更するには、次を追加するだけです。

      @Override
      public boolean onMarkerClick(Marker marker) {

       Marker.setIcon (BitmapDescriptor icon);
       }
于 2014-07-22T07:09:49.963 に答える
1

Androidでのみテスト済み

実行時にマーカーのアイコンを変更するために、行186の「final」キーを削除してアイコン変数をfinalからnon-finalに変更しました。

final BitmapDescriptor icon;

BitmapDescriptor icon;

そして、行136でマーカーコンストラクターを「const」から「non-const」に変更します。

const Marker({

Marker({

パッケージに変更を加えるには、この手順に従う必要があります。

google_maps_flutterリポジトリを使用すると、「pubspec.yamlが見つかりませんでした」などのエラーが発生します。これは、google_maps_flutterパッケージがリポジトリのサブディレクトリに配置されているためです。

適切な依存関係を取得するには、pubspec.yamlにパッケージの特定のパスを追加する必要があります。

 dependencies:
  # google_maps_flutter: ^2.1.1
  google_maps_flutter:
    git:
      url: https://github.com/[username]/plugins.git
      path: packages/google_maps_flutter/google_maps_flutter/

次に、アイコンをマーカーに直接設定してアイコンを変更できます。私は「OnTap」メソッドを使用してそれを行います。

Marker marker = Marker(
  icon: firstIcon,
  markerId: MarkerId(id),
  position: position,
  infoWindow: InfoWindow(
    title: name,
    snippet: address,
  ),
  onTap: () {
    setState(() {
      _markers[name]?.icon = secondIcon;
    });
  }
);

マーカークラス全体:

@immutable
class Marker implements MapsObject {
  /// Creates a set of marker configuration options.
  ///
  /// Default marker options.
  ///
  /// Specifies a marker that
  /// * is fully opaque; [alpha] is 1.0
  /// * uses icon bottom center to indicate map position; [anchor] is (0.5, 1.0)
  /// * has default tap handling; [consumeTapEvents] is false
  /// * is stationary; [draggable] is false
  /// * is drawn against the screen, not the map; [flat] is false
  /// * has a default icon; [icon] is `BitmapDescriptor.defaultMarker`
  /// * anchors the info window at top center; [infoWindowAnchor] is (0.5, 0.0)
  /// * has no info window text; [infoWindowText] is `InfoWindowText.noText`
  /// * is positioned at 0, 0; [position] is `LatLng(0.0, 0.0)`
  /// * has an axis-aligned icon; [rotation] is 0.0
  /// * is visible; [visible] is true
  /// * is placed at the base of the drawing order; [zIndex] is 0.0
  /// * reports [onTap] events
  /// * reports [onDragEnd] events
  Marker({
    required this.markerId,
    this.alpha = 1.0,
    this.anchor = const Offset(0.5, 1.0),
    this.consumeTapEvents = false,
    this.draggable = false,
    this.flat = false,
    this.icon = BitmapDescriptor.defaultMarker,
    this.infoWindow = InfoWindow.noText,
    this.position = const LatLng(0.0, 0.0),
    this.rotation = 0.0,
    this.visible = true,
    this.zIndex = 0.0,
    this.onTap,
    this.onDrag,
    this.onDragStart,
    this.onDragEnd,
  }) : assert(alpha == null || (0.0 <= alpha && alpha <= 1.0));

  /// Uniquely identifies a [Marker].
  final MarkerId markerId;

  @override
  MarkerId get mapsId => markerId;

  /// The opacity of the marker, between 0.0 and 1.0 inclusive.
  ///
  /// 0.0 means fully transparent, 1.0 means fully opaque.
  final double alpha;

  /// The icon image point that will be placed at the [position] of the marker.
  ///
  /// The image point is specified in normalized coordinates: An anchor of
  /// (0.0, 0.0) means the top left corner of the image. An anchor
  /// of (1.0, 1.0) means the bottom right corner of the image.
  final Offset anchor;

  /// True if the marker icon consumes tap events. If not, the map will perform
  /// default tap handling by centering the map on the marker and displaying its
  /// info window.
  final bool consumeTapEvents;

  /// True if the marker is draggable by user touch events.
  final bool draggable;

  /// True if the marker is rendered flatly against the surface of the Earth, so
  /// that it will rotate and tilt along with map camera movements.
  final bool flat;

  /// A description of the bitmap used to draw the marker icon.
  BitmapDescriptor icon;

  /// A Google Maps InfoWindow.
  ///
  /// The window is displayed when the marker is tapped.
  final InfoWindow infoWindow;

  /// Geographical location of the marker.
  final LatLng position;

  /// Rotation of the marker image in degrees clockwise from the [anchor] point.
  final double rotation;

  /// True if the marker is visible.
  final bool visible;

  /// The z-index of the marker, used to determine relative drawing order of
  /// map overlays.
  ///
  /// Overlays are drawn in order of z-index, so that lower values means drawn
  /// earlier, and thus appearing to be closer to the surface of the Earth.
  final double zIndex;

  /// Callbacks to receive tap events for markers placed on this map.
  final VoidCallback? onTap;

  /// Signature reporting the new [LatLng] at the start of a drag event.
  final ValueChanged<LatLng>? onDragStart;

  /// Signature reporting the new [LatLng] at the end of a drag event.
  final ValueChanged<LatLng>? onDragEnd;

  /// Signature reporting the new [LatLng] during the drag event.
  final ValueChanged<LatLng>? onDrag;

  /// Creates a new [Marker] object whose values are the same as this instance,
  /// unless overwritten by the specified parameters.
  Marker copyWith({
    double? alphaParam,
    Offset? anchorParam,
    bool? consumeTapEventsParam,
    bool? draggableParam,
    bool? flatParam,
    BitmapDescriptor? iconParam,
    InfoWindow? infoWindowParam,
    LatLng? positionParam,
    double? rotationParam,
    bool? visibleParam,
    double? zIndexParam,
    VoidCallback? onTapParam,
    ValueChanged<LatLng>? onDragStartParam,
    ValueChanged<LatLng>? onDragParam,
    ValueChanged<LatLng>? onDragEndParam,
  }) {
    return Marker(
      markerId: markerId,
      alpha: alphaParam ?? alpha,
      anchor: anchorParam ?? anchor,
      consumeTapEvents: consumeTapEventsParam ?? consumeTapEvents,
      draggable: draggableParam ?? draggable,
      flat: flatParam ?? flat,
      icon: iconParam ?? icon,
      infoWindow: infoWindowParam ?? infoWindow,
      position: positionParam ?? position,
      rotation: rotationParam ?? rotation,
      visible: visibleParam ?? visible,
      zIndex: zIndexParam ?? zIndex,
      onTap: onTapParam ?? onTap,
      onDragStart: onDragStartParam ?? onDragStart,
      onDrag: onDragParam ?? onDrag,
      onDragEnd: onDragEndParam ?? onDragEnd,
    );
  }

  /// Creates a new [Marker] object whose values are the same as this instance.
  Marker clone() => copyWith();

  /// Converts this object to something serializable in JSON.
  Object toJson() {
    final Map<String, Object> json = <String, Object>{};

    void addIfPresent(String fieldName, Object? value) {
      if (value != null) {
        json[fieldName] = value;
      }
    }

    addIfPresent('markerId', markerId.value);
    addIfPresent('alpha', alpha);
    addIfPresent('anchor', _offsetToJson(anchor));
    addIfPresent('consumeTapEvents', consumeTapEvents);
    addIfPresent('draggable', draggable);
    addIfPresent('flat', flat);
    addIfPresent('icon', icon.toJson());
    addIfPresent('infoWindow', infoWindow._toJson());
    addIfPresent('position', position.toJson());
    addIfPresent('rotation', rotation);
    addIfPresent('visible', visible);
    addIfPresent('zIndex', zIndex);
    return json;
  }

  @override
  bool operator ==(Object other) {
    if (identical(this, other)) return true;
    if (other.runtimeType != runtimeType) return false;
    final Marker typedOther = other as Marker;
    return markerId == typedOther.markerId &&
        alpha == typedOther.alpha &&
        anchor == typedOther.anchor &&
        consumeTapEvents == typedOther.consumeTapEvents &&
        draggable == typedOther.draggable &&
        flat == typedOther.flat &&
        icon == typedOther.icon &&
        infoWindow == typedOther.infoWindow &&
        position == typedOther.position &&
        rotation == typedOther.rotation &&
        visible == typedOther.visible &&
        zIndex == typedOther.zIndex;
  }

  @override
  int get hashCode => markerId.hashCode;

  @override
  String toString() {
    return 'Marker{markerId: $markerId, alpha: $alpha, anchor: $anchor, '
        'consumeTapEvents: $consumeTapEvents, draggable: $draggable, flat: $flat, '
        'icon: $icon, infoWindow: $infoWindow, position: $position, rotation: $rotation, '
        'visible: $visible, zIndex: $zIndex, onTap: $onTap, onDragStart: $onDragStart, '
        'onDrag: $onDrag, onDragEnd: $onDragEnd}';
  }
}
于 2021-12-24T05:15:42.987 に答える