91在线观看视频-91在线观看视频-91在线观看免费视频-91在线观看免费-欧美第二页-欧美第1页

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

HarmonyOS開發案例:【生活健康app之實現打卡功能】(2)

jf_46214456 ? 來源:jf_46214456 ? 作者:jf_46214456 ? 2024-05-10 15:29 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

實現打卡功能

首頁會展示當前用戶已經開啟的任務列表,每條任務會顯示對應的任務名稱以及任務目標、當前任務完成情況。用戶只可對當天任務進行打卡操作,用戶可以根據需要對任務列表中相應的任務進行點擊打卡。如果任務列表中的每個任務都在當天完成則為連續打卡一天,連續打卡多天會獲得成就徽章。打卡效果如下圖所示:

開發前請熟悉鴻蒙開發指導文檔:[qr23.cn/FBD4cY]。

任務列表

使用List組件展示用戶當前已經開啟的任務,每條任務對應一個TaskCard組件,clickAction包裝了點擊和長按事件,用戶點擊任務卡時會觸發彈起打卡彈窗,從而進行打卡操作;長按任務卡時會跳轉至任務編輯界面,對相應的任務進行編輯處理。代碼如下:

// HomeComponent.ets
// 任務列表
ForEach(this.homeStore.getTaskListOfDay(), (item: TaskInfo) = > {
  TaskCard({
    taskInfoStr: JSON.stringify(item),
    clickAction: (isClick: boolean) = > this.taskItemAction(item, isClick)
  })
  .margin({ bottom: Const.DEFAULT_12 })
  .height($r('app.float.default_64'))
}, (item: TaskInfo) = > JSON.stringify(item))
...
CustomDialogView() // 自定義彈窗中間件

自定義彈窗中間件CustomDialogView

在組件CustomDialogView的aboutToAppear生命周期中注冊SHOW_TASK_DETAIL_DIALOG的事件回調方法 ,當通過emit觸發此事件時即觸發回調方法執行。代碼如下:

// CustomDialogView.ets
export class CustomDialogCallback {
  confirmCallback: Function = () = > {};
  cancelCallback: Function = () = > {};
}

@Component
export struct CustomDialogView {
  @State isShow: boolean = false;
  @Provide achievementLevel: number = 0;
  @Consume broadCast: BroadCast;
  @Provide currentTask: TaskInfo = TaskItem;
  @Provide dialogCallBack: CustomDialogCallback = new CustomDialogCallback();

  // 成就對話框
  achievementDialog: CustomDialogController = new CustomDialogController({
    builder: AchievementDialog(),
    autoCancel: true,
    customStyle: true
  });

  // 任務時鐘對話框
  taskDialog: CustomDialogController = new CustomDialogController({
    builder: TaskDetailDialog(),
    autoCancel: true,
    customStyle: true
  });

  aboutToAppear() {
    Logger.debug('CustomDialogView', 'aboutToAppear');
    // 成就對話框
    this.broadCast.on(BroadCastType.SHOW_ACHIEVEMENT_DIALOG, (achievementLevel: number) = > {
      Logger.debug('CustomDialogView', 'SHOW_ACHIEVEMENT_DIALOG');
      this.achievementLevel = achievementLevel;
      this.achievementDialog.open();
    });

    // 任務時鐘對話框
    this.broadCast.on(BroadCastType.SHOW_TASK_DETAIL_DIALOG,
      (currentTask: TaskInfo, dialogCallBack: CustomDialogCallback) = > {
        Logger.debug('CustomDialogView', 'SHOW_TASK_DETAIL_DIALOG');
        this.currentTask = currentTask || TaskItem;
        this.dialogCallBack = dialogCallBack;
        this.taskDialog.open();
    });
  }

  aboutToDisappear() {
    Logger.debug('CustomDialogView', 'aboutToDisappear');
  }

  build() {
  }
}

點擊任務卡片

點擊任務卡片會emit觸發 “SHOW_TASK_DETAIL_DIALOG” 事件,同時把當前任務,以及確認打卡回調方法傳遞下去。代碼如下:

