成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

登堂—HarmonyOS Practice《鴻蒙應用開發實戰-張榮超》|自學筆記

開發 OpenHarmony
Lite wearable和wearable所適用的API不一樣!開始之前請在config.json-deviceTypel里確定自己所在的項目是Lite wearable。

[[411062]]

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

一、書中致謝&前言

2021年6月29日23:10:32

  1. 51CTO鴻蒙技術社區很有用
  2. 本書使用DevEoc中的平臺為Lite Wearable,即輕量級的可穿戴產品的開發
  3. 本書介紹的是一個呼吸訓練系統APP的開發全過程,
  4. 采用 項目導向的方式 和 任務導向的方式 ,共計36個任務每個任務分為3個部分,包括運行效果、實現思路、代碼詳解。
  5. 本書三章,第一章為“鴻蒙操作系統簡介”;第二章為“項目準備工作”;第三章為“呼吸訓練實戰項目”
  6. 代碼下載網址

這代碼使用的DevEco版本太老了!!!

二、學習完本書后自己總結的提示和建議

  1. Lite wearable和wearable所適用的API不一樣!開始之前請在config.json-deviceTypel里確定自己所在的項目是Lite wearable。
  2. 同理!canvas畫布組件同樣在Lite wearable不支持!使用chart就行
  3. 同理!關于滑動事件。direction的值比之老版本有改變,各位讀者請注意,up和down不可用,應用top和bottom來表示上下。
  4. 在預期效果達不到的時候,多用console.log(“XXXX”);打印信息,來查看函數是否如期調用。
  5. 動態數據綁定在本APP中使用極多,不管是出于顯示和數據的分離作用,還是通過動態數據簡化代碼。都極其好用。在JS-dada中規定字典(值、數組)的格式請注意。
  6. 主頁面是布局和圖片旋轉、倒計時頁面是頁面跳轉、壓力占比頁面是進度器應用、心率頁面是線形圖的應用、活動頁面是柱狀圖的應用、壓力分布頁面是2d繪制引擎的應用(但canvas不能用在Lite wearable,用的還是chart)、最大攝氧量頁面是弧形進度的應用、學習交流頁面就是貼圖。
  7. 用params指定要傳遞的數據。
  8. 容器與組件的應用還需要更多的案例去熟悉,最終期望到達熟稔于心的地步。包含組件與組件、組價與容器。
  9. 隨機數組,隨機數的生成,應成為定式記住。
  10. 圖片的選擇image、src。
  11. 書中和資料上的代碼都沒有格式化,我覺得這樣不好,ctrl+alt+L就代碼格式化了,方便查看、方便閱讀、方便修改。
  12. 頁面與頁面的跳轉(router-uri)-URI最準確的是在config.json-Page里面看,書中的跟實際的不太一樣
  13. 通過style屬性中的animation-duration樣式指定logo圖片轉動一次的時間,通過style屬性中的animation-ireration-count樣式指定logo圖片轉動
  14. 參數、形參、實參、this、自定義函數、函數調用、函數定義、逗號、冒號、循環語句、選擇語句、求最大、求最小、屬性值

三、第一章 鴻蒙操作系統簡介

  • 時間:2021年6月29日23:28:46
  • 1.1 1+8+N全場景
  • 其實也就是,構建一個基于鴻蒙生態下的IoT
  • 1.2 分布式(理解:多個人干多個活兒)
  • 分布式軟總線與傳統意義上的硬總線的區別,分布式軟總線承擔了任務總線、數據總線、總線中樞。任務總線:負責將應用程序在多個終端上快速分發;數據總線:負責數據在設備間的高性能分發和同步;總線中樞:負責將應用程序控制,用于自動發現并組網,以及維護設備間的拓撲關系。
  • 鴻蒙操作系統的分布式軟總線可以實現異構融合網絡
  • 分布式數據管理也是鴻蒙操作系統的核心技術

四、第二章 項目準備工作

  • 時間:2021年7月3日23:16:46

2.1 搭建開發環境(已通過之前的學習已經成功搭建)

  • 2.11安裝Node.js
  • 2.1.2安裝DevEco Studio

2.2Hello World

  • 注意一個previewer就行
  • 每個頁面都包含一個hml文件(結構)、一個css文件(樣式)、一個js文件(行為)
  • 具體的來講就是,hml文件是頁面的結構,用于描述頁面中包含哪些組件;css文件是頁面的樣式,用于描述頁面中的組件都長什么樣子;js文件是頁面的行為,用于描述頁面中的組件是如何進行交互的
  • index.js 中定義了一個變量title,它的值是‘World’,是個占位符,在程序的運行過程中動態確定的,這種技術稱之為動態數據綁定

