From 064bb77cf15c5876e90db1d82cc0c4a8d95a92e3 Mon Sep 17 00:00:00 2001 From: Kuloud Date: Mon, 29 Jul 2024 00:28:45 +0800 Subject: [PATCH] =?UTF-8?q?release=201.0.7,=20Close=20Issue=20#10=20,=20?= =?UTF-8?q?=20=E6=B7=BB=E5=8A=A0Logo=E4=BD=8D=E7=BD=AE=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 4 ++ android/build.gradle | 1 + .../amap/flutter/map/AMapOptionsBuilder.java | 33 ++++++++++- .../flutter/map/core/AMapOptionsSink.java | 6 +- .../amap/flutter/map/core/MapController.java | 25 ++++++++ .../amap/flutter/map/core/UISettingsSink.java | 41 +++++++++++++ .../amap/flutter/map/utils/ConvertUtil.java | 15 +++++ .../lib/pages/interactive/map_ui_options.dart | 55 +++++++++++++++++- example/lib/widgets/amap_radio_group.dart | 20 +++---- example/pubspec.yaml | 1 + ios/Classes/Category/MAMapView+Flutter.m | 45 +++++++++++++++ lib/amap_map.dart | 1 + lib/src/amap_widget.dart | 57 +++++++++++++------ pubspec.yaml | 3 +- 14 files changed, 274 insertions(+), 33 deletions(-) create mode 100644 android/src/main/java/com/amap/flutter/map/core/UISettingsSink.java diff --git a/CHANGELOG.md b/CHANGELOG.md index b1cb9a2..5ebc950 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.6 +2024-07-28. +* Close Issue [#10](https://github.com/kuloud/amap_map/issues/10) 添加Logo位置设置,参见example: map_ui_options.dart + ## 1.0.6 2024-06-27. * 升级amap android sdk版本 V10.0.700_loc6.4.5_sea9.7.2 2024-05-13 看高德更新日志,应该是计划后续版本捆绑loc+search一起更新了 diff --git a/android/build.gradle b/android/build.gradle index 068f9ea..3613035 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -34,5 +34,6 @@ android { dependencies { implementation 'com.amap.api:3dmap-location-search:10.0.700_loc6.4.5_sea9.7.2' + implementation 'androidx.annotation:annotation:1.8.1' } diff --git a/android/src/main/java/com/amap/flutter/map/AMapOptionsBuilder.java b/android/src/main/java/com/amap/flutter/map/AMapOptionsBuilder.java index 4fb960b..9521c9d 100644 --- a/android/src/main/java/com/amap/flutter/map/AMapOptionsBuilder.java +++ b/android/src/main/java/com/amap/flutter/map/AMapOptionsBuilder.java @@ -2,6 +2,7 @@ package com.amap.flutter.map; import android.content.Context; +import androidx.annotation.IntRange; import androidx.lifecycle.LifecycleOwner; import com.amap.api.maps.AMapOptions; @@ -10,6 +11,7 @@ import com.amap.api.maps.model.CustomMapStyleOptions; import com.amap.api.maps.model.LatLngBounds; import com.amap.api.maps.model.MyLocationStyle; import com.amap.flutter.map.core.AMapOptionsSink; +import com.amap.flutter.map.core.UISettingsSink; import com.amap.flutter.map.utils.LogUtil; import java.util.List; @@ -22,7 +24,7 @@ import io.flutter.plugin.common.BinaryMessenger; * @mail hongming.whm@alibaba-inc.com * @since */ -class AMapOptionsBuilder implements AMapOptionsSink { +class AMapOptionsBuilder implements AMapOptionsSink, UISettingsSink { private static final String CLASS_NAME = "AMapOptionsBuilder"; private final AMapOptions options = new AMapOptions(); private CustomMapStyleOptions customMapStyleOptions; @@ -36,6 +38,10 @@ class AMapOptionsBuilder implements AMapOptionsSink { private boolean buildingsEnabled = true; private boolean labelsEnabled = true; + private int logoPosition = AMapOptions.LOGO_POSITION_BOTTOM_LEFT; + private int logoBottomMargin = 0; + private int logoLeftMargin = 0; + private float anchorX = 2.0F; private float anchorY = 2.0F; @@ -82,6 +88,10 @@ class AMapOptionsBuilder implements AMapOptionsSink { aMapPlatformView.getMapController().setBuildingsEnabled(buildingsEnabled); aMapPlatformView.getMapController().setLabelsEnabled(labelsEnabled); + aMapPlatformView.getMapController().setLogoPosition(logoPosition); + aMapPlatformView.getMapController().setLogoBottomMargin(logoBottomMargin); + aMapPlatformView.getMapController().setLogoLeftMargin(logoLeftMargin); + if (null != initialMarkers) { List markerList = (List) initialMarkers; @@ -195,6 +205,27 @@ class AMapOptionsBuilder implements AMapOptionsSink { options.scaleControlsEnabled(scaleEnabled); } + @Override + public void setLogoPosition(@IntRange(from = AMapOptions.LOGO_POSITION_BOTTOM_LEFT, to = AMapOptions.LOGO_POSITION_BOTTOM_RIGHT) int logoPosition) { + options.logoPosition(logoPosition); + this.logoPosition = logoPosition; + } + + @Override + public int getLogoPosition() { + return options.getLogoPosition(); + } + + @Override + public void setLogoBottomMargin(int pixels) { + this.logoBottomMargin = pixels; + } + + @Override + public void setLogoLeftMargin(int pixels) { + this.logoLeftMargin = pixels; + } + @Override public void setInitialMarkers(Object markersObject) { diff --git a/android/src/main/java/com/amap/flutter/map/core/AMapOptionsSink.java b/android/src/main/java/com/amap/flutter/map/core/AMapOptionsSink.java index a47fe82..59f944c 100644 --- a/android/src/main/java/com/amap/flutter/map/core/AMapOptionsSink.java +++ b/android/src/main/java/com/amap/flutter/map/core/AMapOptionsSink.java @@ -1,5 +1,8 @@ package com.amap.flutter.map.core; +import androidx.annotation.IntRange; + +import com.amap.api.maps.AMapOptions; import com.amap.api.maps.model.CameraPosition; import com.amap.api.maps.model.CustomMapStyleOptions; import com.amap.api.maps.model.LatLngBounds; @@ -12,7 +15,7 @@ import com.amap.api.maps.model.MyLocationStyle; * @mail hongming.whm@alibaba-inc.com * @since */ -public interface AMapOptionsSink { +public interface AMapOptionsSink extends UISettingsSink { void setCamera(CameraPosition camera); @@ -42,7 +45,6 @@ public interface AMapOptionsSink { public void setScaleEnabled(boolean scaleEnabled); - public void setZoomGesturesEnabled(boolean zoomGesturesEnabled); public void setScrollGesturesEnabled(boolean scrollGesturesEnabled); diff --git a/android/src/main/java/com/amap/flutter/map/core/MapController.java b/android/src/main/java/com/amap/flutter/map/core/MapController.java index 16de4a0..b97d773 100644 --- a/android/src/main/java/com/amap/flutter/map/core/MapController.java +++ b/android/src/main/java/com/amap/flutter/map/core/MapController.java @@ -356,4 +356,29 @@ public class MapController } + @Override + public void setLogoPosition(int logoPosition) { + if (null != amap) { + amap.getUiSettings().setLogoPosition(logoPosition); + } + } + + @Override + public int getLogoPosition() { + return null != amap ? amap.getUiSettings().getLogoPosition() : 0; + } + + @Override + public void setLogoBottomMargin(int pixels) { + if (null != amap) { + amap.getUiSettings().setLogoBottomMargin(pixels); + } + } + + @Override + public void setLogoLeftMargin(int pixels) { + if (null != amap) { + amap.getUiSettings().setLogoLeftMargin(pixels); + } + } } diff --git a/android/src/main/java/com/amap/flutter/map/core/UISettingsSink.java b/android/src/main/java/com/amap/flutter/map/core/UISettingsSink.java new file mode 100644 index 0000000..b1ac05d --- /dev/null +++ b/android/src/main/java/com/amap/flutter/map/core/UISettingsSink.java @@ -0,0 +1,41 @@ +package com.amap.flutter.map.core; + +import androidx.annotation.IntRange; + +import com.amap.api.maps.AMapOptions; + +/** + * @author kuloud + */ +public interface UISettingsSink { + + /** + * 设置“高德地图”Logo的位置。 + * + * @param logoPosition + */ + void setLogoPosition(@IntRange(from = AMapOptions.LOGO_POSITION_BOTTOM_LEFT, to = AMapOptions.LOGO_POSITION_BOTTOM_RIGHT) int logoPosition); + + /** + * 获取“高德地图”Logo的位置。 + * + * @return + */ + int getLogoPosition(); + + /** + * 设置Logo下边界距离屏幕底部的边距 + * Note: SDK 内有setLogoMarginRate接口按比例设置Logo位置,但是高德官方文档没有相关参数描述 + * + * @param pixels + */ + void setLogoBottomMargin(int pixels); + + /** + * 设置Logo左边界距离屏幕左侧的边距 + * Note: SDK 内有setLogoMarginRate接口按比例设置Logo位置,但是高德官方文档没有相关参数描述 + * + * @param pixels + */ + void setLogoLeftMargin(int pixels); +} diff --git a/android/src/main/java/com/amap/flutter/map/utils/ConvertUtil.java b/android/src/main/java/com/amap/flutter/map/utils/ConvertUtil.java index 934ee1b..2b4599c 100644 --- a/android/src/main/java/com/amap/flutter/map/utils/ConvertUtil.java +++ b/android/src/main/java/com/amap/flutter/map/utils/ConvertUtil.java @@ -278,6 +278,21 @@ public class ConvertUtil { if (null != zoomGesturesEnabled) { sink.setZoomGesturesEnabled(toBoolean(zoomGesturesEnabled)); } + + final Object logoPosition = data.get("logoPosition"); + if (null != logoPosition) { + sink.setLogoPosition(toInt(logoPosition)); + } + + final Object logoBottomMargin = data.get("logoBottomMargin"); + if (null != logoBottomMargin) { + sink.setLogoBottomMargin(toInt(logoBottomMargin)); + } + + final Object logoLeftMargin = data.get("logoLeftMargin"); + if (null != logoLeftMargin) { + sink.setLogoLeftMargin(toInt(logoLeftMargin)); + } } catch (Throwable e) { LogUtil.e(CLASS_NAME, "interpretAMapOptions", e); } diff --git a/example/lib/pages/interactive/map_ui_options.dart b/example/lib/pages/interactive/map_ui_options.dart index efc43df..04867e5 100644 --- a/example/lib/pages/interactive/map_ui_options.dart +++ b/example/lib/pages/interactive/map_ui_options.dart @@ -1,7 +1,10 @@ import 'package:amap_map/amap_map.dart'; import 'package:amap_map_example/widgets/amap_gridview.dart'; +import 'package:amap_map_example/widgets/amap_radio_group.dart'; import 'package:amap_map_example/widgets/amap_switch_button.dart'; import 'package:flutter/material.dart'; +import 'package:x_amap_base/x_amap_base.dart'; +import 'package:x_common/utils/logger.dart'; class MapUIDemoPage extends StatefulWidget { MapUIDemoPage({Key? key}) : super(key: key); @@ -26,6 +29,16 @@ class _BodyState extends State { ///是否显示比例尺 bool _scaleEnabled = true; + LogoPosition _logoPosition = LogoPosition.BOTTOM_LEFT; + int _logoBottomMargin = 0; + int _logoLeftMargin = 0; + + final Map _radioValueMap = { + '底部居左': LogoPosition.BOTTOM_LEFT, + '底部居中': LogoPosition.BOTTOM_CENTER, + '底部居右': LogoPosition.BOTTOM_RIGHT, + }; + @override Widget build(BuildContext context) { final AMapWidget map = AMapWidget( @@ -34,6 +47,9 @@ class _BodyState extends State { compassEnabled: _compassEnabled, labelsEnabled: _labelsEnabled, scaleEnabled: _scaleEnabled, + logoPosition: _logoPosition, + logoBottomMargin: _logoBottomMargin, + logoLeftMargin: _logoLeftMargin, ); //ui控制 @@ -97,6 +113,43 @@ class _BodyState extends State { padding: EdgeInsets.only(left: 10), child: AMapGradView(childrenWidgets: _uiOptions), ), + AMapRadioGroup( + groupLabel: 'Logo位置', + groupValue: _logoPosition, + radioValueMap: _radioValueMap, + onChanged: (value) => { + //改变当前地图样式为选中的样式 + setState(() { + _logoPosition = value!; + }) + }, + ), + Text('Logo底部边距: $_logoBottomMargin'), + Slider( + value: _logoBottomMargin.toDouble(), + min: 0, + max: 100, + divisions: 100, + label: _logoBottomMargin.round().toString(), + onChanged: (double value) { + setState(() { + _logoBottomMargin = value.round(); + }); + }, + ), + Text('Logo左侧边距: $_logoLeftMargin'), + Slider( + value: _logoLeftMargin.toDouble(), + min: 0, + max: 100, + divisions: 100, + label: _logoLeftMargin.round().toString(), + onChanged: (double value) { + setState(() { + _logoLeftMargin = value.round(); + }); + }, + ), ], ), ); @@ -110,7 +163,7 @@ class _BodyState extends State { crossAxisAlignment: CrossAxisAlignment.stretch, children: [ Container( - height: MediaQuery.of(context).size.height * 0.7, + height: MediaQuery.of(context).size.height * 0.5, width: MediaQuery.of(context).size.width, child: map, ), diff --git a/example/lib/widgets/amap_radio_group.dart b/example/lib/widgets/amap_radio_group.dart index bb4fbe1..8a5b644 100644 --- a/example/lib/widgets/amap_radio_group.dart +++ b/example/lib/widgets/amap_radio_group.dart @@ -5,7 +5,7 @@ class AMapRadioGroup extends StatefulWidget { final String? groupLabel; final T? groupValue; final Map? radioValueMap; - final ValueChanged? onChanged; + final ValueChanged? onChanged; AMapRadioGroup( {Key? key, this.groupLabel, @@ -15,37 +15,35 @@ class AMapRadioGroup extends StatefulWidget { : super(key: key); @override - _AMapRadioGroupState createState() => _AMapRadioGroupState(); + _AMapRadioGroupState createState() => _AMapRadioGroupState(); } -class _AMapRadioGroupState extends State { - dynamic _groupValue; +class _AMapRadioGroupState extends State> { + T? _groupValue; @override void initState() { super.initState(); - _groupValue = widget.groupValue ?? null; + _groupValue = (widget.groupValue ?? null) as T?; } @override Widget build(BuildContext context) { List radioList = []; - _groupValue = widget.groupValue ?? null; + _groupValue = (widget.groupValue ?? null) as T?; Widget _myRadio(String label, dynamic radioValue) { return Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Text(label), - Radio( + Radio( value: radioValue, groupValue: _groupValue, - onChanged: (_value) { + onChanged: (T? _value) { setState(() { _groupValue = _value; }); - if (null != widget.onChanged) { - widget.onChanged!(_value); - } + widget.onChanged!(_value); }, ), ], diff --git a/example/pubspec.yaml b/example/pubspec.yaml index 9608b0f..2dd8573 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -22,6 +22,7 @@ dependencies: # The example app is bundled with the plugin so we use a path dependency on # the parent directory to use the current plugin's version. path: ../ + x_common: ^1.0.4 # amap_map_extensions: ^0.0.1 # amap_map_extensions: diff --git a/ios/Classes/Category/MAMapView+Flutter.m b/ios/Classes/Category/MAMapView+Flutter.m index a85f364..cd95a19 100644 --- a/ios/Classes/Category/MAMapView+Flutter.m +++ b/ios/Classes/Category/MAMapView+Flutter.m @@ -3,6 +3,7 @@ // amap_map // // Created by lly on 2020/10/30. +// Updated by kuloud on 2024/07/29. // #import "MAMapView+Flutter.h" @@ -217,6 +218,50 @@ if (rotateCameraEnable) { self.rotateCameraEnabled = [rotateCameraEnable boolValue]; } + + NSNumber *logoPosition = dict[@"logoPosition"]; + NSNumber *logoBottomMargin = dict[@"logoBottomMargin"]; + NSNumber *logoLeftMargin = dict[@"logoLeftMargin"]; + + CGSize mapSize = self.bounds.size; + CGSize logoSize = CGSizeMake(110, 40); // 官方文档只一行代码 _mapView.logoCenter = CGPointMake(CGRectGetWidth(self.view.bounds)-55, 450);,猜测logo的大小是110x40 + + CGPoint logoCenter = CGPointZero; + + if (logoBottomMargin || logoLeftMargin) { + CGFloat bottomMargin = logoBottomMargin ? [logoBottomMargin floatValue] : 0; + CGFloat leftMargin = logoLeftMargin ? [logoLeftMargin floatValue] : 0; + + logoCenter.x = leftMargin + logoSize.width / 2; + logoCenter.y = mapSize.height - bottomMargin - logoSize.height / 2; + + } else if (logoPosition) { + NSInteger position = [logoPosition integerValue]; + switch (position) { + case 0: // LOGO_POSITION_BOTTOM_LEFT + logoCenter = CGPointMake(logoSize.width / 2, mapSize.height - logoSize.height / 2); + break; + case 1: // LOGO_POSITION_BOTTOM_CENTER + logoCenter = CGPointMake(mapSize.width / 2, mapSize.height - logoSize.height / 2); + break; + case 2: // LOGO_POSITION_BOTTOM_RIGHT + logoCenter = CGPointMake(mapSize.width - logoSize.width / 2, mapSize.height - logoSize.height / 2); + break; + default: + // 默认为左下角 + logoCenter = CGPointMake(logoSize.width / 2, mapSize.height - logoSize.height / 2); + break; + } + } else { + logoCenter = CGPointMake(logoSize.width / 2, mapSize.height - logoSize.height / 2); + } + + // 确保logoCenter在mapView.bounds之内 + logoCenter.x = MAX(logoSize.width / 2, MIN(logoCenter.x, mapSize.width - logoSize.width / 2)); + logoCenter.y = MAX(logoSize.height / 2, MIN(logoCenter.y, mapSize.height - logoSize.height / 2)); + + // 设置logo的位置 + self.logoCenter = logoCenter; } @end diff --git a/lib/amap_map.dart b/lib/amap_map.dart index 927a673..96f3b74 100644 --- a/lib/amap_map.dart +++ b/lib/amap_map.dart @@ -24,6 +24,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:x_common/utils/logger.dart'; export 'package:amap_map/src/types/types.dart'; diff --git a/lib/src/amap_widget.dart b/lib/src/amap_widget.dart index b51cf83..be0800e 100644 --- a/lib/src/amap_widget.dart +++ b/lib/src/amap_widget.dart @@ -64,6 +64,12 @@ class AMapWidget extends StatefulWidget { ///是否支持倾斜手势 final bool tiltGesturesEnabled; + final LogoPosition? logoPosition; + + final int? logoBottomMargin; + + final int? logoLeftMargin; + /// 地图上显示的Marker final Set markers; @@ -140,7 +146,10 @@ class AMapWidget extends StatefulWidget { this.markers = const {}, this.polylines = const {}, this.polygons = const {}, - this.extensions = const []}) + this.extensions = const [], + this.logoPosition, + this.logoBottomMargin, + this.logoLeftMargin}) : super(key: key); /// @@ -362,6 +371,12 @@ class _AMapOptions { ///是否支持仰角手势 final bool? tiltGesturesEnabled; + /// logo的位置 + final int? logoPosition; + + final int? logoBottomMargin; + final int? logoLeftMargin; + _AMapOptions({ this.mapType = MapType.normal, this.buildingsEnabled, @@ -378,26 +393,31 @@ class _AMapOptions { this.scrollGesturesEnabled, this.tiltGesturesEnabled, this.zoomGesturesEnabled, + this.logoPosition, + this.logoBottomMargin, + this.logoLeftMargin, }); static _AMapOptions fromWidget(AMapWidget map) { return _AMapOptions( - mapType: map.mapType, - buildingsEnabled: map.buildingsEnabled, - compassEnabled: map.compassEnabled, - labelsEnabled: map.labelsEnabled, - limitBounds: map.limitBounds, - minMaxZoomPreference: map.minMaxZoomPreference, - scaleEnabled: map.scaleEnabled, - touchPoiEnabled: map.touchPoiEnabled, - trafficEnabled: map.trafficEnabled, - rotateGesturesEnabled: map.rotateGesturesEnabled, - scrollGesturesEnabled: map.scrollGesturesEnabled, - tiltGesturesEnabled: map.tiltGesturesEnabled, - zoomGesturesEnabled: map.zoomGesturesEnabled, - customStyleOptions: map.customStyleOptions?.clone(), - myLocationStyleOptions: map.myLocationStyleOptions?.clone(), - ); + mapType: map.mapType, + buildingsEnabled: map.buildingsEnabled, + compassEnabled: map.compassEnabled, + labelsEnabled: map.labelsEnabled, + limitBounds: map.limitBounds, + minMaxZoomPreference: map.minMaxZoomPreference, + scaleEnabled: map.scaleEnabled, + touchPoiEnabled: map.touchPoiEnabled, + trafficEnabled: map.trafficEnabled, + rotateGesturesEnabled: map.rotateGesturesEnabled, + scrollGesturesEnabled: map.scrollGesturesEnabled, + tiltGesturesEnabled: map.tiltGesturesEnabled, + zoomGesturesEnabled: map.zoomGesturesEnabled, + customStyleOptions: map.customStyleOptions?.clone(), + myLocationStyleOptions: map.myLocationStyleOptions?.clone(), + logoPosition: map.logoPosition?.index, + logoBottomMargin: map.logoBottomMargin, + logoLeftMargin: map.logoLeftMargin); } Map toMap() { @@ -423,6 +443,9 @@ class _AMapOptions { addIfNonNull('tiltGesturesEnabled', tiltGesturesEnabled); addIfNonNull('zoomGesturesEnabled', zoomGesturesEnabled); addIfNonNull('myLocationStyle', myLocationStyleOptions?.clone().toMap()); + addIfNonNull('logoPosition', logoPosition); + addIfNonNull('logoBottomMargin', logoBottomMargin); + addIfNonNull('logoLeftMargin', logoLeftMargin); return optionsMap; } diff --git a/pubspec.yaml b/pubspec.yaml index 62bc3ef..5fa9d55 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: amap_map description: Amap SDK Flutter plugin for integrating AMapSDK in iOS and Android applications. -version: 1.0.6 +version: 1.0.7 homepage: https://github.com/kuloud/amap_map issue_tracker: https://github.com/kuloud/amap_map/issues platforms: @@ -22,6 +22,7 @@ dependencies: stream_transform: ^2.0.0 x_amap_base: ^1.0.3 + x_common: ^1.0.4 # provider: ^6.1.1 # x_amap_base: # path: ../x_amap_base