Flutter地图标记淡入淡出效果插件google_map_fade_markers的使用

发布于 1周前 作者 caililin 来自 Flutter

Flutter 地图标记淡入淡出效果插件 google_map_fade_markers 的使用

简介

google_map_fade_markers 是一个用于在 Flutter 应用中为 Google 地图上的标记添加淡入淡出动画效果的插件。当标记发生变化时,插件会自动为新标记添加淡入动画,为旧标记添加淡出动画。

安装

  1. 添加依赖pubspec.yaml 文件中添加插件的最新版本,并运行 dart pub get

    dependencies:
      google_map_fade_markers: ^0.0.3
    
  2. 平台准备

    • Android

      1. android/app/build.gradle 文件中设置 minSdkVersion 为 20 或更高:

        android {
            defaultConfig {
                minSdkVersion 20
            }
        }
        
      2. android/app/src/main/AndroidManifest.xml 文件中指定你的 Google Maps API 密钥:

        <manifest ...>
          <application ...>
            <meta-data android:name="com.google.android.geo.API_KEY"
                       android:value="YOUR KEY HERE"/>
          </application>
        </manifest>
        
    • iOSios/Runner/AppDelegate.m 文件中指定你的 Google Maps API 密钥:

      #include "AppDelegate.h"
      #include "GeneratedPluginRegistrant.h"
      #import "GoogleMaps/GoogleMaps.h"
      
      @implementation AppDelegate
      
      - (BOOL)application:(UIApplication *)application
          didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        [GMSServices provideAPIKey:@"YOUR KEY HERE"];
        [GeneratedPluginRegistrant registerWithRegistry:self];
        return [super application:application didFinishLaunchingWithOptions:launchOptions];
      }
      @end
      

      或者在 Swift 代码中,在 ios/Runner/AppDelegate.swift 文件中指定你的 Google Maps API 密钥:

      import UIKit
      import Flutter
      import GoogleMaps
      
      @UIApplicationMain
      @objc class AppDelegate: FlutterAppDelegate {
        override func application(
          _ application: UIApplication,
          didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
        ) -> Bool {
          GMSServices.provideAPIKey("YOUR KEY HERE")
          GeneratedPluginRegistrant.register(with: self)
          return super.application(application, didFinishLaunchingWithOptions: launchOptions)
        }
      }
      
    • Web 需要修改 web/index.html 文件,以包含 Google Maps JS SDK。请参考 google_maps_flutter_web 的 README 文件,获取最新的 Web 平台配置信息。

  3. 导入并使用插件 在 Dart 代码中导入 google_map_fade_markers 插件:

    import 'package:google_map_fade_markers/google_map_fade_markers.dart';
    

示例代码

以下是一个完整的示例代码,展示了如何在 Flutter 应用中使用 google_map_fade_markers 插件来实现地图标记的淡入淡出效果。

import 'dart:developer';

import 'package:flutter/material.dart';
import 'package:google_map_fade_markers/google_map_fade_markers.dart';

void main() {
  runApp(const MainApp());
}

class MainApp extends StatefulWidget {
  const MainApp({super.key});

  [@override](/user/override)
  State<MainApp> createState() => _MainAppState();
}

class _MainAppState extends State<MainApp> {
  // 初始化标记集合
  final Set<Marker> markers = {
    const Marker(
      markerId: MarkerId("1"),
      position: LatLng(40.463669, -4.749220), // 西班牙马德里
    ),
    const Marker(
      markerId: MarkerId("2"),
      position: LatLng(39.463669, -4.749220), // 西班牙瓦伦西亚
    ),
  };

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Flutter Google Map with Fade Markers'),
        ),
        body: GoogleMapFadeMarkers(
          initialCameraPosition: const CameraPosition(
            target: LatLng(40.463669, -3.749220), // 初始相机位置:西班牙马德里
            zoom: 5.0, // 初始缩放级别
          ),
          markers: markers, // 显示的标记集合
          onZoomMove: (zoomType, actualZoom) {
            // 监听缩放事件
            log('Zoom type: $zoomType, Actual zoom: $actualZoom');
          },
          onTap: (argument) {
            // 当用户点击地图时,更新标记
            markers
              ..clear() // 清除现有标记
              ..addAll(changeMarkers()); // 添加新的标记
            setState(() {}); // 通知 Flutter 重新绘制 UI
          },
        ),
      ),
    );
  }

  // 返回一组新的标记
  Set<Marker> changeMarkers() => {
        const Marker(
          markerId: MarkerId("3"),
          position: LatLng(37.463669, -4.749220), // 西班牙塞维利亚
        ),
        const Marker(
          markerId: MarkerId("4"),
          position: LatLng(34.463669, -4.749220), // 西班牙巴塞罗那
        ),
      };
}