// HomeComponent.ets
// 任務卡片事件
taskItemAction(item: TaskInfo, isClick: boolean): void {
  ...
  if (isClick) {
    // 點擊任務打卡
     let callback: CustomDialogCallback = { confirmCallback: (taskTemp: TaskInfo) = > {
        this.onConfirm(taskTemp)
     }, cancelCallback: () = > {
     } };
    // 觸發彈出打卡彈窗事件  并透傳當前任務參數(item) 以及確認打卡回調
     this.broadCast.emit(BroadCastType.SHOW_TASK_DETAIL_DIALOG, [item, callback]);
  } else {
    // 長按編輯任務
    ...
  }
}
// 確認打卡
onConfirm(task) {
  this.homeStore.taskClock(task).then((res: AchievementInfo) = > {
    // 打卡成功后 根據連續打卡情況判斷是否 彈出成就勛章  以及成就勛章級別
    if (res.showAchievement) {
      // 觸發彈出成就勛章SHOW_ACHIEVEMENT_DIALOG 事件, 并透傳勛章類型級別
      let achievementLevel = res.achievementLevel;
      if (achievementLevel) {
        this.broadCast.emit(BroadCastType.SHOW_ACHIEVEMENT_DIALOG, achievementLevel);
      } else {
        this.broadCast.emit(BroadCastType.SHOW_ACHIEVEMENT_DIALOG);
      }
    }
  })
}

打卡彈窗組件TaskDetailDialog

打卡彈窗組件根據當前任務的ID獲取任務名稱以及彈窗背景圖片資源。

打卡彈窗組件由兩個小組件構成,代碼如下:

// TaskDetailDialog.ets
Column() {
  // 展示任務的基本信息
  TaskBaseInfo({
    taskName: TaskMapById[this.currentTask?.taskID - 1].taskName  // 根據當前任務ID獲取任務名稱
  });
  // 打卡功能組件 (任務打卡、關閉彈窗)
  TaskClock({
    confirm: () = > {
      this.dialogCallBack.confirmCallback(this.currentTask);
      this.controller.close();
    },
    cancel: () = > {
      this.controller.close();
    },
    showButton: this.showButton
  })
}
...

TaskBaseInfo組件代碼如下:

// TaskDetailDialog.ets
@Component
struct TaskBaseInfo {
  taskName: string | Resource = '';

  build() {
    Column({ space: Const.DEFAULT_8 }) {
      Text(this.taskName)
        .fontSize($r('app.float.default_22'))
        .fontWeight(FontWeight.Bold)
        .fontFamily($r('app.string.HarmonyHeiTi_Bold'))
        .taskTextStyle()
        .margin({left: $r('app.float.default_12')})
    }
    .position({ y: $r('app.float.default_267') })
  }
}

TaskClock組件代碼如下:

// TaskDetailDialog.ets
@Component
struct TaskClock {
  confirm: Function = () = > {};
  cancel: Function = () = > {};
  showButton: boolean = false;

  build() {
    Column({ space: Const.DEFAULT_12 }) {
      Button() {
        Text($r('app.string.clock_in'))
          .height($r('app.float.default_42'))
          .fontSize($r('app.float.default_20'))
          .fontWeight(FontWeight.Normal)
          .textStyle()
      }
      .width($r('app.float.default_220'))
      .borderRadius($r('app.float.default_24'))
      .backgroundColor('rgba(255,255,255,0.40)')
      .onClick(() = > {
        GlobalContext.getContext().setObject('taskListChange', true);
        this.confirm();
      })
      .visibility(!this.showButton ? Visibility.None : Visibility.Visible)
      Text($r('app.string.got_it'))
        .fontSize($r('app.float.default_14'))
        .fontWeight(FontWeight.Regular)
        .textStyle()
        .onClick(() = > {
          this.cancel();
        })
    }
  }
}

打卡接口調用

// HomeViewModel.ets
public async taskClock(taskInfo: TaskInfo) {
  let taskItem = await this.updateTask(taskInfo);
  let dateStr = this.selectedDayInfo?.dateStr;
  // 更新任務失敗
  if (!taskItem) {
    return {
      achievementLevel: 0,
      showAchievement: false
    } as AchievementInfo;
  }
  // 更新當前時間的任務列表
  this.selectedDayInfo.taskList = this.selectedDayInfo.taskList.map((item) = > {
    return item.taskID === taskItem?.taskID ? taskItem : item;
  });
  let achievementLevel: number = 0;
  if(taskItem.isDone) {
    // 更新每日任務完成情況數據
    let dayInfo = await this.updateDayInfo();
    ... 
    // 當日任務完成數量等于總任務數量時 累計連續打卡一天
    // 更新成就勛章數據 判斷是否彈出獲得勛章彈出及勛章類型
    if (dayInfo && dayInfo?.finTaskNum === dayInfo?.targetTaskNum) {
      achievementLevel = await this.updateAchievement(this.selectedDayInfo.dayInfo);
    }
  }
  ...
  return {
    achievementLevel: achievementLevel,
    showAchievement: ACHIEVEMENT_LEVEL_LIST.includes(achievementLevel)
  } as AchievementInfo;
}

