<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

harmonyos開發新建頁面

jf_46214456 ? 來源:jf_46214456 ? 作者:jf_46214456 ? 2024-04-24 17:24 ? 次閱讀

介紹

介紹如何使用后臺代理提醒,實現一個簡易鬧鐘。要求完成以下功能:

  1. 展示指針表盤或數字時間。
  2. 添加、修改和刪除鬧鐘。
  3. 展示鬧鐘列表,并可打開和關閉單個鬧鐘。
  4. 鬧鐘到設定的時間后彈出提醒。
  5. 將鬧鐘的定時數據保存到輕量級數據庫。

相關概念

  • [Canvas]:提供畫布組件,用于自定義繪制圖形。
  • [CanvasRenderingContext2D]:使用RenderingContext在Canvas組件上進行繪制,繪制對象可以是矩形、文本、圖片等。
  • [后臺代理提醒]:開發應用時,開發者可以調用后臺提醒發布的接口創建定時提醒,包括倒計時、日歷、鬧鐘三種提醒類型。使用后臺代理提醒能力后,應用可以被凍結或退出,計時和彈出提醒的功能將被后臺系統服務代理。本應用中主要使用到后臺代理提醒的兩個接口:
    • publishReminder 發布一個后臺代理提醒,使用callback方式實現異步調用,該方法需要申請通知彈窗Notification.requestEnableNotification后才能調用。
    • cancelReminder 取消指定id的提醒,使用callback方式實現異步調用。
    • 鴻蒙開發指導文檔:[gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md]

搜狗高速瀏覽器截圖20240326151547.png

相關權限

本篇Codelab需要在module.json5中配置如下權限:

"requestPermissions": [
  {
    "name": "ohos.permission.PUBLISH_AGENT_REMINDER"
  }
]

環境搭建

軟件要求

  • [DevEco Studio]版本:DevEco Studio 3.1 Release。
  • OpenHarmony SDK版本:API version 9。

硬件要求

  • 開發板類型:[潤和RK3568開發板]。
  • OpenHarmony系統:3.2 Release。

環境搭建

完成本篇Codelab我們首先要完成開發環境的搭建,本示例以RK3568開發板為例,參照以下步驟進行:

  1. [獲取OpenHarmony系統版本]:標準系統解決方案(二進制)。以3.2 Release版本為例:
  2. 搭建燒錄環境。
    1. [完成DevEco Device Tool的安裝]
    2. [完成RK3568開發板的燒錄]
  3. 搭建開發環境。
    1. 開始前請參考[工具準備],完成DevEco Studio的安裝和開發環境配置。
    2. 開發環境配置完成后,請參考[使用工程向導]創建工程(模板選擇“Empty Ability”)。
    3. 工程創建完成后,選擇使用[真機進行調測]。

代碼結構解讀

本篇Codelab只對核心代碼進行講解,對于完整代碼,我們會在gitee中提供。

`HarmonyOSOpenHarmony鴻蒙文檔籽料:mau123789v直接拿`

├──entry/src/main/ets                       // 代碼區    
│  ├──common
│  │  ├──constants
│  │  │  ├──AlarmSettingType.ets            // 鬧鐘設置類型枚舉
│  │  │  ├──CommonConstants.ets             // 公共常量類
│  │  │  ├──DetailConstant.ets              // 詳情頁常量類
│  │  │  └──MainConstant.ets                // 首頁常量類
│  │  └──utils
│  │     ├──DataTypeUtils.ets               // 數據類型工具類
│  │     ├──DimensionUtil.ets               // 屏幕適配工具類
│  │     └──GlobalContext.ets               // 全局變量工具類
│  ├──entryability
│  │  └──EntryAbility.ets                   // 程序入口類
│  ├──model
│  │  ├──database
│  │  │  ├──PreferencesHandler.ets          // 輕量級數據庫操作類
│  │  │  └──PreferencesListener.ets         // 輕量級數據庫回調接口   
│  │  └──ReminderService.ets                // 系統后臺提醒服務類   
│  │──pages
│  │  ├──DetailIndex.ets                    // 詳情頁入口文件
│  │  └──MainIndex.ets                      // 主頁入口文件
│  │──view
│  │  ├──Detail     
│  │  │  ├──dialog
│  │  │  │  ├──CommonDialog.ets             // 公共Dialog組件
│  │  │  │  ├──DurationDialog.ets           // 鬧鈴時長選擇Dialog組件
│  │  │  │  ├──IntervalDialog.ets           // 鬧鈴間隔選擇Dialog組件
│  │  │  │  ├──RenameDialog.ets             // 鬧鈴名設置Dialog組件
│  │  │  │  └──RepeatDialog.ets             // 鬧鈴重復設置Dialog組件
│  │  │  ├──DatePickArea.ets                // 詳情頁時間選擇組件
│  │  │  └──SettingItem.ets                 // 詳情頁設置組件
│  │  ├──Main    
│  │  │  ├──AlarmList.ets                   // 主頁鬧鐘列表組件
│  │  │  ├──AlarmListItem.ets               // 主頁鬧鐘列表子項組件
│  │  │  └──ClockArea.ets                   // 主頁時鐘組件
│  │  └──BackContainer.ets                  // 自定義頭部組件
│  └──viewmodel
│     ├──AlarmItemBean.ets                  // 鬧鐘屬性類
│     ├──AlarmSettingBean.ets               // 鬧鐘設置屬性類
│     ├──DayDateBean.ets                    // 日期屬性類
│     ├──DetailViewModel.ets                // 詳情模塊邏輯功能類   
│     ├──MainViewModel.ets                  // 主頁邏輯功能類
│     └──ReminderItemBean.ets               // 后臺提醒屬性類
└──entry/src/main/resources                 // 資源文件目錄