五、第三章 呼吸訓練實戰項目

  • 時間:2021年7月5日15:50:28
  • 綜述:對于整個APP的一個介紹

3.1任務1:在主頁面中添加一個按鈕并響應其單擊事件

  • 時間:2006年7月6日14:17:12
  • 調試了一下午發現由于書籍用的DevEco版本太低了,導致有很多不一樣,以至于運行不了。
  • 要實現的效果:構建點我的頁面
  • 時間:2021年7月7日14:12:47
  • 經過更新DevEco Studio 2.2.0.200 x64
  1. border-bottom-width 
  2. width 

上述兩者不一樣,經過調試已經可以得出界面

時間:2021年7月7日20:46:39

對位置進行調整

單擊該按鈕后打印一條log

在編程過程中,

  1. //index.js 
  2. //定義clickAction函數 
  3. onInit() { 
  4.         this.title = this.$t('strings.world'); 
  5.     }, 
  6.     clickAction(){ 
  7.          console.log("我被單擊了"); 

要用,隔開,分號的英文還是中文很重要

  1. //index.hml 
  2. //按鈕的onclick單擊事件 
  3. <input type="button"  value="點我" class="btn" onclick="clickAction"  /> 

編譯器右上角有個小蟲子,是Debug按鈕(Shift+9),要想看到打印就需要Debug

非模式的浮動窗口

因為教材使用的是Litewearable而現在2.2版本的DevEco都是Wearable了。所以不能用previewer了,就只能用遠程虛擬機Device Manager

成功運行

3.2任務2:添加訓練頁面并實現其與主頁面之間的相互跳轉

時間:2021年7月7日21:17:59

分析:行為相似,稍作改變,可以調用router.replace()語句實現頁面間的跳轉,在調用該語句的時候通過Uri指定目標頁面的地址

創建JS頁面

進行跳轉

時間:2021年7月7日22:30:45

經過不斷試錯,加上console.log的提示發現,訓練頁面可以跳轉主頁面,但主頁面無法跳轉訓練頁面。

經過半個多小時的調試(誤入歧途,妄想通過更改config.json中的deviceType來實現wearable到litewearable的轉化),之前一直想的是因為previewer自身的問題,認為無法跳轉是因為項目本身是wearable的,而不是Litewearable的導致了認知偏差,完全沒有想到是uri出了問題。

最后完成的效果如下GIF

3.3任務3:驗證應用和每個頁面的生命周期事件

該任務的目的就是通過打印生命周期各個階段的名稱,來感受每個頁面的生命周期

時間:2021年7月7日22:43:05

生命周期(onInit-onReady-onShow-onDestroy)

  1. onInit() { 
  2.     console.log("主頁面的onInit()正在被調用"); 
  3.  
  4.     router.replace({ 
  5.         uri:'pages/index/index' 
  6.     }); 
  7. }, 
  8. onReady() { 
  9.     console.log("主頁面的onReady()正在被調用"); 
  10. }, 
  11. onShow() { 
  12.     console.log("主頁面的onShow()正在被調用"); 
  13. }, 
  14. onDestroy() { 
  15.     console.log("主頁面的onDestroy()正在被調用"

其具體實現

3.4 任務4:在主頁面中顯示logo和兩個選擇器

時間:2021年7月7日23:09:03

思路:使用Image組件顯示鴻蒙呼吸訓練的logo。使用picker-view組件顯示logo左右兩邊的選擇器。

關于copy圖片的hm.png的問題卡了一陣子

之后是關于圖片與按鈕的自適應問題調試了一陣子

時間:2021年7月7日23:47:20

時間:2021年7月8日14:18:57

卡了太久太久了。從上午到下午,不過有經驗了,以后有問題從開發文檔進行查詢答案。

下午下課問了四個實訓老師,還是存在問題

時間:2021年7月8日23:29:21

在51CTO學院張榮超老師的企業微信群里問了問題,希望可以得到解答

時間:2021年7月8日23:44:47

張榮超老師回復!發了源碼,我進行研究研究。

終于解決了!!!!

時間:2021年7月9日00:59:21

存在兩個問題:

1.app.js中引號的問題

Litewearable的JS API與wearable的API不兼容。,所以我把config.json改了

最后修改后的頁面

3.5 任務5:在指定選擇器的默認選中項并獲取選中項的值

時間:2021年7月9日09:09:54

range的類型:Array

使用時需要使用數據綁定的方式,如range = {{data}},js中聲明相應變量:data:[“15”, “20”, “25”]。

selected的相關說明:

selected:設置文本選擇器的默認選擇值,該值需要為range的索引。

設置時間選擇器的默認取值,格式為 HH:mm;

change的說明:

在使用的時候要用onchange

文本選擇器選定值后觸發該事件。參數:{ newValue: newValue, newSelected: newSelected }

時間選擇器選定值后觸發該事件。參數:{ hour: hour, minute: minute}

  1. changeAction1(pv) { 
  2.     console.log("左邊的選中項:" + pv.newValue); 
  3. }, 
  4. changeAction2(pv) { 
  5.     console.log("右邊的選中項:" + pv.newValue); 
  6. }, 

3.6 任務6:將主頁中選擇器的值傳遞到訓練頁面

時間:2021年7月9日14:35:07

頁面跳轉的時候:用uri指定目標頁面,用params指定要傳遞的數據。

在生命周期事件函數onInit()中獲取主頁面傳遞過來黨的值,并將其打印到log中,因為選擇器的值存放在了一個字典中,并且對應的key分別是data1和data2,所以訓練頁面中可以通過this.data1獲取傳遞過來的左邊選擇器的值,右邊同理。

  1. console.log("接收到的左邊選擇器的值:" + this.data1); 
  2. console.log("接收到的右邊選擇器的值:" + this.data2); 

3.7 任務7:修改主頁面和訓練頁面中按鈕的文本及樣式

時間:2021年7月9日14:52:17

對font-size樣式修改按鈕的文本大小

通過background-color樣式修改按鈕的背景顏色

通過border-color樣式修改按鈕的邊框顏色

按鈕顏色還挺好看的

training頁面的按鈕同理

3.8 任務8:在訓練頁面顯示總共需要堅持的秒數

時間:2021年7月9日15:03:43

因為training頁面需要顯示主頁面選擇器選擇的值作為參數,所以這里需要采用動態綁定的方式。

  1. picker1value = this.key1; 
  2. picker2value = this.key2; 
  3.  
  4. if (picker1value == "1") { 
  5.     picker1seconds = 60; 
  6. else if (picker1value == "2") { 
  7.     picker1seconds = 120; 
  8. else if (picker1value == "3") { 
  9.     picker1seconds = 180; 
  10.  
  11. if (picker2value == "較慢") { 
  12.     picker2seconds = 6; 
  13. else if (picker2value == "舒緩") { 
  14.     picker2seconds = 4; 
  15. else if (picker2value == "較快") { 
  16.     picker2seconds = 2; 
  17.  
  18. this.seconds = picker1seconds; 

這里比較笨拙可以用

  1. picker1seconds=picker1value*60; 

3.9 任務9:在訓練頁面倒計時顯示再堅持的秒數

時間:2021年7月9日15:23:13

在訓練頁面的生命周期事件函數onShow()中調用==setInterval()==函數創建一個定時器,并在調用時指定定時器要執行的動作及其時間間隔

  1. run1() {    this.seconds--;    if (this.seconds == 0) {        clearInterval(timer1);        timer1 = null;        this.isShow = false;    }}, 

3.10 任務10:再堅持的秒數在倒計時結束時隱藏顯示的文本

時間:2021年7月9日15:33:33

將某個組件的show屬性的值設置為false從而隱藏該組件

注意:隱藏組件之后,它在頁面中所占的空間仍然存在

  1. seconds: 0,//這個,必須要加上isShow:truetimer1 = setInterval(this.run1, 1000); 

3.11 任務11:在訓練頁面根據呼吸節奏交替顯示“吸氣”和“呼氣”

時間:2021年7月9日15:38:36

在training頁面交替顯示,就需要在training頁面的生命周期函數onShow()中調用==setInterval()==創建一個定時器,并在調用時指定定時器要執行的動作及其時間間隔。

因為我們設定了較慢、舒緩、較快,所以這里有一個節奏的轉換,也就是說要用不同的時間間隔區別不同的selected的選擇

需要聲明一個全局變量counter作為計時器,將其初值設置為0

  1. run2() {    counter++;    if (counter == picker1seconds / picker2seconds) {        clearInterval(timer2);        timer2 = null;        this.breath = "已完成";    } else {        if (this.breath == "吸氣") {            this.breath = "呼氣";        } else if (this.breath == "呼氣") {            this.breath = "吸氣";        }    }}, 

3.12 任務12:每次吸氣或呼氣時都實時顯示進度百分比

時間:2021年7月9日16:18:34

還是使用定時器

  1. run3() {    this.percent = (parseInt(this.percent) + 1).toString();    if (parseInt(this.percent) < 10) {        this.percent = "0" + this.percent;    }    if (parseInt(this.percent) == 100) {        this.percent = "0";    }    if (timer2 == null) {        clearInterval(timer3);        timer3 = null;        this.percent = "100";    }}, 

3.13 任務13:每次吸氣或呼氣時logo都順時針轉動一周

時間:2021年7月9日17:13:22

通過style屬性中的animation-duration樣式指定logo圖片轉動一次的時間,通過style屬性中的animation-ireration-count樣式指定logo圖片轉動

logo順時針轉動一周的時間,就是一次呼氣或吸氣的時間picker2secons,但是對于training.hml中的animation-duration樣式,要指定其點位“s”,因此要將picker2seconds+“s”賦值給data中的duration。

logo轉動的次數就是吸氣和呼氣的總次數,即picker1seconds/picker2seconds。

時間:2021年7月10日09:14:02

排查了很久為什么圖片轉不起來

原因居然在這里:

可惡!

終于成功了!

3.14 任務14:添加倒計時頁面并實現由主頁向其跳轉

時間:2021年7月10日09:17:46

就是創建新頁面。新布局,新組件

3.15 任務15:在倒計時頁面進行訓練指引的3秒倒計時

時間:2021年7月10日09:25:24

  1. run() {    counter = counter - 1;    if (counter != 0) {        this.imgsrc = "/common/images/" + counter.toString() + ".png";        this.seconds = counter.toString();    } else {        this.imgsrc = "";        this.seconds = "";        clearInterval(timer);        timer = null;        router.replace({            uri: 'pages/index/training/training',            params: {                "key1": pv1,                "key2": pv2            }        })    }}, 

3.16 任務16:3秒倒計時結束后跳轉到訓練頁面并傳遞主頁面的數據

時間:2021年7月10日09:37:38

單擊主頁面中的按鈕跳轉到倒計時頁面,讀秒結束后,跳轉到訓練頁面并將主頁的數據傳遞給訓練頁面

倒計時頁面中,將主頁面傳遞的值作為value存放在字典中,并且通過params傳遞給訓練頁面。在訓練頁面中通過key,從字典中獲取兩個選擇器的值。

梳理:

  1. //需要的配套格式import router from '@system.router';clickAction() {        router.replace({            uri: '',            params:{"":,"":}        });    },//主頁面 params:{"data1":picker1value,"data2":picker2value}//倒計時頁面params: {              "key1": pv1,           "key2": pv2                }//訓練頁面  picker1value = this.key1;        picker2value = this.key2; 

3.17 任務17:呼吸訓練結束后右滑查看訓練報告

時間:2021年7月10日09:56:58

在多個連續的text組件中使用if-elif-else結果,以便從中選擇一個text組件進行顯示。在頁面的最外層div組件中添加onswipe屬性,從而在頁面觸發滑動事件時自動調用指定的自定義函數

關于if-elif-else的使用說明:因為再堅持這個text在倒計時結束以后會null,但空間并沒有釋放,所以需要在相同的位置進行多文本的選擇,以便讓空間得以充分應用

右滑:在訓練頁面,添加一個自定義函數,定義一個形參,在函數體中通過e.direction的值判斷滑動的方向,如果等就跳轉

關于onswipe屬性:設置值為自定義的toReport1Page函數,這樣右滑的時候觸發頁面的onswipe事件,從而調用自定義的toReport1Page函數。

  1. <div class="container" onswipe="toIndexPage">
  1. toIndexPage(e) {    if (e.direction == 'left') {        router.replace({            uri: 'pages/index/index'        });    }} 

3.18 任務18:將第1個訓練報告頁面的標題修改為壓力占比

時間:2021年7月10日14:09:30

之后使用的數據都是隨機生成的測試數據,其目的使其學會如何對數據進行分析和可視化展示

flex-direction樣式用于指定容器所在組件的排列方向,可選值有兩個:row和colum,分別表示水平方向和豎直方向。選其一為主軸,另外一個為副軸。

justify-content用于指定容器內所有組件在主軸上的對齊方式

align-items用于指定容器內所有組件在副軸上的對齊方式

書本里做了四個容器,關于著三個組件不同值的可視化案例教程,很清晰的把三個方法,十個可選值

3.19 任務19:在壓力占比頁面的標題下方顯示壓力分類的列表

時間:2021年7月10日14:35:38

聯合使用list和list-item組件來展示一個列表中的多個列表項。

在list組件中使用for屬性并通過動態數據綁定的方式指定要迭代的數組。在list-item組件中使用$item并通過動態數據綁定的方式指定迭代過程中的數組元素。

數據和顯示需要分離

每一個列表項數據都可以用{{$item}}來表示

  1. <div class="state-percent">    <text class="state">        {{ $item.state }}    </text>    <text class="state">        {{ $item.percent }}%    </text></div> 

3.20 任務20:在壓力分類的右邊顯示對應的壓力占比

時間:2021年7月10日15:09:52

在onInit()中,隨機生成若干個指定范圍內的整數,將其作為所有壓力狀態的數據。根據隨機生成的整數統計每種壓力狀態所占的百分比,并通過動態數據綁定的方式將其顯示再列表中。

Math.floor(x)用于返回小于等于x的最大整數

push()函數將生成的隨機數添加到stateData數組中

  1. onInit() {    let stateData = [];    for (let i = 0; i < 20; i++) {        stateData.push(this.getRandomInt(1, 99));    }    this.countStatePercent(stateData);}, 

調用countStatePercent()自定義函數,并將stateData作為實參傳遞給形參stateData

在自定義函數體中用四個計數器,通過for循環對stateData數組中的所有壓力狀態數據進行遍歷,并在遍歷過程中判斷每個狀態壓力數據的范圍,使用相應的計數器進行個數的統計

3.21 任務21:在每個列表項的下方顯示壓力占比的進度條

時間:2021年7月10日15:31:43

通過動態綁定的方式指定style屬性的值

在list-item組件中添加一個progerss組件(進度條),percent屬性為進度。

  1. <progress class="progress-bar" percent="{{$item.percent}}" style="color: {{$item.color}};"/> 

3.22 任務22:添加第2個訓練報告頁面并響應滑動事件

時間:2021年7月11日10:36:04

就是創建頁面,并通過onswipe屬性,觸發滑動事件自動調用指定的自定義函數

switch函數+router

  1. //最開始調試的代碼!有錯!關于direction的    toNextPage(e){        switch(e.direction){            case'left':            router.replace({                uri:'pages/index/index'            });            break;            case'down':            router.replace({                uri:'pages/index/report1/report1'            });        }    }} 

 Tips:直接點previewer可能會達不到效果,需要Debug(小甲蟲)

大無語事件!大無語事件!

經過不斷的控制變量調試,發現只有左右滑動才可以正常。上下滑動無動于衷,添加了生命周期,觀察發現!上下滑動時,生命周期沒有調用!!!!!!我就懷疑代碼錯了,然后仔細比對,發現沒有問!沒有問題!沒有問題!那問題出現在哪兒了呢,排除跳轉頁面uri地址問題,排除了因為冒號引號的問題,排除了函數名變量名參數名不對應的問題,排除了其他頁面有干擾的問題,然后我就懷疑標簽direction的使用方法是不是錯了。經過查驗發現網上都是JS的direction標簽、微信小程序的direction標簽,CSS中direction的屬性。對照Breathing源碼發現,是因為新版的DevEco中上下左右的屬性值變化了。新版的上下左右

上-top(老版本-up)

下-bottom(老版本-down)

左-left

右-right

最后說一句!!!好氣好氣好氣!

時間:2021年7月11日12:24:15

  1. //調整以后的代碼toNextPage(e) {    switch (e.direction) {        case 'left':        router.replace({            uri: 'pages/index/index'        });        break;        case 'bottom':        router.replace({            uri: 'pages/index/report1/report1'        });    } 

 才學到的用ScreenToGif做GIF巨方便!

3.23 任務23:在第2個訓練報告頁面中顯示除心率曲線之外的所有內容

時間:2021年7月11日20:17:45

設置有文本組件,心率通過動態數據綁定的方式將其顯示在頁面中,每個列表項都由一張圖片和一個文本組成

  1. //設置的兩個圖片,用動態綁定加數組簡單的抒寫其地址<image class="icon" src="/common/images/{{ $item.iconName }}.png"/><text class="maxmin"

 在data中將maxmin占位符初始化為一個字典數組,該數組包含兩個字典,分表表示心率最大值和心率最小值的相關信息

  1. data: {    maxmin: [{                 iconName: 'max',                 mValue: 0             },             {                 iconName: 'min',                 mValue: 0             }],    average: 0}, 

 把壓力頁面的getRandomInt的函數復制過來,該函數用于隨機生成一個介于min和max之間的整數,經過for循環執行的100次迭代,在每一次迭代中自定義函數隨機生成的數經過push()的添加,最后達到hearRates數組的隨機定義。

  1. getRandomInt(minmax) {    return Math.floor(Math.random() * (max - min + 1)) + min;}, onInit() {        let heartRates = [];        for (let i = 0; i < 100; i++) {            heartRates.push(this.getRandomInt(73, 159));        }        this.countMaxMinAverage(heartRates);        console.log("心率頁面的onInit()正在被調用");    },        countMaxMinAverage(heartRates) {        this.maxmin[0].mValue = Math.max.apply(null, heartRates);        this.maxmin[1].mValue = Math.min.apply(null, heartRates);        let sum = 0;        for (let index = 0; index < heartRates.length; index++) {            sum += heartRates[index];        }        this.average = Math.round(sum / heartRates.length);    } 

 耽誤一陣子時間,因為生成隨機素組的時候,返回參數那里,自定義函數名字用的壓力頁面的自定義函數導致沒有,隨機數組沒有正常生成

最后成功

3.24 任務24:在心率曲線頁面中顯示繪制的心率曲線

時間:2021年7月11日21:36:20

使用chart組件繪制心率曲線圖,通過動態數據綁定的方式

制作圖表需要在x、y軸上面設置參數。data中將options占位符的值初始化為一個字典,字典包含兩個元素,分別用于設置x軸和y軸的參數。data中將datasets初始化為一個字典,gradient用于表示折線向下填充顏色到x軸,第二個元素是data,用于指定心率圖中的數據。

特別的!對于chart線條和填充的顏色我不是很滿意,我就查了開發文檔,對于chart的屬性進行了查詢,

  1. options: {            xAxis: {},            yAxis: {                min: 0,                max: 160            }        },        datasets: [{                       strokeColor: '#1883d5',                       fillColor: '#1ed1fc',                       gradient: true,                       data: []                   }] 

 最后完成了心率頁面

3.25 任務25:添加第3個訓練報告頁面并響應事件

時間:2021年7月11日22:15:32

就是左滑右滑的的功能實現

貫穿壓力頁面、心率頁面、活動頁面

3.26 任務26:在第3個訓練報告頁面中顯示除活動分布圖之外的所有內容

時間:2021年7月11日22:39:20

四個組件包含文本、圖片的構造

定義一個名為getRandomZeraOrOne的函數,該函數用于隨機生成一個整數0或1,在函數體中,Math.random()用于生成一個介于0和1之間的隨機數。Math.floor(x)用于返回小于等于x的最大整數。

定義一個名為countActivityPercent的函數,其形參為activity,該函數用于技術activity中整數0和1所占百分比

3.27 任務27:在今日活動分布頁面中顯示繪制的今日活動分布圖

時間:2021年7月11日23:16:57

與心率頁面不一樣的是今日活動分布頁面的chart組件的type屬性選擇的是bar,代表是柱狀圖。通過stuck組件來堆疊其中的組件,從而分別繪制活動柱狀圖和靜止柱狀圖。

stack:堆疊容器,子組件按照順序依次入棧,后一個子組件覆蓋前一個子組件。

3.28 任務28:添加第4個訓練報告頁面并響應滑動事件

時間:2021年7月12日09:42:41

添加頁面并添加相應滑動,不多贅述

3.29 任務29:在第4個訓練報告頁面顯示除壓力分布圖之外的所有內容

時間:2021年7月12日09:52:37

壓力分布頁面跟心率頁面構造及其相似。四個大組件,不贅述

出現問題了!在老版本的canvas組件不能再新版本使用

canvas畫布:支持手機、平板、智慧屏、智能穿戴

但不支持輕量級智能穿戴!!!Lite wearable不配

完成了!

 

3.30 任務30:在壓力分布頁面中繪制壓力分布圖

時間:2021年7月12日10:42:00

書中對于canvas畫布組件的應用,不用用了現在,不過大致說一下書中的思路,通弄過canvas組件中的ref屬性獲得其對應的對象實例,并調用getContext(‘2d’)函數獲得2D繪制引擎,在遍歷所有壓力數據的過程中調用fillRect()函數對壓力分布圖中的柱子逐一進行繪制

  1. //書中的<canvas class="canvas" ref="canvas"></canvas> 
  1. //現在的<chart class="chart" type="bar" options="{{ options }}" datasets="{{ datasets }}"></chart> 

這里需要說明一下,chart的type屬性兩種,bar表示的是柱狀圖,line表示的線形圖。

相應的在生命周期onShow中,通過引用this.$refs.canvas獲得report4組件的對象實例,然后調用getContext(‘2d‘)函數獲得2D繪圖引擎。然后通過forEach()函數進行對pressure數組中的隨機壓力值進行遍歷,其中element表示在遍歷過程中數組的當前元素。

  1. //書上不能用的onShow(){var context =this.$refs.canvas.getContext('2d');    let leftTopX=0;    presuress.forEach(element =>{        context.fillStyle=this.getColorHexByValue(element);        let leftTopY=180-element *1.8;        let width=7;        let height=element*1.8;       context.fillRect(leftTopX,leftTopY,height,width);        leftTopY +=8;    });} 
  1. //獲取柱子的顏色的代碼getColorHexByValue(value) {    if (value >= 80 && value <= 99) {        return "#ffa500";    } else if (value >= 60 && value <= 79) {        return "#ffff00";    } else if (value >= 30 && value <= 59) {        return "#00ffff";    } else if (value >= 1 && value <= 29) {        return "#0000ff";    }}, 
  1. //用了chart那么這包含48個數組的pressure,就要定義48個字典定義柱子,for (let i = 0; i < 48; i++) {    let value = pressures[i];    this.datasets[i].fillColor = this.getColorHexByValue(value);    this.datasets[i].data = [value];} 

用不了畫布就很麻煩!就需要在data那里就定義48組數據,每組為半個小時。

不過完成了!

3.31 任務31:添加第5個訓練報告頁面并響應滑動事件

時間:2021年7月12日11:05:18

跟之前的頁面報告頁面同樣的,不贅述

3.32 任務32:在第5個訓練報告頁面中顯示除弧形和星號之外的內容

時間:2021年7月12日11:12:12

最大攝氧量頁面,需要顯示頁面標題、最大攝氧量及其單位、攝氧量等級水平、完全跟前幾個頁面的構建大同小異

不過其中不一樣的地方在于,正中間的兩位數字,由兩個圖片構成,但其中有一個關系需要體現,如果小于十,第一張圖if(false)(不能用show,使用show的話就是占位符,還在那個位置,我們希望他不在),唯獨使用第二張圖片顯示最大攝氧量。

  1. //對應圖片的hml<div class="number-container">    <image if="{{isShow}}" class="number-icon" src="/common/{{first}}.png"/>    <image class="number-icon" src="/common/{{second}}.png"/></div> 
  1. //對應圖片的jsonInit() {    let vo2max = this.getRandomInt(1, 70);    let vo2max_str = vo2max.toString();    if (vo2max_str.length == 2) {        this.first = "num-" + vo2max_str[0];        this.second = "num-" + vo2max_str[1];    } else {        this.second = "num-" + vo2max_str;        this.isShow = false;    }    this.level = this.getLevelByValue(vo2max);}, 

 完成!

3.33 任務33:在最大攝氧量頁面顯示繪制的弧形

時間:2021年7月12日11:40:13

通過progress組件的type屬性設置為“arc”來繪制弧形,通過stack組件來堆疊其中的子組件

progress組件percent屬性設置為百分之50,添加style屬性用來設置進入條樣式。start-angle設置為220(起始角度)。

  1. <progress class="progress" type="arc" percent="50" style="color : #ff0000; start-angle : 220;"

弧度百分之50的效果圖

接下來是七彩陽光環節,哈哈哈,就是七個顏色弧形

 3.34 任務34:在最大攝氧量界面的對應弧形和角度上面顯示星號

時間:2021年7月12日12:06:26

嗨,還是使用的canvas,其思路就是X-Y軸的繪制,然后添加“*”的文本

不過呢現在就用的是

  1. //現在就比較直接添加組件,然后在js里直接設置對應位置<div class="pointer">    <text class="pointer-txt" style="margin-top: {{y}};margin-left: {{x}};">        *    </text></div> 
  1. //css.pointer{    width: 454px;    height: 454px;    background-color: transparent;}.pointer-txt{    font-size: 38px;    color: yellow;} 
  1. //在js的onInit的里面直接動態綁定x、y的值let angle = -230 + vo2max * (280 / 70);this.x = Math.round(218 + 193 * Math.cos(angle * Math.PI / 180));this.y = Math.round(218 + 193 * Math.sin(angle * Math.PI / 180)); 

完成!

3.35 任務35:添加學習交流聯系方式頁面并響應滑動事件

時間:2021年7月12日12:15:04

新建一個contact頁面,添加相應的文本和router.replace的滑動跳轉,不贅述,要完結了!要學完了!沖沖沖!

3.36 任務36:在學習交流聯系方式頁面中顯示二維碼并完成項目收尾

時間:2021年7月12日12:22:15

使用image組件顯示二維碼,就是一個收尾工作嘍!沖沖沖!

完結撒花的時候因為圖片的比例問題,又在華為開發文檔里面去學習了一下image組件哈哈哈。

最后選的是自己以前劍網三丐幫的一張圖片!

潛龍勿用!自強不息!

后面收尾有一個簡單的提示語的添加(text組件)

書上的完結!

六、對項目的一些調整和感想

(一)點擊重新開始的按鈕太大了,下面的框框都兜不住了

時間:2021年7月12日12:59:50

對訓練頁面的btn按鈕的進行調整(css)

  1. .btn {    width: 280px;    height: 50px;    font-size: 38px;    background-color: aquamarine;    border-color: aquamarine;    margin-top: 15px;} 

(三)一點感想

時間:2021年7月12日13:08:29

首先我很感謝《鴻蒙應用開發實戰》這一本書!當然最應該感謝的是張榮超老師,他寫此書是開拓性的行為,雖然現在DevEco的版本迭代很快,書里的部分內容需要調整,但試錯與改BUG本來就是一名程序猿需要去干的,原封不動的照抄代碼,反而效果可能沒有那么美麗!還有就是在學習的過程中我還加入了張榮超老師的粉絲企業微信,然后在里面得到了老師耐心的講解!!!真的太佩服他了!更甚,張榮超老師在51CTO社區發的學習鴻蒙的文章也很有代表性!最近發的【張榮超老師】鴻蒙卡片開發超細致總結 ,也特別特別的詳細!ps:接近凌晨十二點張老師也回復了!!!!

總結一下這本書和這段時間的學習:沒有案例沒有項目的學習,是支撐不起實際開發的,選擇這本書就是為了可以快速的上手,在簡單項目中學習DevEco的相關設置、一些快捷鍵的使用;DevEco中JavaScript的Lite wearable的開發,熟悉輕量級智能手表的API,

在這里就這個項目還有可能完善的地方就是,使用全部的輕量級手表專屬API中,

《鴻蒙應用開發實戰》使用的組件:

容器組件:div(基礎容器)、list(圖片文本的列表項容器)、list-item(< list >的子組件,用來展示具體的item)、stack(疊堆容器)、swiper(滑動容器)

基礎組價:chart(線性圖、柱狀圖)、image(圖片)、image-annimator(圖片幀動畫播放器)、input(交互組件)、picker-view(嵌入頁面的滑動選擇器)、progress(進度條,用于顯示內容加載或操作處理進度)、text(文本,用于呈現一段信息)

《鴻蒙應用開發實戰》未使用的組件:

marquee:跑馬燈組件,用于展示一段單行滾動的文字

qecode:生成并顯示二維碼。

silder:滑動條組件,用來快速調節設置值,如音量、亮度等

switch:開關選擇器,通過開關,開啟或關閉某個功能》

還有一些具體的注意事項我把他放到了第二點,尤其是DevEco新老版本不一樣的地方需要諸君多多注意!

完結撒花 諸君共勉!學習繼續 強國有我!

附上自己敲的代碼

注:該文都是自己學習過程的筆記,侵刪。

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

 

責任編輯:jianghua 來源: 鴻蒙社區
相關推薦

2021-06-30 09:27:58

鴻蒙HarmonyOS應用

2021-03-08 15:00:14

鴻蒙HarmonyOS應用

2021-03-03 15:47:51

HarmonyOS應用開發物聯網

2021-01-11 11:04:49

鴻蒙HarmonyOS應用開發

2020-11-09 11:56:49

HarmonyOS

2022-08-09 16:01:24

應用開發鴻蒙

2022-08-15 22:09:37

設備開發開發筆記

2021-02-07 12:08:39

鴻蒙HarmonyOS應用開發

2021-09-23 14:41:58

鴻蒙HarmonyOS應用

2020-09-28 15:13:04

鴻蒙

2022-08-15 22:20:46

應用開發華為IoT平臺

2021-01-19 12:33:32

鴻蒙HarmonyOS應用開發

2021-01-19 10:09:02

鴻蒙HarmonyOS應用

2021-06-24 09:32:00

鴻蒙HarmonyOS應用

2018-09-07 23:38:45

小程序開發框架

2020-12-04 09:52:22

鴻蒙OS

2011-08-09 17:29:29

iPhone文件屏幕

2020-11-05 10:05:25

App

2020-10-29 09:49:32

HarmonyOS鴻蒙安卓應用
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产高清一区二区三区 | 国产精品久久国产愉拍 | 国产精品永久免费视频 | 国产自产c区| 看片地址 | 久草在线| 一区二区三区视频在线观看 | 精品久久1| 久久久久国产 | 国产一二三视频在线观看 | 亚洲国产精品va在线看黑人 | 欧美日韩电影一区 | 偷拍自拍网 | 国产成人免费视频网站高清观看视频 | 天天射网站 | 久久精品国产99国产 | 日韩免费一级 | 欧美日韩一区二区在线 | 国产精品高潮呻吟久久久久 | 欧美一级在线 | 久久中文视频 | 91精品国产91久久久久久最新 | 99久久影院 | 免费99视频 | 精品一区二区av | 羞羞视频网站免费看 | 一区二区三区国产好 | 91se在线| 91麻豆精品国产91久久久久久 | 久久久久久久久久久久亚洲 | 国产一区二区免费 | 亚洲在线一区二区 | 欧美亚洲激情 | 一级免费看片 | 国产视频二区 | 精品综合 | 国产精品综合色区在线观看 | 国产日韩久久 | 国产精品18久久久 | 欧美精品一区在线观看 | 欧美久久久久久 |