`HarmonyOSOpenHarmony鴻蒙文檔籽料:mau123789是v直接拿`

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

// HomeViewModel.ets
// 更新當天任務列表
updateTask(task: TaskInfo): Promise< TaskInfo > {
  return new Promise((resolve, reject) = > {
    let taskID = task.taskID;
    let targetValue = task.targetValue;
    let finValue = task.finValue;
    let updateTask = new TaskInfo(task.id, task.date, taskID, targetValue, task.isAlarm, task.startTime,
      task.endTime, task.frequency, task.isDone, finValue, task.isOpen);
    let step = TaskMapById[taskID - 1].step; // 任務步長
    let hasExceed = updateTask.isDone;
    if (step === 0) { // 任務步長為0 打卡一次即完成該任務
      updateTask.isDone = true; // 打卡一次即完成該任務
      updateTask.finValue = targetValue;
    } else {
      let value = Number(finValue) + step; // 任務步長非0 打卡一次 步長與上次打卡進度累加
      updateTask.isDone = updateTask.isDone || value >= Number(targetValue); // 判斷任務是否完成
      updateTask.finValue = updateTask.isDone ? targetValue : `${value}`;
    }
    TaskInfoTableApi.updateDataByDate(updateTask, (res: number) = > { // 更新數據庫
      if (!res || hasExceed) {
        Logger.error('taskClock-updateTask', JSON.stringify(res));
        reject(res);
      }
      resolve(updateTask);
    })
  })
}

