zoukankan      html  css  js  c++  java
  • 微信小程序跑步计时器

    firstStep:run.wxml



    <view class="head" style="flex-direction:row;">
    <image class="icon" src="/resources/joyrun.png" mode="aspectFill"/>
    <button class="run-button" bindtap="openLocation">打开位置</button>
    <button class="run-button" bindtap="starRun">开始跑步</button>
    <button class="run-button" bindtap="stopRun">暂停跑步</button>
    <text> 里程数:{{meters}}km</text>
    <text> 时间:{{time}}</text>
    </view>

    <view class="mainView">
    <map
    class="mapView"
    style=" 100%; height: 375px;"
    latitude="{{latitude}}"
    longitude="{{longitude}}"
    markers="{{markers}}"
    covers="{{covers}}"
    >
    </map>

    </view>


    secondStep: run.wxss



    .mapView{
    align-items: center;
    }

    .page {
    ">#fbf9fe;
    height: 100%;
    }
    .container {
    display: flex;
    flex-direction: column;
    min-height: 100%;
    justify-content: space-between;
    }
    .page-header {
    display: flex;
    font-size: 32rpx;
    color: #aaa;
    margin-top: 50rpx;
    flex-direction: column;
    align-items: center;
    }
    .page-header-text {
    padding: 20rpx 40rpx;
    }
    .page-header-line {
    150rpx;
    height: 1px;
    border-bottom: 1px solid #ccc;
    }

    .page-body {
    100%;
    display: flex;
    flex-direction: column;
    align-items: center;
    flex-grow: 1;
    overflow-x: hidden;
    }
    .page-body-wrapper {
    margin-top: 100rpx;
    display: flex;
    flex-direction: column;
    align-items: center;
    100%;
    }
    .page-body-wrapper form {
    100%;
    }
    .page-body-wording {
    text-align: center;
    padding: 200rpx 100rpx;
    }
    .page-body-info {
    display: flex;
    flex-direction: column;
    align-items: center;
    ">#fff;
    margin-bottom: 50rpx;
    100%;
    padding: 50rpx 0 150rpx 0;
    }
    .page-body-title {
    margin-bottom: 100rpx;
    font-size: 32rpx;
    }
    .page-body-text {
    font-size: 30rpx;
    line-height: 26px;
    color: #ccc;
    }
    .page-body-text-small {
    font-size: 24rpx;
    color: #000;
    margin-bottom: 100rpx;
    }
    .page-body-form {
    100%;
    ">#fff;
    display: flex;
    flex-direction: column;
    100%;
    border: 1px solid #eee;
    }
    .page-body-form-item {
    display: flex;
    align-items: center;
    margin-left: 30rpx;
    border-bottom: 1px solid #eee;
    height: 88rpx;
    font-size: 34rpx;
    }
    .page-body-form-key {
    180rpx;
    color: #000;
    }
    .page-body-form-value {
    flex-grow: 1;
    }
    .page-body-form-value .input-placeholder {
    color: #b2b2b2;
    }

    .page-body-form-picker {
    display: flex;
    justify-content: space-between;
    height: 100rpx;
    align-items: center;
    font-size: 36rpx;
    margin-left: 20rpx;
    padding-right: 20rpx;
    border-bottom: 1px solid #eee;
    }
    .page-body-form-picker-value {
    color: #ccc;
    }

    .page-body-buttons {
    100%;
    }
    .page-body-button {
    margin: 25rpx;
    }
    .page-body-button image {
    150rpx;
    height: 150rpx;
    }
    .page-footer {
    text-align: center;
    color: #1aad19;
    font-size: 24rpx;
    margin: 20rpx 0;
    }

    .green{
    color: #09BB07;
    }
    .red{
    color: #F76260;
    }
    .blue{
    color: #10AEFF;
    }
    .yellow{
    color: #FFBE00;
    }
    .gray{
    color: #C9C9C9;
    }

    .strong{
    font-weight: bold;
    }

    .bc_green{
    ">#09BB07;
    }
    .bc_red{
    ">#F76260;
    }
    .bc_blue{
    ">#10AEFF;
    }
    .bc_yellow{
    ">#FFBE00;
    }
    .bc_gray{
    ">#C9C9C9;
    }

    .tc{
    text-align: center;
    }

    .page input{
    padding: 20rpx 30rpx;
    ">#fff;
    }
    checkbox, radio{
    margin-right: 10rpx;
    }

    .btn-area{
    padding: 0 30px;
    }
    .btn-area button{
    margin-top: 20rpx;
    margin-bottom: 20rpx;
    }

    .page {
    min-height: 100%;
    flex: 1;
    ">#FBF9FE;
    font-size: 32rpx;
    font-family: -apple-system-font,Helvetica Neue,Helvetica,sans-serif;
    overflow: hidden;
    }
    .page__hd{
    padding: 50rpx 50rpx 100rpx 50rpx;
    text-align: center;
    }
    .page__title{
    display: inline-block;
    padding: 20rpx 40rpx;
    font-size: 32rpx;
    color: #AAAAAA;
    border-bottom: 1px solid #CCCCCC;
    }
    .page__desc{
    display: none;
    margin-top: 20rpx;
    font-size: 26rpx;
    color: #BBBBBB;
    }

    .section{
    margin-bottom: 80rpx;
    }
    .section_gap{
    padding: 0 30rpx;
    }
    .section__title{
    margin-bottom: 16rpx;
    padding-left: 30rpx;
    padding-right: 30rpx;
    }
    .section_gap .section__title{
    padding-left: 0;
    padding-right: 0;
    }

    .run-button {
    ">bisque;
    }

    thirdStep: run.json

    {
        "navigationBarTitleText": "跑步计时器"
    }

    fourStep: run.js

    var countTooGetLocation = 0;
    var total_micro_second = 0;
    var starRun = 0;
    var totalSecond  = 0;
    var oriMeters = 0.0;
    /* 毫秒级倒计时 */
    function count_down(that) {
    
        if (starRun == 0) {
          return;
        }
    
        if (countTooGetLocation >= 100) {
          var time = date_format(total_micro_second);
          that.updateTime(time);
        }
    
          if (countTooGetLocation >= 5000) { //1000为1s
            that.getLocation();
            countTooGetLocation = 0;
          }   
        
          setTimeout(function(){
            countTooGetLocation += 10;
        total_micro_second += 10;
            count_down(that);
        }
        ,10
        )
    }
    
    
    // 时间格式化输出,如03:25:19 86。每10ms都会调用一次
    function date_format(micro_second) {
          // 秒数
          var second = Math.floor(micro_second / 1000);
          // 小时位
          var hr = Math.floor(second / 3600);
          // 分钟位
          var min = fill_zero_prefix(Math.floor((second - hr * 3600) / 60));
          // 秒位
        var sec = fill_zero_prefix((second - hr * 3600 - min * 60));// equal to => var sec = second % 60;
    
    
        return hr + ":" + min + ":" + sec + " ";
    }
    
    
    function getDistance(lat1, lng1, lat2, lng2) { 
        var dis = 0;
        var radLat1 = toRadians(lat1);
        var radLat2 = toRadians(lat2);
        var deltaLat = radLat1 - radLat2;
        var deltaLng = toRadians(lng1) - toRadians(lng2);
        var dis = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(deltaLat / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(deltaLng / 2), 2)));
        return dis * 6378137;
    
        function toRadians(d) {  return d * Math.PI / 180;}
    } 
    
    function fill_zero_prefix(num) {
        return num < 10 ? "0" + num : num
    }
    
    //****************************************************************************************
    //****************************************************************************************
    
    Page({
      data: {
        clock: '',
        isLocation:false,
        latitude: 0,
        longitude: 0,
        markers: [],
        covers: [],
        meters: 0.00,
        time: "0:00:00"
      },
    
    //****************************
      onLoad:function(options){
        // 页面初始化 options为页面跳转所带来的参数
        this.getLocation()
        console.log("onLoad")
        count_down(this);
      },
      //****************************
      openLocation:function (){
        wx.getLocation({
          type: 'gcj02', // 默认为 wgs84 返回 gps 坐标,gcj02 返回可用于 wx.openLocation 的坐标
          success: function(res){
              wx.openLocation({
                latitude: res.latitude, // 纬度,范围为-90~90,负数表示南纬
                longitude: res.longitude, // 经度,范围为-180~180,负数表示西经
                scale: 28, // 缩放比例
              })
          },
        })
      },
    
    
    //****************************
      starRun :function () {
        if (starRun == 1) {
          return;
        }
        starRun = 1;
        count_down(this);
        this.getLocation();
      },
    
    
     //****************************
      stopRun:function () {
        starRun = 0;
        count_down(this);
      },
    
    
    //****************************
      updateTime:function (time) {
    
        var data = this.data;
        data.time = time;
        this.data = data;
        this.setData ({
          time : time,
        })
    
      },
    
    
    //****************************
      getLocation:function () {
        var that = this
        wx.getLocation({
    
          type: 'gcj02', // 默认为 wgs84 返回 gps 坐标,gcj02 返回可用于 wx.openLocation 的坐标
          success: function(res){
            console.log("res----------")
            console.log(res)
    
            //make datas 
            var newCover = {
                latitude: res.latitude,
                longitude: res.longitude,
                iconPath: '/resources/redPoint.png',
              };
            var oriCovers = that.data.covers;
            
            console.log("oriMeters----------")
            console.log(oriMeters);
            var len = oriCovers.length;
            var lastCover;
            if (len == 0) {
              oriCovers.push(newCover);
            }
            len = oriCovers.length;
            var lastCover = oriCovers[len-1];
            
            console.log("oriCovers----------")
            console.log(oriCovers,len);
    
            var newMeters = getDistance(lastCover.latitude,lastCover.longitude,res.latitude,res.longitude)/1000;
            
            if (newMeters < 0.0015){
                newMeters = 0.0;
            }
    
            oriMeters = oriMeters + newMeters; 
            console.log("newMeters----------")
            console.log(newMeters);
    
    
            var meters = new Number(oriMeters);
            var showMeters = meters.toFixed(2);
    
            oriCovers.push(newCover);
            
            that.setData({
              latitude: res.latitude,
              longitude: res.longitude,
              markers: [],
              covers: oriCovers,
              meters:showMeters,
            });
          },
        })
      }
      
    })
  • 相关阅读:
    Timer Pattern
    la négation
    expression de la fréquence
    .NET 索引器
    JQuery.Gantt(甘特图) 开发指南
    .NET 预处理器指令
    .NET 数据类型之匿名类型(var)
    .NET base与this
    .NET using关键字
    .NET 基础语句
  • 原文地址:https://www.cnblogs.com/chendezhen/p/10019007.html
Copyright © 2011-2022 走看看