鬧鐘主界面

鬧鐘界面包括當前時間、鬧鐘列表、添加鬧鐘子組件,具體包括以下模塊:

  • 展示當前時間。
  • 展示鬧鐘列表。
  • 添加鬧鐘。
  • 后臺代理提醒。

展示當前時間

當前時間使用了Canvas組件繪制,默認展示指針表盤,點擊表盤區域切換為數字時鐘。

在主頁的ClockArea組件中初始化Canvas畫布,并綁定指針表盤和數字時鐘切換事件。

// ClockArea.ets
@Component
export default struct ClockArea {
  ...
  build() {
    Canvas(this.renderContext)
      .width(this.canvasSize)
      .aspectRatio(CommonConstants.DEFAULT_LAYOUT_WEIGHT)
      .onReady(() = > {
        if (this.drawInterval === CommonConstants.DEFAULT_NUMBER_NEGATIVE) {
          this.startDrawTask();
        }
      })
      .onClick(() = > {
        this.showClock = !this.showClock;
      })
  }
  // 啟動繪畫任務
  private startDrawTask() {
    let that = this;
    that.renderContext.translate(
      this.canvasSize / CommonConstants.DEFAULT_DOUBLE,
      this.canvasSize / CommonConstants.DEFAULT_DOUBLE);
    that.drawClockArea();
    this.drawInterval = setInterval(() = > {
      that.drawClockArea();
    }, MainConstant.DEFAULT_ONE_SECOND_MS);
  }
  ...      
}

繪畫任務是使用CanvasRenderingContext2D對象在Canvas畫布組件上繪制指針表盤和數字時鐘。

// ClockArea.ets
// 開始繪制時鐘區域
private drawClockArea(): void{
  this.renderContext.clearRect(
    -this.canvasSize,
    -this.canvasSize / CommonConstants.DEFAULT_DOUBLE,
    this.canvasSize * CommonConstants.DEFAULT_DOUBLE,
    this.canvasSize);
  let date = new Date();
  let hours = date.getHours();
  let minutes = date.getMinutes();
  let seconds = date.getSeconds();
  if (this.showClock) {
    // 繪制表盤時鐘
  } else {
    // 繪制數字時鐘
  }
}

展示鬧鐘列表

鬧鐘列表組件,展示已添加的鬧鐘信息,可對鬧鐘進行啟停操作,點擊鬧鐘可跳轉到鬧鐘操作界面(修改和刪除鬧鐘)。主頁啟動后獲取輕量級數據庫中的鬧鐘定時數據,并監控數據庫數據變化。

// MainViewModel.ets
public queryAlarmsTasker(callback: (alarms: Array< AlarmItem >) = > void) {
  let that = this;
  that.queryDatabaseAlarms(callback);
  let preference = GlobalContext.getContext().getObject('preference') as PreferencesHandler;
  preference.addPreferencesListener({
    onDataChanged() {
      that.queryDatabaseAlarms(callback);
    }
  } as PreferencesListener)
}

在AlarmList.ets中添加鬧鐘列表子組件,并綁定啟停、跳轉事件。

// AlarmList.ets
@Component
export default struct AlarmList {
  @Link alarmItems: Array< AlarmItem >;

