1. 程式人生 > >微信小程式-一個跑步app

微信小程式-一個跑步app

前言

我已經把全部程式碼放在github上-weChatApp-Run,可以下載來看看或者先star收藏,我以後還會進行一些優化更新。現在只是一個學習Demo,大家溝通學習,實際應用還需更多優化。

正文

一、準備工作

  1. 註冊一個小程式賬號,得用一個沒註冊過公眾號的郵箱註冊。
  2. 註冊過程中需要很多認證,有很多認證,比較繁瑣,如果暫時只是開發測試,不進行提審、釋出的話,只要完成營業執照號填寫就可以了,不需要完成微信認證。
  3. 註冊完賬號,登入,在主頁面左邊列表中點選設定,然後再設定頁面中選開發設定就可以看到AppID,用於登入開發工具。

主頁面

設定頁面

二、開發工具

開發工具

開發工具編輯頁面

三、開始專案

開啟開發者工具,選擇小程式選項,到達新增專案頁面
新增專案


這個時候在前面設定頁面的AppId就用到了。

如果專案目錄中的檔案是個空資料夾,會提示是否建立quick start 專案。
選擇“是”,開發者工具會幫助我們在開發目錄裡生成一個簡單的 demo。
這個Demo擁有一個完整的小程式的大概框架。

1、框架

先看下一目錄:
檔案目錄.png

app.js: 小程式邏輯,生命週期,,全域性變數
app.json: 小程式公共設定,導航欄顏色等,不可以註釋
app.wxss :小程式公共樣式,類CSS 。

小程式頁面構成:

頁面構成

每一個小程式頁面是由同路徑下同名的四個不同字尾檔案的組成,如:index.js、index.wxml、index.wxss、index.json。

葛文佳介紹

微信小程式中的每一個頁面的【路徑+頁面名】都需要寫在 app.json 的 pages 中,且 pages 中的第一個頁面是小程式的首頁。

路徑

這四個檔案按照功能可以分成三個部分:

配置:json 檔案
邏輯層:js檔案
檢視層:wxss.wxml檔案

在 iOS 上,小程式的 javascript 程式碼是執行在 JavaScriptCore 中
在 Android 上,小程式的 javascript 程式碼是通過 X5 核心來解析
在 開發工具上, 小程式的 javascript 程式碼是執行在 NW.js(chrome核心) 中。所以開發工具上的效果跟實際效果有所出入。

2、元件

微信提供了許多元件,主要分為八種:

檢視容器、
基礎內容、
表單元件、
操作反饋、
導航、
媒體元件、
地圖、
畫布

包含view、scroll-view、button、form等普通常用的元件,也提供了地圖map、畫布canvas

元件主要屬於檢視層,通過wxml來進行結構佈局,類似於html。通過wxss修改樣式,類似於css。
元件使用語法例項:

<!--普通檢視--><view>這是一個普通檢視</view><!--wxss樣式修改--><view clas="mainView">樣式修改過的檢視</view>

更多的元件以及相關使用方法可以到官方文件-元件檢視

3、API

網路
媒體
資料
位置
裝置
介面
開發介面

其中網路請求的使用必須先到公眾平臺登入小程式賬號,在設定頁面那裡,設定允許訪問的域名,網路請求包含了普通的http請求、支援上傳、下載、socket。基本上滿足了我們開發中所需要的網路需求。

這些API屬於邏輯層,寫在js檔案中,
使用例項:

wx.getLocation({ type: 'wgs84', success: function(res) { var latitude = res.latitude var longitude = res.longitude var speed = res.speed var accuracy = res.accuracy }})

可以到官方文件-API檢視其它API的使用方法。

4、編譯執行

1、模擬器
可以在模擬器上看效果,上面講到了執行底層不同,效果跟在手機上執行有些差異
模擬器.png

2、真機
在左邊的選項欄中,選擇專案,然後點預覽會生產一個二維碼,用管理員微訊號掃一掃就可以在真機上看實際效果
Paste_Image.png

實踐–跑步小程式。

真機執行截圖(運行於iPhone7,微信版本:6.3.30):

home.jpeg

run.jpeg

slideback.jpeg

slide.jpeg

功能:

能夠計算里程、時間、實時獲取跑步路徑(有些粗糙)

思路:

主要使用了微信小程式的獲取位置APIwx.getLocation()和地圖元件map
首先實現一個計時器進行 計時,通過wx.getLocation()獲取座標,把獲取到的座標存在一個數組中,通過座標每隔一段時間獲取里程,進行累加得到總里程,同時也通過座標點進行連線
存在的問題:
1、因為目前找不到在地圖上畫連線的方法,所以採用了在地圖上貼小紅點圖的方法顯示大概跑步路徑,路徑比較粗糙。
2、雖然採用了API裡面的火星座標gcj02型別,但是獲取的座標跟國際座標差不多,依然存在著偏差。