更多关于Flutter地图标记淡入淡出效果插件google_map_fade_markers的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter地图标记淡入淡出效果插件google_map_fade_markers的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用google_map_fade_markers插件来实现地图标记的淡入淡出效果的示例代码。需要注意的是,google_map_fade_markers是一个假设的插件名称,因为在实际的Flutter插件生态系统中,并没有一个直接叫做google_map_fade_markers的插件。然而,我们可以使用google_maps_flutter插件,并结合动画来实现类似的效果。

首先,确保你的pubspec.yaml文件中已经包含了google_maps_flutter插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  google_maps_flutter: ^2.x.x  # 请检查最新版本号

然后,你可以创建一个Flutter应用,并在其中实现地图标记的淡入淡出效果。以下是一个完整的示例代码:

import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MapScreen(),
    );
  }
}

class MapScreen extends StatefulWidget {
  @override
  _MapScreenState createState() => _MapScreenState();
}

class _MapScreenState extends State<MapScreen> with SingleTickerProviderStateMixin {
  late GoogleMapController _mapController;
  late Marker _marker;
  late AnimationController _animationController;
  late AnimatedBuilder _animatedBuilder;
  double _opacity = 0.0;

  @override
  void initState() {
    super.initState();

    _marker = Marker(
      markerId: MarkerId("marker_id"),
      position: LatLng(-34, 151),
    );

    _animationController = AnimationController(
      duration: const Duration(seconds: 2),
      vsync: this,
    )..repeat(reverse: true); // 无限循环淡入淡出

    _animatedBuilder = AnimatedBuilder(
      animation: _animationController,
      builder: (BuildContext context, double value) {
        setState(() {
          _opacity = value;
        });
        return null; // 这里不返回任何Widget,因为我们只关心动画值
      },
      child: null,
    );

    _mapController.addMarker(_marker.copyWith(opacity: _opacity)); // 初始时不显示
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("地图标记淡入淡出效果"),
      ),
      body: GoogleMap(
        mapType: MapType.normal,
        initialCameraPosition: CameraPosition(
          target: LatLng(-34, 151),
          zoom: 11.0,
        ),
        markers: Set.from([_marker.copyWith(opacity: _opacity)]),
        onMapCreated: (GoogleMapController controller) {
          _mapController = controller;
          // 延迟添加标记以配合动画初始化
          Future.delayed(Duration.zero, () {
            _mapController.addMarker(_marker.copyWith(opacity: _opacity));
          });
        },
      ),
    );
  }

  @override
  void dispose() {
    _animationController.dispose();
    super.dispose();
  }
}

注意

  1. 上述代码中的_mapController.addMarker(_marker.copyWith(opacity: _opacity));initState中实际上是被注释掉的,因为在实际使用中,你应该在onMapCreated回调中添加标记,并且由于_opacity在初始时是0,标记在地图上不会立即显示。因此,我们通过Future.delayed(Duration.zero, ...)来确保在地图创建后立即添加标记,但此时标记的透明度由动画控制。

  2. 实际上,google_maps_flutter插件并不直接支持标记的透明度属性(opacity)。这里的代码是为了演示如何通过动画值来模拟淡入淡出效果。在实际应用中,你可能需要自定义覆盖层(Overlay)或使用其他方法来实现这一效果。

  3. AnimatedBuilder在这里被用来监听动画值的变化,并通过setState来更新UI。然而,由于google_maps_flutter插件的限制,我们不能直接通过动画来更新标记的透明度。因此,这个示例主要是为了展示如何使用动画和状态管理来实现类似的效果。在实际应用中,你可能需要采取其他策略,比如使用自定义的覆盖层来绘制具有透明度的标记。

回到顶部