鸿蒙小案例---心情日记

news2025/4/16 8:44:30

效果演示

代码实现

import { router, window } from '@kit.ArkUI'

@Entry
@Component
struct Index {
  async aboutToAppear(): Promise<void> {
    let w = await window.getLastWindow(getContext())
    w.setWindowSystemBarProperties({
      statusBarColor: '#00C6C3',
      statusBarContentColor: '#FFFFFF'
    })
  }

  build() {
    Column({ space: 16 }) {
      Text('心情日记 - 首页')
        .fontSize(26)
      Button('去写日记')
        .backgroundColor('#00c6c3')
        .onClick(() => {
          router.pushUrl({
            url: 'pages/WriteDiary'
          })
        })

    }
    .width('100%')
    .height('100%')
    .padding(20)

    // .backgroundColor(Color.Pink)
  }
}
import { Font, window } from '@kit.ArkUI'

@Entry
@Component
struct WriteDiary {
  static readonly BASE_FONT_SIZE = 22 //页面基础字体大小
  @State diaryContent: string = '' // 日记内容
  @LocalStorageLink('WeatherFromUIAbility') weather: string = '选择天气'
  @LocalStorageLink('MoodFromUIAbility') mood: string = '选择心情'
  // 天气选择对话框
  weatherDialogCtrl = new CustomDialogController({
    builder: WeatherDialog({ weather: this.weather }),
    width: '100%',
    height: 333,
    alignment: DialogAlignment.Bottom,
    cornerRadius: 0,
    offset: {
      dx: 0,
      dy: 25
    }
  })

  // 心情选择对话框
  moodDialogCtrl = new CustomDialogController({
    builder: MoodDialog({ mood: this.mood }),
    width: '100%',
    height: 333,
    alignment: DialogAlignment.Bottom,
    cornerRadius: 0,
    offset: {
      dx: 0,
      dy: 25
    }
  })

  async aboutToAppear(): Promise<void> {
    let w = await window.getLastWindow(getContext())
    w.setWindowLayoutFullScreen(true)
  }

  build() {
    Column() {
      // 顶部栏
      Row() {
        Image('/images/back.svg')
          .width(11)
          .height(18)


        Text('2024年4月25日')
          .fontSize(14)
          .fontColor('#fff')
          .margin({ left: 10 })

        Blank()

        Row({ space: 3 }) {
          Text('101')
            .fontSize(13)
            .fontColor('#fff')
          Image('/images/down.svg')
            .height(5)
        }
        .width(46)
        .margin({ right: 20 })

        Image('/images/more.svg')
          .width(4)
          .height(16)
      }
      .height(94)
      .width('100%')
      .backgroundColor('#00C6C3')
      .alignItems(VerticalAlign.Bottom)
      .padding({ left: 20, right: 20, bottom: 20 })

      //   写日记
      Column() {
        TextArea({
          placeholder: '写日记'
        })// .placeholderFont(globalThis.parseInt(14))
          .placeholderColor('#AAAAAA')
          .placeholderFont({ size: WriteDiary.BASE_FONT_SIZE })
          .backgroundColor('#fff')
          .margin({ left: 20, top: 20 })
          .onChange((value: string) => {
            this.diaryContent = value
          })
      }
      .layoutWeight(1)

      //   添加图片
      Row() {
        Text('+')
          .textAlign(TextAlign.Center)
          .fontColor('#fff')
          .fontSize(30)
          .fontWeight(700)
          .width(111)
          .height(99)
          .backgroundColor('#f2f2f2')
          .borderRadius(5)
      }
      .width('100%')
      .justifyContent(FlexAlign.Start)
      .margin({ left: 40 })

      //   选择天气
      Row({ space: 10 }) {
        Image('/images/weather.png')
          .width(20)
          .height(14)
        Text(this.weather)
          .fontSize(13)
          .fontColor('#7f7f7f')
          .onClick(_ => {
            this.weatherDialogCtrl.open()
          })
      }
      .width('100%')
      .justifyContent(FlexAlign.Start)
      .margin({ left: 40, top: 20 })

      //   选择心情
      Row({ space: 10 }) {
        Image('/images/excited.png')
          .width(19)
          .height(19)
        Text(this.mood)
          .fontSize(13)
          .fontColor('#7f7f7f')
          .onClick(_=>{
            this.moodDialogCtrl.open()
          })
      }
      .width('100%')
      .justifyContent(FlexAlign.Start)
      .margin({ left: 40, bottom: 40, top: 15 })

    }
    .width('100%')
    .height('100%')
    .backgroundColor('#FFFFFF')

    // .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP, SafeAreaEdge.BOTTOM])
  }
}