核心程式碼:

我把全部程式碼放在github上-weChatApp-Run,可以下載來看看或者先star收藏,我以後還會進行一些優化更新。現在只是一個學習Demo,大家溝通學習,實際應用還需更多優化。

wxml檔案佈局程式碼:

<view class="head" style="flex-direction:row;"> <image class="icon" src="/resources/joyrun.png" mode="aspectFill"/> <button bindtap="openLocation">開啟位置</button> <button bindtap="starRun">開始跑步</button> <button bindtap="stopRun">暫停跑步</button> <text>\\n里程數:{{meters}}km</text> <text>\\n\\n時間:{{time}}</text></view><view class="mainView"> <map class="mapView" style="width: 100%; height: 375px;" latitude="{{latitude}}" longitude="{{longitude}}" markers="{{markers}}" covers="{{covers}}" > </map></view>

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 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, }); }, }) }})

五、後語

本文是一個快速上手開發的介紹,細節介紹可以檢視官方文件
我的相關全部程式碼放在github上-weChatApp-Run

相關推薦

程式-一個跑步app

前言 我已經把全部程式碼放在github上-weChatApp-Run,可以下載來看看或者先star收藏,我以後還會進行一些優化更新。現在只是一個學習Demo,大家溝通學習,實際應用還需更多優化。 正文 一、準備工作 註冊一個小程式賬號,得用一個沒註冊過公眾號的郵箱

程式(看文件寫例項十一)程式課堂寶APP完結總結及github地址

一、總結 國慶假期偷懶了幾天,從接到任務到分析到實現總共花了20天左右,終於完成了,點名功能由於要實時監聽需要收費,所以沒有給出程式碼,需要完成的可以自己動手實現。用一張導圖來結束: 二、原始碼地址 所有原始碼已經上傳https://github.com/SoleilLuo/Stu

程式(看文件寫例項十)程式課堂寶APP實現我的模組相關介面及邏輯

繼上篇博文,這篇完成最後一個模組,即我的模組。 一、頁面效果 這個模組是和使用者型別相關的,因此老師賬號和學生賬號能看的功能不一樣,老師端效果如下: 點選頭像到達個人資訊如下: 點選後可以做相應的修改。學生端的介面如下: 修改密碼的頁面如下: &nbs

程式(看文件寫例項八)程式課堂寶APP實現練習模組前臺

接上篇博文,這篇主要描述練習模組的前臺顯示,其中包括test頁面,答題detail頁面以及提交答題後答卷answer頁面。 一、練習模組test頁面 練習頁面主要展示的是當前使用者的頭像,暱稱以及學校資訊,另外還有答題資訊,以及每個章節的練習資訊,先來看看效果: grid用的是樣式

程式(看文件寫例項七)程式課堂寶APP實現線上課堂測試

接著上篇博文已經完成簽到功能,這篇來完成課堂測試功能。 一、需求描述 1、在後臺選擇題、主觀題表中上傳測試題 2、客戶端獲取題目資訊 3、把題目資訊格式化載入顯示 4、客戶端答題,主觀題每題能上傳一張答題圖片 5、客戶端答題結束提交到伺服器 二、前臺頁面 提交大量資料

程式(看文件寫例項六)程式課堂寶APP實現簽到邏輯

繼上篇博文,這篇寫下籤到實現的邏輯。 一、實現邏輯 發起簽到 1、先上傳當前自己的定位經緯度 2、學生查詢老師的最後一次簽到記錄,如果發現簽到記錄signComplete為false說明有新的簽到 3、得到簽到的第幾次課 4、系統獲得學生的定位經緯度 5、判斷兩點經緯度轉

程式(看文件寫例項五)程式課堂寶APP實現獲取簽到列表

根據上篇博文,這篇主要實現獲取簽到列表邏輯。 獲得簽到列表主要有以下步驟: (1)查詢老師的ID (2)查詢老師的簽到記錄 (3)如果當前使用者是老師,直接顯示所有記錄,因為簽到記錄都是老師發起的,肯定每次都簽到 (4)如果當前使用者是學生,以老師的簽到列表作為長度,然後以ite

程式(看文件寫例項四)程式課堂寶APP實現簽到子頁面佈局及課程視訊播放頁面

一、簽到子頁面佈局 子頁面主要是一個簽到按鈕,然後下方是簽到記錄列表。 1、簽到按鈕 佈局程式碼: <button class='sign-button' bindtap='sign'>簽到</button>