  build() {
    List({ space: DimensionUtil.getVp($r('app.float.alarm_list_space')) }) {
      ForEach(this.alarmItems, (item: AlarmItem) = > {
        ListItem() {
          AlarmListItem({ alarmItem: item })
        }.onClick(() = > {
          router.pushUrl({ url: "pages/DetailIndex", params: { alarmItem: item } });
        })
      }, (item: AlarmItem) = > JSON.stringify(item))
    }
    .padding({
      left: DimensionUtil.getVp($r('app.float.alarm_list_content_distance')),
      right: DimensionUtil.getVp($r('app.float.alarm_list_content_distance'))
    })
    .listDirection(Axis.Vertical)
    .layoutWeight(CommonConstants.DEFAULT_LAYOUT_WEIGHT)
    .margin({ top: DimensionUtil.getVp($r('app.float.alarm_list_content_distance')) })
  }
}

添加鬧鐘

添加鬧鐘,點擊界面底部鬧鐘添加按鈕,跳轉到鬧鐘操作界面(新增鬧鐘)。

在MainIndex.ets中為添加按鈕綁定跳轉事件。

// MainIndex.ets
@Entry
@Component
struct MainIndex {
  ...
  build() {
    Column() {
	  ...
      Button() {
        Image($r('app.media.ic_add')).objectFit(ImageFit.Fill)
      }
      ...
      .onClick(() = > {
        router.pushUrl({ url: "pages/DetailIndex" });
      })
    }
    ...
  }
}

后臺代理提醒

后臺代理提醒,根據鬧鐘列表中的數據來設置(啟停)鬧鐘實例。

// MainViewModel.ets
// 開啟/關閉鬧鐘
public openAlarm(id: number, isOpen: boolean) {
  for (let i = 0; i < this.alarms.length; i++) {
    if (this.alarms[i].id === id) {
      this.alarms[i].isOpen = isOpen;
      if (isOpen) {
        this.reminderService.addReminder(this.alarms[i]);
      } else {
        this.reminderService.deleteReminder(this.alarms[i].id);
      }
      let preference = GlobalContext.getContext().getObject('preference') as PreferencesHandler;
      preference.set(CommonConstants.ALARM_KEY, JSON.stringify(this.alarms));
      break;
    }
  }
}

鬧鐘詳情界面

鬧鐘操作界面分為新增和修改界面,其中在修改界面可刪除鬧鐘。具體包括以下模塊:

  • 退出或保存詳情。
  • 設置鬧鐘時間。
  • 設置鬧鐘詳情。
  • 提供后臺代理提醒能力

退出或保存詳情

點擊左上角“x”圖標關閉操作界面,關閉鬧鐘操作界面子組件,點擊右上角“√”圖標,保存當前設置并關閉操作界面。

在DetailIndex.ets入口頁面中引入頭部組件BackContainer,自定義了返回按鈕和返回邏輯操作,添加確定(“√”)子組件,并綁定點擊事件。

// DetailIndex.ets
build()
{
  Column() {
    ...
    Button() {
      Image($r('app.media.ic_confirm')).objectFit(ImageFit.Fill)
    }
    .backgroundColor($r('app.color.trans_parent'))
    .width(DimensionUtil.getVp($r('app.float.title_button_size')))
    .height(DimensionUtil.getVp($r('app.float.title_button_size')))
    .onClick(() = > {
      this.viewModel.setAlarmRemind(this.alarmItem);
      router.back();
    })
    ...
  }
}

// BackContainer.ets
build() {
  Row() {
    ...
    Text(this.header)
      .fontSize(DimensionUtil.getFp($r('app.float.detail_title_font_size')))
      .lineHeight(DimensionUtil.getVp($r('app.float.title_line_height')))
      .margin({ left: DimensionUtil.getVp($r('app.float.title_margin')) })
      .fontColor($r('app.color.grey_divider'))
      .fontWeight(FontWeight.Bold)
    Blank()
    if (this.closer) {
      this.closer();
    }
  }
  .padding({
    left: DimensionUtil.getVp($r('app.float.title_horizon_margin')),
    right: DimensionUtil.getVp($r('app.float.title_horizon_margin'))
  })
  .height(DimensionUtil.getVp($r('app.float.page_title_height')))
  .width(CommonConstants.FULL_LENGTH)
}

設置鬧鐘時間

設置鬧鐘提醒時間,在鬧鐘操作界面可通過滑動選擇器設置鬧鐘的提醒時間(包括:時段、小時、分鐘)。詳情頁DetailIndex.ets中添加鬧鐘時間選擇器子組件DatePickArea.ets。