// 天气选择对话框
@CustomDialog
struct WeatherDialog {
  ctrl: CustomDialogController
  @Link weather: string

  build() {
    Grid(){
      GridItem(){
        Column({space:6}){
          Image('/images/sun.png')
            .width(22)
          Text('晴')
            .fontSize(WriteDiary.BASE_FONT_SIZE)
        }
        .width('100%')
        .height('100%')
        .justifyContent(FlexAlign.Center)
        .onClick(_=>{
          this.weather = '晴'
          this.ctrl.close()
        })
      }
      GridItem(){
        Column({space:6}){
          Image('/images/cloud.png')
            .width(22)
          Text('多云')
            .fontSize(WriteDiary.BASE_FONT_SIZE)
        }
        .width('100%')
        .height('100%')
        .justifyContent(FlexAlign.Center)
        .onClick(_=>{
          this.weather = '多云'
          this.ctrl.close()
        })
      }
      GridItem(){
        Column({space:6}){
          Image('/images/overcast.png')
            .width(22)
          Text('阴')
            .fontSize(WriteDiary.BASE_FONT_SIZE)
        }
        .width('100%')
        .height('100%')
        .justifyContent(FlexAlign.Center)
        .onClick(_=>{
          this.weather = '阴'
          this.ctrl.close()
        })
      }
      GridItem(){
        Column({space:6}){
          Image('/images/rain.png')
            .width(22)
          Text('雨')
            .fontSize(WriteDiary.BASE_FONT_SIZE)
        }
        .width('100%')
        .height('100%')
        .justifyContent(FlexAlign.Center)
        .onClick(_=>{
          this.weather = '雨'
          this.ctrl.close()
        })
      }
      GridItem(){
        Column({space:6}){
          Image('/images/snow.png')
            .width(22)
          Text('雪')
            .fontSize(WriteDiary.BASE_FONT_SIZE)
        }
        .width('100%')
        .height('100%')
        .justifyContent(FlexAlign.Center)
        .onClick(_=>{
          this.weather = '雪'
          this.ctrl.close()
        })
      }
      GridItem(){
        Column({space:6}){
          Image('/images/frost.png')
            .width(22)
          Text('霜冻')
            .fontSize(WriteDiary.BASE_FONT_SIZE)
        }
        .width('100%')
        .height('100%')
        .justifyContent(FlexAlign.Center)
        .onClick(_=>{
          this.weather = '霜冻'
          this.ctrl.close()
        })
      }
      GridItem(){
        Column({space:6}){
          Image('/images/thunder.png')
            .width(22)
          Text('雷')
            .fontSize(WriteDiary.BASE_FONT_SIZE)
        }
        .width('100%')
        .height('100%')
        .justifyContent(FlexAlign.Center)
        .onClick(_=>{
          this.weather = '雷'
          this.ctrl.close()
        })
      }
      GridItem(){
        Column({space:6}){
          Image('/images/thunderrain.png')
            .width(22)
          Text('雷雨')
            .fontSize(WriteDiary.BASE_FONT_SIZE)
        }
        .width('100%')
        .height('100%')
        .justifyContent(FlexAlign.Center)
        .onClick(_=>{
          this.weather = '雷雨'
          this.ctrl.close()
        })
      }
      GridItem(){
        Column({space:6}){
          Image('/images/fog.png')
            .width(22)
          Text('雾')
            .fontSize(WriteDiary.BASE_FONT_SIZE)
        }
        .width('100%')
        .height('100%')
        .justifyContent(FlexAlign.Center)
        .onClick(_=>{
          this.weather = '雾'
          this.ctrl.close()
        })
      }
      GridItem(){
        Column({space:6}){
          Image('/images/wind.png')
            .width(22)
          Text('风')
            .fontSize(WriteDiary.BASE_FONT_SIZE)
        }
        .width('100%')
        .height('100%')
        .justifyContent(FlexAlign.Center)
        .onClick(_=>{
          this.weather = '风'
          this.ctrl.close()
        })
      }
      GridItem(){
        Column({space:6}){
          Image('/images/sunrise.png')
            .width(22)
          Text('日出')
            .fontSize(WriteDiary.BASE_FONT_SIZE)
        }
        .width('100%')
        .height('100%')
        .justifyContent(FlexAlign.Center)
        .onClick(_=>{
          this.weather = '日出'
          this.ctrl.close()
        })
      }
      GridItem(){
        Column({space:6}){
          Image('/images/sunset.png')
            .width(22)
          Text('日落')
            .fontSize(WriteDiary.BASE_FONT_SIZE)
        }
        .width('100%')
        .height('100%')
        .justifyContent(FlexAlign.Center)
        .onClick(_=>{
          this.weather = '日落'
          this.ctrl.close()
        })
      }
    }
    .columnsTemplate('1fr 1fr 1fr 1fr')
    .rowsTemplate('1fr 1fr 1fr')
  }
}