審核編輯 黃宇

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

    關注

    80

    文章

    2126

    瀏覽量

    33117
  • OpenHarmony
    +關注

    關注

    29

    文章

    3854

    瀏覽量

    18643
  • 鴻蒙OS
    +關注

    關注

    0

    文章

    191

    瀏覽量

    4998
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    AppCube低代碼快速開發健康打卡應用

    本篇文章采用輕應用項目類型里的`健康打卡`應用,來介紹AppCube的使用流程?,F在疫情還沒有褪去,全國各地都還在持續抵抗疫情,健康打卡應用可以自助上報個人
    的頭像 發表于 07-13 09:10 ?2617次閱讀
    AppCube低代碼快速<b class='flag-5'>開發</b><b class='flag-5'>健康</b><b class='flag-5'>打卡</b>應用

    HarmonyOS開發案例:【購物車app

    OpenHarmony ArkUI框架提供了豐富的動畫組件和接口,開發者可以根據實際場景和開發需求,選用豐富的動畫組件和接口來實現不同的動畫效果。
    的頭像 發表于 05-14 18:19 ?1485次閱讀
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>開發案</b>例:【購物車<b class='flag-5'>app</b>】

    HarmonyOS開發案例:【生活健康app之首頁啟動】(1)

    用戶可以創建最多6個健康生活任務(早起,喝水,吃蘋果,每日微笑,刷牙,早睡),并設置任務目標、是否開啟提醒、提醒時間、每周任務頻率。
    的頭像 發表于 05-10 11:49 ?1463次閱讀
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>開發案</b>例:【<b class='flag-5'>生活</b><b class='flag-5'>健康</b><b class='flag-5'>app</b>之首頁啟動】(1)

    HarmonyOS HiSpark Wi-Fi IoT HarmonyOS 智能家居套件試用 】基于3861,從harmonyos出發,建立場景聯動,無感配網,實現更加智能家居生活

    項目名稱:基于3861,從harmonyos出發,建立場景聯動,無感配網,實現更加智能家居生活試用計劃:1.基于harmonyos實現基本的
    發表于 09-25 10:06

    HarmonyOS開發跨設備的鴻蒙(HarmonyOSApp

    是圓形(如智能手表),這就給開發App帶來了麻煩。現在幾乎每一個智能設備廠商,如Apple、華為都面臨這個問題。這就要求我們開發App盡可能適合更多的智能設備。當然,最簡單,最直接的
    發表于 11-02 15:18

    如何優雅地開發HarmonyOS APP應用

    ` 本帖最后由 軟通動力HOS 于 2021-3-10 15:29 編輯 研究HarmonyOS有一段時間了,今天主要結合自己多年的項目開發經驗和各種技術棧結合HarmonyOS APP
    發表于 03-10 15:13

    【鄭州輕工業大學】HarmonyOS寵物健康系統的開發分享

    查看自己愛寵的生命體征、生活狀態以及病情預測等信息,從而監控寵物的身體狀況。 圖1 手機展示效果圖 圖2 智能手表展示效果圖 02 HarmonyOS學習和項目開發 在回憶和復盤整
    發表于 03-01 14:54

    鴻蒙智聯生態產品《接入智慧生活App開發指導》(官方更新版)

    HarmonyOS Connect云。 ② 消費者通過智慧生活App調用云端的H5開發包,從而實現對設備的管理和控制。 圖
    發表于 04-26 15:00

    4天帶你上手HarmonyOS ArkUI開發

    本次HarmonyOS ArkUI入門訓練營課程--健康生活實戰篇,手把手教大家如何制作一個合理膳食的APP前端Demo!課程實戰樣例通過ArkUI聲明式UI開發框架
    發表于 09-09 14:44

    4天帶你上手HarmonyOS ArkUI開發——《HarmonyOS ArkUI入門訓練營之健康生活實戰》

    框架實現。ArkUI采用極簡的聲明式UI描述界面語法,只需用幾行簡單直觀的聲明式代碼,即可完成界面功能,內置了豐富而精美HarmonyOS Design的UI組件和API,可滿足大部分跨端應用界面
    發表于 01-05 11:49

    App開發案例教程PDF電子書免費下載

    App開發案例教程》通過一個實例,介紹App設計、開發直至上線的全過程,引導讀者在較短時間內熟悉一個較大規模的App應用系統的
    發表于 08-05 08:00 ?38次下載
    <b class='flag-5'>App</b><b class='flag-5'>開發案</b>例教程PDF電子書免費下載

    華為開發者分論壇HarmonyOS學生公開課-OpenHarmony Codelabs開發案

    2021華為開發者分論壇HarmonyOS學生公開課-OpenHarmony Codelabs開發案
    的頭像 發表于 10-24 11:25 ?2173次閱讀
    華為<b class='flag-5'>開發</b>者分論壇<b class='flag-5'>HarmonyOS</b>學生公開課-OpenHarmony Codelabs<b class='flag-5'>開發案</b>例

    HarmonyOS家庭寵物健康監測系統開發方案

    本期我們給大家帶來的是家庭寵物健康監測系統開發者楊光的分享,希望能給你的HarmonyOS開發之旅帶來啟發~
    的頭像 發表于 03-03 10:24 ?3114次閱讀

    如何接入智慧生活App

     在HarmonyOS Connect生態產品應用開發過程中,很多開發者對于如何接入智慧生活App還存在一些疑問,如:如何選擇合適的
    的頭像 發表于 04-25 10:42 ?4724次閱讀
    如何接入智慧<b class='flag-5'>生活</b><b class='flag-5'>App</b>

    HarmonyOS開發案例:【生活健康app之獲取成就】(3)

    成就頁面展示用戶可以獲取的所有勛章,當用戶滿足一定的條件時,將點亮本頁面對應的勛章,沒有得到的成就勛章處于熄滅狀態。共有六種勛章,當用戶連續完成任務打卡3天、7天、30天、50天、73天、99天時,可以獲得對應的“連續xx天達成”勛章。
    的頭像 發表于 05-10 17:18 ?547次閱讀
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>開發案</b>例:【<b class='flag-5'>生活</b><b class='flag-5'>健康</b><b class='flag-5'>app</b>之獲取成就】(3)
    主站蜘蛛池模板: 九九九国产在线 | аⅴ资源中文在线天堂 | 特黄日韩免费一区二区三区 | 日本三级视频在线观看 | 久久青草免费免费91线频观看 | 日本资源在线 | 最新日本免费一区二区三区中文 | 免费网站黄成人影院 | 色干干 | 天天操狠狠干 | 午夜免费片| 女上男下边吃奶边做视频成都 | 久久99热精品免费观看无卡顿 | 午夜黄色大片 | 国产成人精品曰本亚洲77美色 | 日本黄大乳片免费观看 | 国产精品久久婷婷六月丁香 | 午夜剧场黄色 | 欧美人与动性视频在线观 | 国模极品一区二区三区 | 人人精品久久 | 午夜小视频男女在线观看 | 亚洲免费色图 | 四虎在线视频观看 | 黄色三级三级三级免费看 | 国产区一区二区三 | 狠狠色噜噜狠狠狠狠黑人 | 亚洲色图综合网站 | 手机看片福利日韩 | 啪啪网站免费观看 | 亚洲一区免费在线观看 | 色www永久免费视频 色y情视频免费看 | 激情文学综合 | 亚洲欧美视频二区 | 俺去久久| 色视频免费版高清在线观看 | 国产精品久久久久免费 | 国产毛片久久国产 | 手机看片福利1024 | 亚洲国产午夜看片 | 天天操女人 |