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

用ArkUI實現碰一碰配網、設備控制

系統
今天來嘗試下eTS開發,但是ArkUI只有在API7上才能支持,目前絕大多數手機還都是API6,所以配網部分只能先代碼模擬測試。

[[442569]]

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

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

https://harmonyos.51cto.com

前言

eTS發布有段時間了,用它寫UI不光是代碼易讀性,還是代碼量都是相當優秀。用過以后發現再也不想用java寫UI了。前段時間嘗試調試了碰一碰配網,使用的是碰一碰(個人體驗版)的。正式版的需要企業賬號才可以,使用的是java+js。今天來嘗試下eTS開發,但是ArkUI只有在API7上才能支持,目前絕大多數手機還都是API6,所以配網部分只能先代碼模擬測試,界面效果如下圖:

用ArkUI實現碰一碰配網、設備控制-鴻蒙HarmonyOS技術社區用ArkUI實現碰一碰配網、設備控制-鴻蒙HarmonyOS技術社區

項目分為兩個模塊,碰一碰配網entry模塊,設備控制control模塊。不多說了上代碼。

用ArkUI實現碰一碰配網、設備控制-鴻蒙HarmonyOS技術社區

entry模塊

這個模塊主要是實現設備聯網。界面很簡單。

UI界面

配網界面就是3個組件,一個圖片2個text。

  1. build() { 
  2.   Row(){ 
  3.     Column() { 
  4.       Image($r('app.media.test')) 
  5.         .width(152) 
  6.         .height(152) 
  7.         .margin({ top: 16 }) 
  8.       Text(this.desc
  9.         .fontSize(14) 
  10.         .fontColor('#FF0000000'
  11.         .margin({ top: 16 }) 
  12.       Text(this.progress) 
  13.         .fontSize(14) 
  14.         .fontColor('#999999'
  15.         .margin({ top: 2,right: 24,bottom: 20,left: 24 }) 
  16.     } 
  17.     .height('35%'
  18.     .width('80%'
  19.     .margin('10%'
  20.     .borderRadius(10) 
  21.     .backgroundColor(0xFFFFFF) 
  22.   } 
  23.   .width('100%'
  24.   .height('100%'
  25.   .alignItems(VerticalAlign.Bottom) //這是Row的參數 
  26.   .backgroundColor(0x000000) 

配網流程

整個配網的流程就是手機碰觸NFC貼紙,獲取Product ID,然后通過Product ID去云端獲取用戶意圖。說白了就是告訴手機要打開哪個包名,哪個模塊。關于如何在華為開發者門戶設置用戶意圖可以看我之前的帖子。這里就是啟動了entry模塊。

接下來分析用eTS如何實現這個過程:

1.導入hilink包

在build.gradle中進行配置,底層的實現都是通過調用API,并不需要自己寫。

  1. dependencies { 
  2.     ... ... 
  3.     implementation(group'com.huawei.hilink'name'ailifeability', version: '1.0.0.1', ext: 'har'

2.調用PA能力。

使用JSCallJava調用API接口,這個可以參考OneHop模板,來實現一個default/common/fa-netconfig.ets它的作用就是將JAVA API轉換為eTS函數接口,主要用到的就是FeatureAbility.callAbility(action)。

  1. function callAbilityFunc(callCode, argsObj, callbackFunc) { 
  2.   let action = {                        // 要調用java的信息存放在action 
  3.     bundleName : CONSTANT.BUNDLE_NAME, 
  4.     abilityName : CONSTANT.ABILITY_NAME, 
  5.     messageCode : callCode,             // callCode用來區分要調用哪一個API 
  6.     abilityType : 1, 
  7.     data : argsObj, 
  8.   }; 
  9.   return FeatureAbility.callAbility(action);//調用PA能力 

3.eTS生命周期回調函數

要在entry被拉起時自動執行配網,就要使用.eTS生命周期回調函數。

由于本篇主題是ArkUI,至于配網流程等專門寫一篇帖子再來分析。

  1. aboutToAppear(){ 
  2.   this.discoverDevice() // 執行配網流程 

control模塊

接下來和大家分享下在制作control模塊時,學習到的ArkUI知識點和踩到的一些坑。其中部分內容官方文檔也沒有寫,都是參考示例代碼連蒙帶猜。

1.設置窗口模式

在OneHop官方模板src/main/java/com/liangzili/myonehop/MainAbility.java下給window_modal設置了一個參數。在官方文檔中好像沒有關于這個參數的說明,也或許是我沒有找到。

  1. public void onStart(Intent intent) { 
  2.     intent.setParam("window_modal", 3); 
  3.     ... ... 

測試發現這個參數可以很方便的實現類似彈窗下拉這樣的效果,省去了很多界面代碼。其中("window_modal", 3)就是配網entry頁面的效果,("window_modal", 1)的效果可以看下圖。而且比較有意思的是有1有3,但是傳遞2好像沒啥效果。不過可惜的是,JS范式下傳遞這個參數效果如下圖,但eTS下會有bug,要不就是彈窗無法拖拽,要不就是全屏無法設置大小。

2.app在線設計

在官方指導中有提到HiLink可以使用在線可視化的方式設置界面,效果如下圖。

用ArkUI實現碰一碰配網、設備控制-鴻蒙HarmonyOS技術社區

看著就很方便,在線設計完成之后會得到一個界面文件。類似下圖這樣的效果。界面的數據要統一放到了src/main/resources/rawfile下,根據productName參數進行區選擇,格式為JSON。(PS:本想體驗下這個app在線設計,但是打開沒有內容,我只好使用的模板里帶的FAN_zh.json)

用ArkUI實現碰一碰配網、設備控制-鴻蒙HarmonyOS技術社區

control模塊需要解析json文件的數據來繪制界面。

3.配置文件的解析

配置文件的解析也是java來完成的,所以我直接原文復制的OneHop模板的java代碼,eTS部分,在src/main/ets/default/pages/index.ets下。

  1. async onPageShow(){ 
  2.   utils.setActionParam('com.liangzili.myonehop',  // 為action初始化參數 
  3.     'com.liangzili.myonehop.DataHandlerAbility', ABILITY_TYPE_INTERNAL) 
  4.   await this.requestTemplate() 
  5. .. ... 
  6.  async requestTemplate() { 
  7.   let action = utils.makeAction(ACTION_MESSAGE_CODE_GET_TEMPLATE, {}); 
  8.   let result = await FeatureAbility.callAbility(action); // 同樣的方法去調用PA的能力 
  9.  
  10.   let resultJson = JSON.parse(result);  // 返回的結果保存在 result 中 
  11.   if (resultJson.code == 0) {               // 不等于0就調用失敗了,可以通過失敗碼查找問題 
  12.     let template = JSON.parse(resultJson.data); 
  13.     this.parseJson(template.template); 
  14.   } 
  15. async parseJson(deviceInfo) { ... ... } // 最后就是解析JSON來生成界面了 

4.生成界面

其實如果用eTS范式單純生成一個右側這樣的界面,可能只需要幾十行代碼。但是要解析在線生成的JSON界面文件,再兼容各種樣式的控制界面來繪制UI,這個問題就會變得復雜的多。可能官方的意思是想通過在線設計降低程序的工作量,或者是為了統一UI風格,降低用戶學習成本。

用ArkUI實現碰一碰配網、設備控制-鴻蒙HarmonyOS技術社區

index.ets

主界面分為兩個區域,DeviceInfo() 和 Control(),DeviceInfo就一個主圖和名字。

  1. build() { 
  2.   Stack({ alignContent: Alignment.Bottom }){        // 用來模擬一個上邊圓角的效果 
  3.     Column(){}.height(35).width('100%').backgroundColor(0xF6F6F6) // 用來覆蓋下端邊框圓角 
  4.     Column() { 
  5.       DeviceInfo()  // 設備信息組件 
  6.       Control()     // 控制面板組件 
  7.     } 
  8.     .height('95%'
  9.     .width('100%'
  10.     .borderRadius(25) 
  11.     .backgroundColor(0xF6F6F6) 
  12.   } 
  13.   .width('100%'
  14.   .height('100%'
  15.   .backgroundColor(0x000000) 

Control.ets

界面中通過傳遞參數,來實現用一個組件,顯示不同內容。

  1. build(){ 
  2.     Column(){ 
  3.       Reversal(this.reversalData1)                //開關組件 
  4.       Enum({ enumDatas: this.enumDatas1 })        //枚舉組件 
  5.       Enum({ enumDatas: this.enumDatas2 })        //枚舉組件 
  6.       Reversal(this.reversalData2)                //開關組件 
  7.     } 
  8.   } 

5.參數傳遞

組件間傳值是我遇到問題比較大的地方,我總結了以下幾種情況。這些基本能解決大部分的傳值問題了。

1.單個變量

  1. // 調用端 
  2. Component1({a01:"a01"})     // 調用的時候參數用{}包裹 
  3.  
  4. // 被調用端 
  5. @Component 
  6. export struct Component1{ 
  7.   private a01:string      // 這里定義變量,用來接收 
  8.   build(){ 
  9.     Text(this.a01).fontSize(50) 
  10.   } 

2.對象鍵值對

  1. // 調用端 
  2. struct Index { 
  3.   parameter:{} = {b01: "b01",b02: "b02",} 
  4.   build() { 
  5.     Column(){ 
  6.       Component2(this.parameter)    // 調用的時候參數不用{}包裹 
  7.     } 
  8.   } 
  9.  
  10. // 被調用端 
  11. @Component 
  12. export struct Component2{ 
  13.   private b01:string      // 這里定義變量,用來接收 
  14.   private b02:string 
  15.   build(){ 
  16.     Column(){ 
  17.       Text(this.b01).fontSize(50) 
  18.       Text(this.b02).fontSize(50) 
  19.     } 
  20.   } 

3.對象數組

  1. // 調用端 
  2. struct Index { 
  3.   parameters:any[] = [ 
  4.     { 
  5.       c01:"c01"
  6.       c02:"c02" 
  7.     }, 
  8.     { 
  9.       c01:"c11"
  10.       c02:"c22" 
  11.     } 
  12.   ] 
  13.   build() { 
  14.     Column(){ 
  15.       Component3({ parameters: this.parameters })   // 傳遞參數是parameters,對象數組類型 
  16.     } 
  17.   } 
  18. // 被調用端 
  19. @Component 
  20. export struct Component3{ 
  21.   private parameters:any[]  // 定義同樣的參數,同樣的類型 
  22.   build(){ 
  23.     Column(){ 
  24.       ForEach(this.parameters,(item:any) => {   //【重要:獲取數組之后可以直接使用ForEach遍歷數據】 
  25.         Text(item.c01).fontSize(50) 
  26.         Text(item.c02).fontSize(50) 
  27.       },(item:any) => item.toString() // 文檔說選填,但不填會失敗 
  28.       ) 
  29.  
  30.     } 
  31.   } 

4.自定義類數組

  1. // 類 
  2. class enumData { 
  3.   image: Resource 
  4.   text: string 
  5.  
  6.   constructor(image: Resource, text: string) { 
  7.     this.image = image; 
  8.     this.text = text; 
  9.   } 
  10. // 調用端 
  11. @Entry 
  12. @Component 
  13. struct Index { 
  14.   enumDatas:enumData[] = this.getenumDatas() 
  15.   getenumDatas(){ 
  16.     let enumDatas: Array<enumData> = [] 
  17.     enumDatas.push(new enumData($r("app.media.icon"), "001")) 
  18.     enumDatas.push(new enumData($r("app.media.icon"), "002")) 
  19.     return enumDatas; 
  20.   } 
  21.  
  22.   build() { 
  23.     Column(){ 
  24.       Component4({ enumDatas: this.enumDatas }) 
  25.     } 
  26.   } 
  27. // 被調用端 
  28. @Component 
  29. export struct Component4{ 
  30.   private enumDatas:enumData[]  // 這里定義變量,用來接收 
  31.   build(){ 
  32.     Column(){ 
  33.       ForEach(this.enumDatas,(item:any) => { 
  34.         Image(item.image).width(50).height(50) 
  35.         Text(item.text).fontSize(50) 
  36.       },(item:any) => item.text.toString() // 文檔說選填,但不填會失敗 
  37.       ) 
  38.     } 
  39.   } 

6.發送設備控制信息

由于目前沒有API7的真機進行調試,所以發送控制設備信息這部分還沒有實現。但是以防萬一控制流程先記錄下來,方便以后再來添加。

與entry模塊類似,需要在build.gradle中進行配置,同樣的API。

  1. dependencies { 
  2.     ... ... 
  3.     implementation(group'com.huawei.hilink'name'ailifeability', version: '1.0.0.1', ext: 'har'

 eTS側要實現這樣的函數,來調用PA的能力。

  1. async setKeyValue(key, value) { 
  2.     let data = {}; 
  3.     data[key] = value; 
  4.     let action = utils.makeAction(ACTION_MESSAGE_CODE_DATACHANGED, data); 
  5.     let that = this; 
  6.     that.data.timer = setTimeout(function () { 
  7.         that.notifyObservers('showMessage', { 
  8.             'show'true 
  9.         }); 
  10.     }, WAIT_TIME); 
  11.     await FeatureAbility.callAbility(action); 

 src/main/java/com/liangzili/myonehop/DataHandlerAbility.java

java側根據ACTION_MESSAGE_CODE_DATA_CHANGED來確定要調用的方法。

  1. case ACTION_MESSAGE_CODE_DATA_CHANGED: { 
  2.     String zsonStr = data.readString(); 
  3.     ZSONObject zsonObj = ZSONObject.stringToZSON(zsonStr); 
  4.     for (Map.Entry<String, Object> entry : zsonObj.entrySet()) { 
  5.         deviceDataHandler.modifyDeviceProperty(entry.getKey(), entry.getValue()); 
  6.     } 
  7.     break; 

以上就是我在使用ArkUI開發時,一些重要知識點的總結,希望對朋友們有所幫助。

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

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

https://harmonyos.51cto.com

 

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

2022-05-19 15:47:24

碰一碰連接設備開發鴻蒙

2022-12-23 20:46:37

遙控器應用鴻蒙

2022-05-17 10:33:58

設備開發鴻蒙操作系統

2022-01-17 14:51:20

鴻蒙HarmonyOS應用

2021-07-15 09:39:06

鴻蒙HarmonyOS應用

2021-02-23 19:24:51

數字人民幣碰一碰支付

2023-02-03 16:31:33

2022-05-12 14:22:39

NFC標簽鴻蒙

2021-03-20 22:11:16

數字人民幣數字貨幣區塊鏈
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 午夜爽爽爽男女免费观看 | 国产精品一区二区久久 | 久久久久国产精品人 | 毛片毛片毛片毛片毛片 | 欧美日韩国产一区 | 一区二区三区免费 | 欧美精品91 | 精品国产免费人成在线观看 | 亚洲高清视频一区二区 | 一区二区不卡 | 日韩一级免费电影 | 麻豆一区二区三区精品视频 | 久久久久国产一级毛片 | 一区二区三区视频在线 | 国产精品视频久久 | 久久久久久久久久久久久久久久久久久久 | 在线免费黄色小视频 | 成人不卡 | 女人av| 精品国产一区二区三区免费 | 国产欧美日韩综合精品一 | 啪一啪在线视频 | 国产成人高清视频 | 国产精品久久久久久久久久不蜜臀 | 亚洲国产一区视频 | 99热在线免费 | 色女人天堂 | 狠狠综合久久av一区二区小说 | 欧美日韩国产一区二区 | 日韩精品四区 | 一区二区免费在线视频 | 91久久久久 | 成人高潮片免费视频欧美 | 丁香一区二区 | 澳门永久av免费网站 | 久色| 亚洲一区二区三区久久 | 国产成人高清视频 | 精品国产乱码久久久久久丨区2区 | 玖玖视频国产 | 国产色婷婷精品综合在线手机播放 |