// DatePickArea.ets
@Component
export default struct DatePickArea {
  build() {
    Stack({ alignContent: Alignment.Center }) {
      Row() {
        ForEach(DetailConstant.DAY_DATA, (item: DayDataBean) = > {
          TextPicker({ range: item.data, selected: item.delSelect })
            .layoutWeight(CommonConstants.DEFAULT_LAYOUT_WEIGHT)
            .backgroundColor($r('app.color.grey_light'))
            .onChange((value: string, index: number) = > {
              item.delSelect = index;
            })
        }, (item: DayDataBean) = > JSON.stringify(item))
      }
    }
    .height(DimensionUtil.getVp($r('app.float.date_picker_height')))
    .padding({
      left: DimensionUtil.getVp($r('app.float.date_picker_padding_horizon')),
      right: DimensionUtil.getVp($r('app.float.date_picker_padding_horizon'))
    })
  }
}

設置鬧鐘詳情

點擊詳情頁DetailIndex.ets設置條目組件SettingItem.ets,支持設置鬧鐘重復時間、鬧鐘名稱、重復次數和鬧鈴時長。

// SettingItem.ets
build() {
  Column() {
    ForEach(this.settingInfo, (item: AlarmSettingBean, index: number | undefined) = > {
      Divider()
      ...
      Row() {
        Text(item.title)...
        Text(item.content)...
        Image($r('app.media.ic_right'))...
      }
      ...
      .onClick(() = > {
        this.showSettingDialog(item.sType);
      })
    }, (item: AlarmSettingBean, index: number | undefined) = > JSON.stringify(item) + index)
  }
  ...
}

提供后臺代理提醒能力

導入系統提醒服務類ReminderService.ets,它由系統后臺代理提醒能力封裝,支持新增、修改、刪除系統鬧鐘功能,在設置、刪除鬧鐘后同步更新到輕量級數據庫中并刷新主頁頁面。

// DetailViewModel.ets
public async setAlarmRemind(alarmItem: AlarmItem) {
  alarmItem.hour = this.getAlarmTime(CommonConstants.DEFAULT_SINGLE);
  alarmItem.minute = this.getAlarmTime(CommonConstants.DEFAULT_DATA_PICKER_HOUR_SELECTION);
  let index = await this.findAlarmWithId(alarmItem.id);
  if (index !== CommonConstants.DEFAULT_NUMBER_NEGATIVE) { // 已存在,刪除原有提醒
    this.reminderService.deleteReminder(alarmItem.id);
  } else { // 不存在,以數據長度為notificationId新增鬧鐘數據
    index = this.alarms.length;
    alarmItem.notificationId = index;
    this.alarms.push(alarmItem);
  }
  this.reminderService.addReminder(alarmItem, (newId: number) = > {
    alarmItem.id = newId;
    alarmItem.isOpen = true;
    this.alarms[index] = alarmItem;
    let preference = GlobalContext.getContext().getObject('preference') as PreferencesHandler;
    preference.set(CommonConstants.ALARM_KEY, JSON.stringify(this.alarms));
  })
}

public async removeAlarmRemind(id: number) {
  this.reminderService.deleteReminder(id);
  let index = await this.findAlarmWithId(id);
  if (index !== CommonConstants.DEFAULT_NUMBER_NEGATIVE) {
    this.alarms.splice(index, CommonConstants.DEFAULT_SINGLE);
  }
  let preference = GlobalContext.getContext().getObject('preference') as PreferencesHandler;
  preference.set(CommonConstants.ALARM_KEY, JSON.stringify(this.alarms));
}

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 鴻蒙
    +關注

    關注

    55

    文章

    1760

    瀏覽量

    42153
  • HarmonyOS
    +關注

    關注

    79

    文章

    1876

    瀏覽量

    29330
  • OpenHarmony
    +關注

    關注

    23

    文章

    3375

    瀏覽量

    15192
