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,
            });
          },
        })
      }
      
    })
  • 相关阅读:
    java操作生成jar包 和写入jar包
    jboss配置jndi连接池
    windows 域的LDAP查询相关举例
    LDAP error Code 及解决方法
    HDU 6417
    CF1299D Around the World
    codechef Chef and The Colored Grid
    Educational Codeforces Round 82 (Rated for Div. 2)
    CF1237F Balanced Domino Placements
    CF1254E Send Tree to Charlie
  • 原文地址:https://www.cnblogs.com/chendezhen/p/10019007.html
Copyright © 2011-2022 走看看