• 小程序3-地图定位2


      上一次已经能正常显示地图,并定位到当前用户所在位置。这一次我们要实现的任务是在地图的中心添加一个pin图标,表示这是地图的中心;然后在地图的左下角添加一个center图标,点击此图标,能让地图中心立刻返回用户当前所在地。

      这两个标记位置是固定的,不管用户如何拖拽地图,这2个图标位置都不会改变。所以这里我们使用了controls这个小程序map组件的属性来实现,虽然这个属性已经不推荐使用了,但是仍然可以用的。实现效果如下:

      

      一、添加地图中心图标pin

      这个图标的作用就是个用户一个参照中心。通过做这个,我们可以学习如何在map上加一些位置固定的元素。

      1.把pin.png图片导入到resources目录下。

      2.在.wxml文件中,找到<map>标签,给它添加controls属性。代码如下:

      <map longitude="{{longitude}}" latitude="{{latitude}}" id="map" class="map" show-location="true"
       scale="17" controls="{{controls}}" ></map>

      3.打开页面的.js文件,配置controls的值。  

      data: {
        longitude: '', //经度
        latitude: '',   //维度 
        controls: [{
          id: 1,
          iconPath: '/resources/pin.png',
          position: {
            left: 0,
            top: 0,
             30,
            height: 40,
          }
        }]
     }

      需要注意的是,controls属性的值是一个数组,哪怕只有一个元素。数组里的每一项必须是一个对象,如果想在地图上插入多个图标,那么每1个图标对应一个对象。这个对象的成员属性是微信小程序定义死的,按官方文档来写就行了。id不能重复,left和top是用来给图标定位的,width和height是图标显示大小。我们这里给的left值和top值是0,此时pin图标是显示在地图左上角(0,0)位置的。这显然是不行的,我们要的是定位到地图的中心,所以,我们就必须拿到当前地图的尺寸。

      4.获取当前地图的尺寸(当前小程序窗口尺寸)

      当前地图的尺寸跟小程序的窗口尺寸是紧密关联的,这个自不必多说。那我们就来看看如何获取当前小程序窗口宽度和高度。

      获取窗口的宽度,微信小程序的api已经封装好了,我们直接调用就可以。这里有个问题就是在哪里调用获取窗口大小。

      由于我们可能在多处调用该数据,所以我们选择,在app刚一加载的时候就获取该数据,然后把它存放到globalData中,这样在整个小程序中就都可以访问了。

      打开app.js文件

    App({
      globalData:{
    
      },
      onLaunch: function () {
        try{
          const res = wx.getSystemInfoSync();
          this.globalData.windowWidth = res.windowWidth;
          this.globalData.windowHeight = res.windowHeight;
          // console.log(this.globalData);
        }catch(e){
    
        }
      }
    })

      接下来,我们回到页面的.js文件,先获取小app的实例  

    const app = getApp();

      然后修改刚才controls里添加的那个对象的left值和top值  

    data: {
        longitude: '', //经度
        latitude: '',   //维度 
        controls: [{
          id: 1,
          iconPath: '/resources/pin.png',
          position: {
            left: app.globalData.windowWidth / 2 - 15,
            top: (app.globalData.windowHeight - 40) /2 - 40,
             30,
            height: 40,
          }
        }]
      },  

      搞定!

      二、添加地图左下角的center图标

      如果用户滑动地图,那么地图的中心点就不是当前位置了,如果滑动的距离远,再手动回到当前位置是非常麻烦的。  

      接下来我们添加一个功能,在地图的左下角添加一个‘center’图标,点击这个图标,地图中心点就回到当前位置。

       如前边的图所示,左下角那个黑色的圆圈,就是center.png图标。

      思路其实很简单,有了做地图中心图标的经验,这个无非也就是再弄格图片,定位到左下角位置,然后给他设置点击事件就完事了。接下来说下实现的步骤。

      1.把center.png图片导入到项目的resources目录下。

      2.把此图标加入到map组件的controls属性的集合中,先来修改页面的.js文件代码,代码如下:  

      data: {
        longitude: '', //经度
        latitude: '',   //维度 
        controls: [{
          id: 1,
          iconPath: '/resources/pin.png',
          position: {
            left: app.globalData.windowWidth / 2 - 15,
            top: (app.globalData.windowHeight - 40) /2 - 40,
             30,
            height: 40,
          }
        },
        {
          id: 2,
          iconPath: '/resources/center.png',
          position: {
            left: 20,
            top: app.globalData.windowHeight - 100,
             40,
            height: 40,
          },
          clickable: true
        }]
      },  

      这里的代码跟之前的pin.png没什么大的区别,唯一区别就是它是可以点击的,所以需要设置clickable : true

      3.在页面的.wxml中设置此图标的点击事件。代码如下:

      <map longitude="{{longitude}}" latitude="{{latitude}}" id="map" class="map" show-location="true" scale="17"
       controls="{{controls}}" bindcontroltap="centerTap"></map>

      关键点就是属性 bindcontroltap,给它的值是点击的响应函数名,当然你可以根据自己的需要命名,这里声明的函数名是centerTap。

      4.再回到页面的.js文件中。由于我们希望的效果是点击这个center图标,能让地图中心点回到当前位置,所以这时候要调用微信提供的api。这个api又需要先获取到地图的上下文对象,所以我们需要找一个合适的时机来获取地图上下文对象(mapContext)。这个时机就是页面的生命周期函数onReady。代码如下:

    onReady(){
        this.mapCtx = wx.createMapContext('map')
      }

      接下来,我们只需要在centerTap这个点击响应函数中,通过mapCtx这个地图上下文对象,来调用api,让地图中心点回到当前位置就可以了。

      centerTap(e){
        // console.log(e);
        if(e.controlId == 2){ //点击的是center.png图标
          this.mapCtx.moveToLocation();
        }
      },  

       这里要说明的一点是,这个方法有个参数e,它其实就相当于js里的事件对象,封装了一些有关事件的重要参数。比如通过e.controlId就能拿到被点击的control对象的id。这一点很有用,当你地图上有多个control图标的时候,通过这个可以来区分用户点击的是哪一个。

      至此搞定。

  • 相关阅读:
    Confluence 6 快捷键
    Confluence 6 快捷键
    【转】Linux常用命令
    【转】Linux常用命令
    【转】Linux常用命令
    互联网分布式微服务云平台规划分析--服务监控中心
    .NET Framework基础知识(五)(转载)
    Windows 下安装mysql
    kvm
    s5-6 Linux 标准输出 系统优化 目录结构
  • 原文地址:https://www.cnblogs.com/ldq678/p/13269938.html
Copyright © 2020-2023  润新知