首页 > 其他分享 >鸿蒙UI布局实战 —— 个人中心页面开发

鸿蒙UI布局实战 —— 个人中心页面开发

时间:2024-12-08 21:10:55浏览次数:10  
标签:10 鸿蒙 text app float width UI 100% 页面

1、前言

接下里我们将开启“鸿蒙UI布局系列”的学习,第一站:学习线性布局(Row/Column)+ 弹性布局(Flex)

在展开学习前,先上一个实战demo——开发一个个人中心页面,示意图如下:

image.png

其中需要关注的重点知识有:

  1. 如何实现图标按钮左对齐;

  2. 如何实现一个渐变色的圆形头像站位图;

  3. “关于我们”选项中,左侧图标与文字贴合,右侧图标如何保持右对齐;

  4. 底部的“注销登录”按钮如何保持底部对齐。

  5. 如何实现循环渲染控制处理重复的选项;

  6. 如何实现自定义的按压效果(按压“联系客服”效果演示如下);

image.png

2、实现

下面是实现布局的核心代码,看不懂没关系,未来我们将逐步学习。

请持续关注“鸿蒙UI布局开发系列。”

interface SettingItem {
  img: Resource,
  text: Resource,
}

@Entry
@Component
export default struct UserCenter {
  @State settingItems: Array<SettingItem> = [{
    img: $r('app.media.about_us'),
    text: $r('app.string.page_user_center_about_us')
  }, {
    img: $r('app.media.share_app'),
    text: $r('app.string.page_user_center_share_app')
  }, {
    img: $r('app.media.head_set'),
    text: $r('app.string.page_user_center_contact')
  }, {
    img: $r('app.media.update'),
    text: $r('app.string.page_user_center_update')
  }
  ]

  @Builder buildTopBar() {
    Flex({ direction: FlexDirection.RowReverse, alignContent: FlexAlign.Center }) {
      this.buildSettingBtn()
    }
    .width('100%')
    .height(60)
  }

  @Builder buildSettingBtn() {
    Image($r('app.media.settings'))
      .width(40)
      .height(40)
      .margin({
        right: 10,
        left: 10
      })
      .padding(5)
      .borderRadius(10)
      .stateStyles({
        pressed: {
          .backgroundColor($r('app.color.common_pressed_color'))
        },
        normal: {
          .backgroundColor(Color.Transparent)
        }
      })
  }

  @Builder buildUserAvatar() {
    Column() {
      Image('')
        .borderRadius(50)
        .width(100)
        .height(100)
        .alignSelf(ItemAlign.Center)
        .linearGradient({
          angle: '143deg',
          direction: GradientDirection.Bottom,
          colors: [['rgba(146, 224, 255, 0.7)', 0.15], ['#90E2FF', 0.18], ['rgba(246, 144, 255, 0.7)', 0.85]]
        })

      Text('Harmony自习室')
        .alignSelf(ItemAlign.Center)
        .margin({ top: 21 })
        .fontWeight('bold')
        .fontSize(24)
    }.width('100%')
  }

  @Builder buildLogout() {
    Flex() {
      Button($r('app.string.page_user_center_logout'))
        .borderRadius(24)
        .width('100%')
        .backgroundColor('#F9E8EE')
        .fontColor('#E47792')
    }.width('100%')
    .padding({
      left: 52,
      right: 52,
      bottom: 20,
    })
  }

  @Builder buildContentList() {
    Column() {
      ForEach(this.settingItems, (item: SettingItem) => {
        Row() {
          Image(item.img)
            .width($r('app.float.setting_list_icon_size'))
            .height($r('app.float.setting_list_icon_size'))
            .margin({ right: 15 })
          Text(item.text)
            .fontSize($r('app.float.setting_list_icon_size'))
            .lineHeight($r('app.float.setting_list_icon_size'))
            .fontColor('#3D3D3D')
            .fontWeight(500)
          Blank()
          Image($r('app.media.right'))
            .width($r('app.float.setting_list_icon_size'))
            .height($r('app.float.setting_list_icon_size'))
            .alignSelf(ItemAlign.End)
        }.width('100%')
        .padding({ top: 15, bottom: 15, left: 10, right: 10 })
        .margin({top: 10})
        .stateStyles({
          pressed: { .borderRadius(20).backgroundColor($r('app.color.common_pressed_color'))
          },
          normal: { .backgroundColor(Color.Transparent)
          }
        })
      })
    }
    .flexGrow(1)
    .width('100%')
    .padding(10)
  }