程式(看文件寫例項三)程式課堂寶APP實現整體介面框架及首頁佈局

一、首頁佈局簡單思路 回顧上一篇博文,首頁的內容主要有輪播圖,橫向滑動選單以及選單對應的view,橫向滑動選單有簽到、課堂測試、模擬測試、課堂提問、答問記錄五個選項,當點選選項時更新顯示view。由於素材和時間有限,所以佈局做得相對簡單,主要是側重思路及程式碼邏輯。 二、輪播圖 檢視文件

程式一個頁面多個按鈕分享怎麼處理

首先呢,第一步先看api文件: 元件:button https://developers.weixin.qq.com/miniprogram/dev/component/button.html 框架-邏輯層-註冊頁面-頁面事件處理函式:onShareAppMessage https://develop

程式與傳統APP大比拼

2016年1月11日,微信之父張小龍公開表態,未來兩年,80%的APP市場將被小程式取代。市場競爭日益劇增,一場移動網際網路的“革命”正在拉開序幕。過去人們買手機都會考慮一個重要問題,那就是記憶體,總會選擇買大記憶體的手機,因為手機裡總會裝著各種不同型別的APP軟體。隨著微信小程式的崛起,APP受到了不小的衝

程式中的app.js-清除快取

微信小程式中的app.js 關於小程式app.js生命週期的介紹 App(Object) App() 函式用來註冊一個小程式。接受一個 Object 引數,其指定小程式的生命週期回撥等。 App() 必須在 app.js 中呼叫,必須呼叫且只能呼叫一次。不然會出現無法預期的後果。 onLa

程式(看文件寫例項二)程式課堂寶APP

全程記錄APP的開發過程,專案完結公上傳Github. 一、需求       由於老闆讓做一個課堂資訊化APP,想想在移動端開發,小程式不分Android和IOS,所以就選擇了微信小程式,軟體的需求不多,但整體內容還是符合一個軟體的標準,我將記錄從需求到模組分析到功能結構

程式-入門篇(app.json)

搞安卓的建議看看微信的小程式,工作之餘能陶冶下自己的情操,啊廢話不多說了上乾貨。 1.整好開發工具配置後映入眼簾的是三個檔案 app.js app.json app.wxss 1.1 我們先看看app.json 它有四個節點 pages,tabBa

程式開發有關app.json總結

剛剛開始小程式開發的時候,遇到最多的就是app.json找不到某個page的錯,可是我明明已經在app.json中寫好了,把開發者工具重啟了N次也沒有效果,但是我男朋友的都沒有報錯,知道過了幾天才發現是我的命名方式有問

程式 VS 原生APP,這一局你站哪邊?

微信小程式 VS 原生APP,這一局你站哪邊? 就在眾樂樂的十一假期,一項名叫“全球首屆「未來小程式」黑客馬拉松”的神奇比賽緊鑼密鼓地展開,據說8支隊伍大拼腦洞又拼體力,在短短24小時內推出到家服務、社交應用、倒計時等各類應用,準確說,是各類微信小程式。 相比之

程式 VS 原生App

1.什麼是小程式 先來看看微信之父張小龍先生的說法:小程式是一種不需要下載安裝即可使用的應用,它實現了應用“觸手可及”的夢想,使用者掃一掃或者搜一下即可開啟應用。也體現了“用完即走”的理念,使用者不用關心是否安裝太多應用的問題。應用將無處不在,隨時可用,但又無需安裝解除安裝

程式--搜尋電影app(續)

熱門推薦頁面各個檔案程式碼如下: recommendMovies.wxml: <view class="wrapper"> <view wx:for="{{topMovies}}" wx:for-item="item"> <vi

程式-從零開始製作一個跑步程式

一、準備工作 1、註冊一個小程式賬號,得用一個沒註冊過公眾號的郵箱註冊。 2、註冊過程中需要很多認證,有很多認證,比較繁瑣,如果暫時只是開發測試,不進行提審、釋出的話,只要完成營業執照號填寫就可以了,不需要完成微信認證。 3、註冊完賬號,登入,在主頁面左邊列表中點選設定,然後再

uni-app一個使用 Vue.js 開發跨平臺應用的前端框架,開發者編寫一套程式碼,可編譯到iOS、Android、程式等多個平臺。

uni-app 是一個使用 Vue.js 開發跨平臺應用的前端框架,開發者編寫一套程式碼,可編譯到iOS、Android、微信小程式等多個平臺。 uni-app在跨端數量、擴充套件能力、效能體