收藏 人收藏

    評論

    相關推薦

    鴻蒙OS開發實例:【頁面傳值跳轉】

    本篇主要介紹如何在HarmonyOS中,在頁面跳轉之間如何傳值 HarmonyOS頁面指的是帶有@Entry裝飾器的文件,其不能獨自存在,必須依賴UIAbility這樣的組件容器
    的頭像 發表于 03-29 20:16 ?1015次閱讀
    鴻蒙OS<b class='flag-5'>開發</b>實例:【<b class='flag-5'>頁面</b>傳值跳轉】

    HarmonyOS開發案例:【排行榜頁面

    本課程使用聲明式語法和組件化基礎知識,搭建一個可刷新的排行榜頁面。在排行榜頁面中,使用循環渲染控制語法來實現列表數據渲染,使用@Builder創建排行列表布局內容,使用裝飾器@State、@Prop、@Link來管理組件狀態。
    的頭像 發表于 04-30 16:16 ?1430次閱讀
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>開發</b>案例:【排行榜<b class='flag-5'>頁面</b>】

    HarmonyOS應用開發頁面開發

    該文檔帶領大家手把手開發頁面,包含的知識有:1、XML編寫頁面;2、加載XML布局;3、創建Feature Ability;4、代碼編寫界面;5、實現頁面跳轉;6、跨設備啟動FA;注:
    發表于 09-10 17:44

    HarmonyOS應用開發】Hello HarmonyOS到Hi HarmonyOS(3)

    頁面跳轉。創建第二個頁面新建一個Empty Feature Ability(Java),看意思是一個空的元程序,其實不是,它里面還有模板的一些代碼,后續我們可以刪除重寫。頁面名稱
    發表于 11-11 09:25

    #HarmonyOS征文#—頁面之間的跳轉

    i.setOperation(operation);//跳轉頁面startAbility(i);} }}點擊后跳轉到第二個頁面【本文正在參與“有獎征文 | HarmonyOS征文大賽”活動】https://bbs.elecfan
    發表于 07-20 14:44

    【資料】HarmonyOS應用開發頁面開發

    HarmonyOS應用開發頁面開發回復帖子查看資料下載鏈接:[hide][/hide]
    發表于 08-12 11:53

    #HarmonyOS征文# HarmonyOS實戰—實現注冊登錄和修改密碼頁面

    1. 注冊登錄頁面設置的要求如下: 新建項目:TextApplication上面的數值單位都是 px ,所以要轉換成 vp 和 fp在 1920*1080 分辨率下,1px = 1/3vpP40
    發表于 08-13 17:23

    HarmonyOS開發環境的安裝與配置過程分享

    ;設置,進入HarmonyOS SDK頁面,就可以下載其他組件,只需要勾選對應的組件包,點擊申請。 開發環境配置完成后,可以通過運行HelloWorld工程來驗證環境設置是否正確。需通過代理訪問網絡場景
    發表于 03-14 11:42

    HarmonyOS應用開發-ClickableImageJsDome體驗

    的設計。本DEMO主要涉及到的頁面元素有有image,image-animator,展現圖片資源在界面交互中幾種常見運用效果。旨在幫助開發人員快速了解HarmonyOS JSUI應用的開發
    發表于 06-18 11:42

    HarmonyOS/OpenHarmony應用開發-DevEco Studio新建項目的整體說明

    ,是開發者需要優先了解熟悉*附件:HarmonyOSOpenHarmony應用開發-DevEco Studio新建項目的整體說明.docx
    發表于 09-15 16:51

    鴻蒙原生應用/元服務開發-AGC分發如何上架HarmonyOS應用

    合作協議,此時會彈出華為智慧分發平臺合作協議對話框,開發者需按提示進行協議簽署。否則,頁面將跳轉回AGC首頁,開發者將無法繼續發布HarmonyOS應用。 注意:只有帳號持有者和法務角
    發表于 11-24 14:44

    華為開發HarmonyOS零基礎入門:系統能力調用示例

    華為開發HarmonyOS零基礎入門:系統能力調用示例,修改組件屬性頁面加載參數接收數據連接,優化切換交互體驗。
    的頭像 發表于 10-23 10:44 ?1206次閱讀
    華為<b class='flag-5'>開發</b>者<b class='flag-5'>HarmonyOS</b>零基礎入門:系統能力調用示例

    HarmonyOS 應用開發-ClickableImageJsDome體驗

    的設計。本DEMO主要涉及到的頁面元素有有image,image-animator,展現圖片資源在界面交互中幾種常見運用效果。旨在幫助開發人員快速了解 HarmonyOS JSUI應用的開發
    的頭像 發表于 06-20 00:24 ?950次閱讀
    <b class='flag-5'>HarmonyOS</b> 應用<b class='flag-5'>開發</b>-ClickableImageJsDome體驗

    小白指南:手把手教你用低代碼開發一個應用頁面

    一 什么是低代碼開發 在了解低代碼開發之前,我們先看看使用低代碼開發的效果。 低代碼開發效果示例 低代碼開發是DevEco Studio為
    的頭像 發表于 02-17 09:10 ?860次閱讀

    HarmonyOS開發:舒爾特方格游戲

    為豐富 HarmonyOS 對云端開發的支持、實現 HarmonyOS 生態端云聯動,DevEco Studio 推出了云開發功能,開發者在
    的頭像 發表于 06-19 15:05 ?523次閱讀
    <b class='flag-5'>HarmonyOS</b>云<b class='flag-5'>開發</b>:舒爾特方格游戲
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>