  build() {
    Flex({ direction: FlexDirection.Column }) {
      this.buildTopBar();
      this.buildUserAvatar();
      this.buildContentList();
      this.buildLogout();
    }
    .padding({
      top: $r('app.float.default_toolbar_top_padding')
    })
    .height('100%')
  }
}

标签:10,鸿蒙,text,app,float,width,UI,100%,页面
From: https://www.cnblogs.com/harmonyClassRoom/p/18593822

相关文章

  • 鸿蒙UI开发快速入门 —— part10: PersistentStorage与Environment
    1、前言我们在鸿蒙UI开发快速入门——part09:应用级状态管理LocalStorage&AppStorage中已经学习了LocalStorage与AppStorage,但他们都是运行时的内存,在APP退出后所有数据将丢失。如果我们想将一部分状态数据保存下来,让用户在下次进入app时也能恢复之前的现场,那我们就得使用P......
  • 鸿蒙UI开发快速入门 —— part06:组件状态管理之@State装饰器1、说在前面的话 在前五
    这篇文章是关于鸿蒙UI开发中组件状态管理的@State装饰器的介绍。包括引入状态概念构建动态交互界面,@State装饰变量特点,如与组件渲染绑定、私有且特定类型等,以及可观察的变化类型和框架行为。还通过示例介绍了@State变量的初始化流程,最后提及后续将分别介绍其他装饰器。关联......
  • 鸿蒙UI开发快速入门 —— part07:组件状态管理之@Prop/@Link装饰器
    1、前言我们在上一章学习了@State装饰器,@State装饰器的作用范围仅仅在当前组件,接下来,我们讨论如何从父组件中传入参数到子组件,让子组件随着父组件的状态发生变化。本章将要介绍的就是:@Props装饰器。2、@Props装饰器@Prop装饰的变量可以和父组件建立单向的同步关系。@Prop装饰的......
  • AutoConsis:UI内容一致性智能检测5
    可参考美团技术团队1.背景目前,移动App上的业务页面愈发复杂,技术团队常会以页面为单位来拆解团队开发分工,同一类业务元素信息分散在不同团队负责的页面内。在具体的实践中,存在一类不易检出但又影响用户体验的异常:页面中的UI信息相互矛盾(如下图中同一个商品在多个页面上的实际......
  • 鸿蒙UI开发快速入门 —— part09: 应用级状态管理LocalStorage & AppStorage
    1、说在前面的话前面几个章节中介绍的装饰器(@State、@Props、@Link、@Provide、@Consume、@Observed、@ObjectLink)仅能在页面内,即一个组件树上共享状态变量。如果开发者要实现应用级的,或者多个页面的状态数据共享,就需要用到应用级别的状态管理的概念。ArkTS根据不同特性,提供了......
  • 鸿蒙UI开发快速入门 —— part05:组件的样式复用
    1、为什么要样式复用?如果每个组件的样式都需要单独设置,在开发过程中会出现大量代码在进行重复样式设置,虽然可以复制粘贴,但为了代码简洁性和后续方便维护,样式的复用就很有必要了。为此,鸿蒙推出了可以提炼公共样式进行复用的装饰器@Styles;2、@Styles装饰器@Styles装饰器可以将......
  • How to Build and Deploy a Next.js App on Apache Server
    Step1:InstallingNext.jsnpminstall-gyarnmkdir-pv/var/www/project_folder_namecd/var/www/project_folder_nameyarncreatenext-appEditpackage.jsonandreplacethescriptsectionwiththefollowing:"scripts":{"dev":&quo......
  • GoPro Quik App for macOS will be end of life at the end of 2024 All In One
    GoProQuikAppformacOSwillbeendoflifeattheendof2024AllInOnemacOS版GoProQuikApp将于2024年底停用......
  • Build sandboxing disabled due to nsjail error
    如标题所示,这个是在编译AOSP的时候可能会遇到的警告。这个错有两种情况:在Ubuntu24.04上编译根据链接https://groups.google.com/g/android-building/c/DbDKuaIik3M所说,ubuntu24.04上的一些修改,会导致编译时遇到这个错误。临时解法是执行这个命令sudosysctl-wkernel.ap......
  • StringBuilder之GC优化原理
    在C#中,字符串(string)是不可变的(immutable),这意味着一旦创建了一个字符串对象,它的内容就不能被更改。任何对字符串的修改操作(如拼接、替换、截取等)都会生成一个新的字符串对象,而不是在原有字符串上进行修改。这种特性有几个重要的影响:不可变性带来的影响内存分配:每次对字符......