HarmonyOS 鸿蒙Next sceneMap(场景化控件)自定义地图
HarmonyOS 鸿蒙Next sceneMap(场景化控件)自定义地图 sceneMap(场景化控件)中的chooseLocation方法拉的Ui界面怎么自定义,或者说怎么设置中心定位点,效果是拖动地图不变
参考下此demo,看能否实现您要的效果
import { map, mapCommon, MapComponent } from '@kit.MapKit';
import { AsyncCallback, BusinessError } from '@kit.BasicServicesKit';
import { abilityAccessCtrl, bundleManager, common, PermissionRequestResult, Permissions } from '@kit.AbilityKit';
import { geoLocationManager } from '@kit.LocationKit';
@Entry
@Component
struct HuaweiMyLocationDemo {
async checkPermission(): Promise<void> {
let applyResult: boolean = false;
const permissions: Array<Permissions> = ['ohos.permission.LOCATION','ohos.permission.APPROXIMATELY_LOCATION','ohos.permission.INTERNET'];
for(let permission of permissions) {
let grantStatus: abilityAccessCtrl.GrantStatus = await this.checkAccessToken(permission);
if(grantStatus == abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
applyResult = true;
} else {
applyResult = false
}
}
if(!applyResult) {
this.requestPermissions();
} else {
//启用我的位置图层,mapController为地图操作类对象,获取方式详见地图呈现章节
this.mapController?.setMyLocationEnabled(true);
//启用我的位置按钮
this.mapController?.setMyLocationControlsEnabled(true);
}
}
//如果没有被授予定位权限,动态向用户申请授权
requestPermissions(): void {
let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
atManager.requestPermissionsFromUser(getContext() as common.UIAbilityContext,[ 'ohos.permission.LOCATION', 'ohos.permission.APPROXIMATELY_LOCATION','ohos.permission.INTERNET'])
.then((data: PermissionRequestResult) => {
//启用我的位置图层
this.mapController?.setMyLocationEnabled(true);
//启用我的位置按钮
this.mapController?.setMyLocationControlsEnabled(true);
})
.catch((err: BusinessError) => {
console.error(`Failed to request permissions from user. Code is ${err.code}, message is ${err.message}`)
})
}
async checkAccessToken(permission: Permissions): Promise<abilityAccessCtrl.GrantStatus> {
let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
let grantStatus: abilityAccessCtrl.GrantStatus = abilityAccessCtrl.GrantStatus.PERMISSION_DENIED;
//获取应用程序的accessTokenID
let tokenId: number = 0;
try {
let bundleInfo: bundleManager.BundleInfo = await bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION);
let appInfo: bundleManager.ApplicationInfo = bundleInfo.appInfo;
tokenId = appInfo.accessTokenId;
} catch ( error ) {
let err: BusinessError = error as BusinessError;
console.error(`Failed to get bundle info for self. Code is ${err.code},message is ${err.message}`)
}
//校验应用是否被授予权限
try{
grantStatus = await atManager.checkAccessToken(tokenId,permission);
} catch (error) {
let err: BusinessError = error as BusinessError;
console.error(`Failed to check access token. Code is ${err.code}, message is ${err.message}`)
}
return grantStatus;
}
//定义参数mapOption,设置地图中心点坐标以及层级。
private mapOption?: mapCommon.MapOptions;
//定义参数callback,通过callback回调的方式获取MapComponentController对象,用来操作地图。
private callback?: AsyncCallback<MapComponentController>
//定义TAG
private TAG = 'HuaweiMyLocationDemo';
//地定义地图参数mapController,获取地图的控制器类,用来操作地图
private mapController?: map.MapComponentController;
aboutToAppear(): void {
this.checkPermission();
// 地图初始化参数,设置地图中心坐标以及层级
this.mapOption = {
position: {
target: {
latitude: 39.9,
longitude:116.4
},
zoom: 10
},
myLocationControlsEnabled: true,
scaleControlsEnabled: true,
};
// 地图初始化的回调
this.callback = async (err, mapController) => {
if(!err) {
//获取地图的控制器类,用来操作地图
this.mapController = mapController;
// 启用我的位置图层
this.mapController?.setMyLocationEnabled(true);
//启用我的位置按钮。
this.mapController?.setMyLocationControlsEnabled(true);
this.mapController.setZoomControlsEnabled(true);
// 指南针开关
this.mapController.setCompassControlsEnabled(true);
//滚动相机,将相机按照指定的像素点移动
let x = 100.0;
let y = 100.0;
let cameraUpdate = map.scrollBy(x, y);
// 以动画方式移动地图相机
this.mapController.animateCamera(cameraUpdate, 1000);
// 设置最小偏好缩放级别,范围为[2,20]
this.mapController.setMinZoom(6);
// 设置最大偏好缩放级别,范围为[2,20]
this.mapController.setMaxZoom(14);
let style: mapCommon.MyLocationStyle = {
anchorU: 0.5,
anchorV: 0.5,
radiusFillColor: 0xffff0000,
// icon为自定义图标资源,使用时需要替换
// 图标存放在resources/rawfile,icon参数传入rawfile文件夹下的相对路径
icon: 'icon.png',
};
await this.mapController.setMyLocationStyle(style);
//初始化我的位置
this.getMyLocation()
}
}
}
build() {
Stack() {
MapComponent({mapOptions: this.mapOption, mapCallback: this.callback}).width('100%').height('100%');
}.height('100%')
}
// 获取当前位置并视图移动过去
getMyLocation() {
geoLocationManager.getCurrentLocation().then(async (result) => {
console.log('MapSignIn', 'getMyLocation = ' + JSON.stringify(result))
let position: geoLocationManager.Location = {
"latitude": result.latitude,
"longitude": result.longitude,
"altitude": 0,
"accuracy": 0,
"speed": 0,
"timeStamp": 0,
"direction": 0,
"timeSinceBoot": 0
};
this.mapController?.setMyLocation(position)
//创建CameraUpdate对象
let gcj02Position: mapCommon.LatLng = await this.convertCoordinate(result.latitude,result.longitude)
let latLng: mapCommon.LatLng = {
latitude: gcj02Position.latitude,
longitude:gcj02Position.longitude
}
let zoom = 14;
let cameraUpdate = map.newLatLng(latLng,zoom)
// 以动画方式移动地图相机
this.mapController?.animateCamera(cameraUpdate,1000);
})
}
async convertCoordinate(latitude: number, longitude: number): Promise<mapCommon.LatLng> {
let wgs84Position: mapCommon.LatLng = {
latitude: latitude,
longitude: longitude
}
let gcj02Postion: mapCommon.LatLng = await map.convertCoordinate(mapCommon.CoordinateType.WGS84, mapCommon.CoordinateType.GCJ02,wgs84Position);
return gcj02Postion;
}
}
更多关于HarmonyOS 鸿蒙Next sceneMap(场景化控件)自定义地图的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
HarmonyOS 鸿蒙中的Next sceneMap(场景化控件)允许开发者自定义地图界面,为用户提供更为丰富和个性化的场景体验。自定义地图通常涉及地图数据的加载、地图元素的绘制以及用户交互的实现。
在鸿蒙系统中,自定义地图通常通过特定的地图服务API或SDK来完成。开发者需要首先集成相应的地图服务SDK,这通常包括在项目的构建配置中引入SDK依赖,以及遵循SDK提供的接口规范。
一旦SDK集成完成,开发者可以开始定义地图的基本属性,如地图的中心点、缩放级别、地图类型(如卫星图、街景图等)。接下来,开发者可以在地图上添加自定义元素,这些元素可以是标记(Marker)、多边形(Polygon)、折线(Polyline)等,用于展示特定的地理位置信息或用户数据。
此外,为了实现丰富的用户交互,开发者还需要处理地图事件,如点击事件、拖拽事件、缩放事件等。这些事件的处理通常通过监听器模式来实现,开发者可以在事件触发时执行相应的逻辑代码。
需要注意的是,自定义地图的具体实现细节可能因地图服务SDK的不同而有所差异。开发者应参考所选SDK的官方文档,以确保正确实现自定义地图功能。
如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html