天地图的平滑移动,为 panTo 带来动画效果

最近在看天地图,发现天地图的 panTo 没有动画效果支持,因此在 ai 的帮助下写了一个 smoothMove 缓动函数, 使用 easeInOutCubic 这种方式缓动,即先慢,然后快,然后再慢,感觉效果比较好。

本函数是用ts写的,要转成js也很容易。

/**
 * 平滑移动地图到指定位置和缩放级别(使用 easeInOutCubic 缓动函数优化动画效果)
 * @param map 天地图实例
 * @param targetLngLat 目标经纬度对象
 * @param targetZoom 目标缩放级别,设置为0则不进行缩放
 * @param duration 动画持续时间(毫秒,默认1000ms)
 */
function smoothMove(
  map: any,
  targetLngLat: T.LngLat,
  targetZoom: number,
  duration: number = 500
): void {
  const startCenter: T.LngLat = map.getCenter();
  const startZoom: number = map.getZoom();
  const startTime: number = Date.now();
  if(targetZoom == 0) targetZoom = startZoom;

  // 添加缓动函数 - easeInOutCubic(开始和结束慢,中间快)
  const easeInOutCubic = (t: number): number => {
    return t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2;
  };

  // 动画帧回调函数
  const animate = (): void => {
    const elapsed: number = Date.now() - startTime;
    let progress: number = Math.min(elapsed / duration, 1);
    
    // 应用缓动函数转换进度(实现非线性动画)
    const easedProgress = easeInOutCubic(progress);
    
    // 位置插值计算(使用缓动后的进度)
    const lng: number = startCenter.lng + (targetLngLat.lng - startCenter.lng) * easedProgress;
    const lat: number = startCenter.lat + (targetLngLat.lat - startCenter.lat) * easedProgress;
    
    // 缩放级别插值
    const zoom: number = startZoom + (targetZoom - startZoom) * easedProgress;
    
    // 更新地图视图(中心点和缩放级别)
    map.panTo(new T.LngLat(lng, lat), zoom);
    
    // 递归调用直到动画完成
    if (progress < 1) {
      requestAnimationFrame(animate);
    }
  };
  
  animate(); // 启动动画
}

在 UniApp 开发中使用腾讯地图的 `panTo` 方法,可以实现地图平滑移动到指定的经纬度位置。以下是具体的使用步骤和示例代码: ### 1. 引入腾讯地图 SDK 首先,需要在 UniApp 项目中引入腾讯地图 SDK。可以通过在 `manifest.json` 文件中配置相关信息来完成。 ### 2. 在页面中使用腾讯地图组件 在 `.vue` 文件中使用腾讯地图组件,并绑定相关事件和属性。 ```vue <template> <view> <map id="myMap" :style="{ width: '100%', height: '500px' }" :longitude="longitude" :latitude="latitude" :scale="scale" @markertap="onMarkerTap" ref="mapRef" ></map> <button @click="panToLocation">移动地图</button> </view> </template> <script> export default { data() { return { longitude: 113.976284, // 初始经度 latitude: 22.543099, // 初始纬度 scale: 16, // 初始缩放级别 targetLongitude: 113.986284, // 目标经度 targetLatitude: 22.553099 // 目标纬度 }; }, methods: { panToLocation() { const mapCtx = uni.createMapContext('myMap', this); mapCtx.panTo({ longitude: this.targetLongitude, latitude: this.targetLatitude, success: function () { console.log('地图移动成功'); }, fail: function (err) { console.error('地图移动失败', err); } }); }, onMarkerTap(e) { console.log('点击了标记点', e); } } }; </script> ``` ### 代码解释 - **地图组件**:使用 `<map>` 组件来显示腾讯地图,并设置初始的经纬度和缩放级别。 - **按钮事件**:点击按钮时,调用 `panToLocation` 方法。 - **`panTo` 方法**:通过 `uni.createMapContext` 获取地图上下文对象,然后调用 `panTo` 方法,传入目标经纬度。 ### 注意事项 - `panTo` 方法会平滑移动地图到指定的经纬度位置。 - 确保传入的经纬度是有效的,否则可能会导致地图移动失败。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值