// 心情选择对话框
@CustomDialog
struct MoodDialog {
  ctrl: CustomDialogController
  @Link mood: string
  build() {
    Grid(){
      GridItem(){
        Column({space:6}){
          Image('/images/happy.png')
            .width(22)
          Text('开心')
            .fontSize(WriteDiary.BASE_FONT_SIZE)
        }
        .width('100%')
        .height('100%')
        .justifyContent(FlexAlign.Center)
        .onClick(_=>{
          this.mood = '开心'
          this.ctrl.close()
        })
      }
      GridItem(){
        Column({space:6}){
          Image('/images/sad.png')
            .width(22)
          Text('伤心')
            .fontSize(WriteDiary.BASE_FONT_SIZE)
        }
        .width('100%')
        .height('100%')
        .justifyContent(FlexAlign.Center)
        .onClick(_=>{
          this.mood = '伤心'
          this.ctrl.close()
        })
      }
      GridItem(){
        Column({space:6}){
          Image('/images/wannacry.png')
            .width(22)
          Text('想哭')
            .fontSize(WriteDiary.BASE_FONT_SIZE)
        }
        .width('100%')
        .height('100%')
        .justifyContent(FlexAlign.Center)
        .onClick(_=>{
          this.mood = '想哭'
          this.ctrl.close()
        })
      }
      GridItem(){
        Column({space:6}){
          Image('/images/excited.png')
            .width(22)
          Text('兴奋')
            .fontSize(WriteDiary.BASE_FONT_SIZE)
        }
        .width('100%')
        .height('100%')
        .justifyContent(FlexAlign.Center)
        .onClick(_=>{
          this.mood = '兴奋'
          this.ctrl.close()
        })
      }
      GridItem(){
        Column({space:6}){
          Image('/images/speechless.png')
            .width(22)
          Text('无语')
            .fontSize(WriteDiary.BASE_FONT_SIZE)
        }
        .width('100%')
        .height('100%')
        .justifyContent(FlexAlign.Center)
        .onClick(_=>{
          this.mood = '无语'
          this.ctrl.close()
        })
      }
      GridItem(){
        Column({space:6}){
          Image('/images/angry.png')
            .width(22)
          Text('愤怒')
            .fontSize(WriteDiary.BASE_FONT_SIZE)
        }
        .width('100%')
        .height('100%')
        .justifyContent(FlexAlign.Center)
        .onClick(_=>{
          this.mood = '愤怒'
          this.ctrl.close()
        })
      }
      GridItem(){
        Column({space:6}){
          Image('/images/frightened.png')
            .width(22)
          Text('惊吓')
            .fontSize(WriteDiary.BASE_FONT_SIZE)
        }
        .width('100%')
        .height('100%')
        .justifyContent(FlexAlign.Center)
        .onClick(_=>{
          this.mood = '惊吓'
          this.ctrl.close()
        })
      }
      GridItem(){
        Column({space:6}){
          Image('/images/expected.png')
            .width(22)
          Text('期待')
            .fontSize(WriteDiary.BASE_FONT_SIZE)
        }
        .width('100%')
        .height('100%')
        .justifyContent(FlexAlign.Center)
        .onClick(_=>{
          this.mood = '期待'
          this.ctrl.close()
        })
      }
      GridItem(){
        Column({space:6}){
          Image('/images/melancholy.png')
            .width(22)
          Text('惆怅')
            .fontSize(WriteDiary.BASE_FONT_SIZE)
        }
        .width('100%')
        .height('100%')
        .justifyContent(FlexAlign.Center)
        .onClick(_=>{
          this.mood = '惆怅'
          this.ctrl.close()
        })
      }
      GridItem(){
        Column({space:6}){
          Image('/images/shocked.png')
            .width(22)
          Text('裂开')
            .fontSize(WriteDiary.BASE_FONT_SIZE)
        }
        .width('100%')
        .height('100%')
        .justifyContent(FlexAlign.Center)
        .onClick(_=>{
          this.mood = '裂开'
          this.ctrl.close()
        })
      }
      GridItem(){
        Column({space:6}){
          Image('/images/daze.png')
            .width(22)
          Text('发呆')
            .fontSize(WriteDiary.BASE_FONT_SIZE)
        }
        .width('100%')
        .height('100%')
        .justifyContent(FlexAlign.Center)
        .onClick(_=>{
          this.mood = '发呆'
          this.ctrl.close()
        })
      }
      GridItem(){
        Column({space:6}){
          Image('/images/emo.png')
            .width(22)
          Text('emo')
            .fontSize(WriteDiary.BASE_FONT_SIZE)
        }
        .width('100%')
        .height('100%')
        .justifyContent(FlexAlign.Center)
        .onClick(_=>{
          this.mood = 'emo'
          this.ctrl.close()
        })
      }
    }
    .rowsTemplate('1fr 1fr 1fr')
    .columnsTemplate('1fr 1fr 1fr 1fr')
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2334804.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

el-tree 实现树形菜单子级取消选中后父级选中效果不变

背景 在复杂的企业级管理系统中,树形菜单是一种常见的数据展示和交互组件。传统的树形菜单通常存在以下交互局限: 子节点取消选中时,父节点会自动取消选中无法满足复杂的权限分配和数据筛选场景实际应用场景: 组织架构权限管理多层级资源分配复杂的数据筛选与展示实现需求…

Java虚拟机——JVM(Java Virtual Machine)解析一

1.JVM是什么&#xff1f; 1.1 JVM概念 Java Virtual Machine (JVM) 是JDK的核心组件之一&#xff0c;它使得 Java 程序能够在任何支持 JVM 的设备或操作系统上运行&#xff0c;而无需修改源代码 JDK是什么&#xff0c;JDK和JVM是什么关系&#xff1f;1.Java IDE(Integrated …

【源码】SpringMvc源码分析

文章目录 SpringMVC 基础回顾​核心组件源码分析​DispatcherServlet​HandlerMapping​HandlerAdapter​ViewResolver​ 请求处理流程源码解析​ 在当今的 Java Web 开发领域&#xff0c;SpringMVC 无疑是最为广泛应用的 Web 框架之一。它以其强大的功能、灵活的配置以及高度的…

tcp特点+TCP的状态转换图+time_wait详解

tcp特点TCP的状态转换图time wait详解 目录 一、tcp特点解释 1.1 面向连接 1.1.1 连接建立——三次握手 1.1.2 连接释放——四次挥手 1.2 可靠的 1.2.1 应答确认 1.2.2 超时重传 1.2.3 乱序重排 1.2.4 去重 1.2.5 滑动窗口进行流量控制 1.3 流失服务&#xff08;字节…

高支模自动化监测解决方案

1.行业现状 高大模板支撑系统在浇筑施工过程中&#xff0c;诸多重大安全风险点进行实时自动化安全监测的解决方案主要监测由于顶杆失稳、扣件失效、承压过大等引起的支撑轴力、模板沉降、相对位移、支撑体系倾斜等参数变化。系统采用无线自动组网、高频连续采样&#xff0c;实时…

OpenCV 图形API(24)图像滤波-----双边滤波函数bilateralFilter()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 应用双边滤波到图像。 该函数对输入图像应用双边滤波&#xff0c;如 http://www.dai.ed.ac.uk/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Fil…

HarmonyOS中的多线程并发机制

目录 多线程并发1. 多线程并发概述2 多线程并发模型3 TaskPool简介4 Worker简介4.1 Woker注意事项4.2 Woker基本用法示例 5. TaskPool和Worker的对比5.1 实现特点对比5.2 适用场景对比 多线程并发 1. 多线程并发概述 并发模型是用来实现不同应用场景中并发任务的编程模型&…

【随手笔记】QT避坑一(串口readyRead信号不产生)

问题描述&#xff1a; 使用QT5.15.2版本 测试串口readyRead绑定槽函数&#xff0c;接收到数据后 不能触发 试了很多网友的程序&#xff0c;他们的发布版本可以&#xff0c;但是源码我编译后就不能触发&#xff0c;判断不是代码的问题 看到有人提到QT版本的问题&#xff0c;于…

【产品】ToB产品需求分析

需求分析流程 合格产品经理 帮助用户、引导用户、分析需求、判断需求、设计方案 不能苛求用户提出合理、严谨的需求&#xff0c;这不是用户的责任和义务&#xff0c;而应该通过自己的专业能力来完成需求的采集工作 #mermaid-svg-ASu8vocank48X6FI {font-family:"trebuche…

驱动开发硬核特训 · Day 10 (理论上篇):设备模型 ≈ 运行时的适配器机制

&#x1f50d; B站相应的视屏教程&#xff1a; &#x1f4cc; 内核&#xff1a;博文视频 - 总线驱动模型实战全解析 敬请关注&#xff0c;记得标为原始粉丝。 在 Linux 驱动开发中&#xff0c;设备模型&#xff08;Device Model&#xff09;是理解驱动架构的核心。而从软件工程…

flutter 打包mac程序 dmg教程

✅ 前提条件 ✅ 你已经在 macOS 上安装了 Android Studio Flutter SDK。 ✅ Flutter 支持 macOS 构建。 运行下面命令确认是否支持&#xff1a; Plain Text bash 复制编辑 flutter doctor ---## &#x1f9f1; 第一步&#xff1a;启用 macOS 支持如果是新项目&#xff0c;…

【数据结构与算法】——堆(补充)

前言 上一篇文章讲解了堆的概念和堆排序&#xff0c;本文是对堆的内容补充 主要包括&#xff1a;堆排序的时间复杂度、TOP 这里写目录标题 前言正文堆排序的时间复杂度TOP-K 正文 堆排序的时间复杂度 前文提到&#xff0c;利用堆的思想完成的堆排序的代码如下&#xff08;包…

atypica.AI:用「语言模型」为「主观世界」建模

人们不是在处理概率&#xff0c;而是在处理故事。 —— 丹尼尔卡尼曼 People dont choose between things, they choose between descriptions of things. —— Daniel Kahneman 商业研究是一门理解人类决策的学问。人并不只是根据纯粹理性做决策&#xff0c;而是受到叙事、情…

LLaMA-Factory双卡4090微调DeepSeek-R1-Distill-Qwen-14B医学领域

unsloth单卡4090微调DeepSeek-R1-Distill-Qwen-14B医学领域后&#xff0c;跑通一下多卡微调。 1&#xff0c;准备2卡RTX 4090 2&#xff0c;准备数据集 医学领域 pip install -U huggingface_hub export HF_ENDPOINThttps://hf-mirror.com huggingface-cli download --resum…

【WPF】自定义控件:ShellEditControl-同列单元格编辑支持文本框、下拉框和弹窗

需要实现表格同一列&#xff0c;单元格可以使用文本框直接输入编辑、下拉框选择和弹窗&#xff0c;文本框只能输入数字&#xff0c;弹窗中的数据是若干位的二进制值。 本文提供了两种实现单元格编辑状态下&#xff0c;不同编辑控件的方法&#xff1a; 1、DataTrigger控制控件的…

Seq2Seq - GRU补充讲解

nn.GRU 是 PyTorch 中实现门控循环单元&#xff08;Gated Recurrent Unit, GRU&#xff09;的模块。GRU 是一种循环神经网络&#xff08;RNN&#xff09;的变体&#xff0c;用于处理序列数据&#xff0c;能够更好地捕捉长距离依赖关系。 ⭐重点掌握输入输出部分输入张量&#…

从零开始学Python游戏编程19-游戏循环模式1

在《从零开始学Python游戏编程18-函数3》中提到&#xff0c;可以对游戏代码进行重构&#xff0c;把某些代码写入函数中&#xff0c;主程序再调用这些函数&#xff0c;这样使得代码程序更容易理解和维护。游戏循环模式实际上也是把代码写入到若干个函数中&#xff0c;通过循环的…

Java获取终端设备信息工具类

在很多场景中需要获取到终端设备的一些硬件信息等&#xff0c;获取的字段如下&#xff1a; 返回参数 参数含义备注systemName系统名称remoteIp公网iplocalIp本地ip取IPV4macmac地址去掉地址中的"-“或”:"进行记录cpuSerialcpu序列号hardSerial硬盘序列号drive盘符…

【Linux网络与网络编程】08.传输层协议 UDP

传输层协议负责将数据从发送端传输到接收端。 一、再谈端口号 端口号标识了一个主机上进行通信的不同的应用程序。在 TCP/IP 协议中&#xff0c;用 "源IP"&#xff0c;"源端口号"&#xff0c;"目的 IP"&#xff0c;"目的端口号"&…

没音响没耳机,把台式电脑声音播放到手机上

第一步&#xff0c;电脑端下载安装e2eSoft VSC虚拟声卡&#xff08;安装完成后关闭&#xff0c;不要点击和设置&#xff09; 第二步&#xff0c;电脑端下载安装&#xff08;SoundWire Server&#xff09;&#xff08;安装完成后不要关闭&#xff0c;保持默认配置&#xff09; 第…