当前位置:   article > 正文

HarmonyOS/OpenHarmony应用开发ets仿微信界面

HarmonyOS/OpenHarmony应用开发ets仿微信界面

开发工具:DEV3.1.0,SDK9

前言:

文中的图标或者字体大小可能不匹配,大家学习完之后可以自己调节

界面展示:

编写主界面:

分析:我们上部分红框为内容区,底部绿色框为导航区

我们就可以采用Tabs组件实现效果

  1. //导入组件
  2. import {Message} from './Message'
  3. import {Contacts} from './Contacts'
  4. import {Find} from './Find'
  5. import {My} from './My'
  6. @Entry
  7. @Component
  8. struct Index {
  9. //定义底部导航栏填充的图标
  10. private message_ico:Resource = $r('app.media.my_full')
  11. private contacts_ico:Resource = $r('app.media.contacts_full')
  12. private find_ico:Resource = $r('app.media.find_full')
  13. private my_ico:Resource = $r('app.media.my_full')
  14. //定义底部切换导航栏的索引
  15. @State current_index :number = 0
  16. //微信底部tab函数
  17. @Builder tabBuilder(src:Resource,name:string,index:number,ico:Resource){
  18. Column(){
  19. //底部导航栏的图标
  20. Image(this.current_index == index ? ico : src)
  21. .width(40).height(40)
  22. //底部导航栏的文字
  23. Text(name)
  24. .fontSize(18)
  25. .fontWeight(500)
  26. }.width(60).height(70)
  27. }
  28. build() {
  29. Column(){
  30. //barPosition:BarPosition.End,将Tabs固定在屏幕底部
  31. Tabs({barPosition:BarPosition.End}){
  32. //每一页的内容
  33. TabContent(){
  34. //组件引入
  35. Message()
  36. }.tabBar(this.tabBuilder($r('app.media.message'),'消息',0,this.message_ico))//用上面定义的函数,控制变量
  37. TabContent(){
  38. Contacts()
  39. }.tabBar(this.tabBuilder($r('app.media.contacts'),'通讯录',1,this.contacts_ico))
  40. TabContent(){
  41. Find()
  42. }.tabBar(this.tabBuilder($r('app.media.find'),'发现',2,this.find_ico))
  43. TabContent(){
  44. My()
  45. }.tabBar(this.tabBuilder($r('app.media.my'),'我的',3,this.my_ico))
  46. }
  47. .barWidth('100%').barHeight(70)
  48. //点击导航,切换内容,将索引赋给current_index
  49. .onChange((indexs:number)=>{
  50. this.current_index = indexs
  51. })
  52. }
  53. .width('100%')
  54. .height('100%')
  55. }
  56. }

编写聊天页组件:

  1. //引入数据
  2. import {datas} from '../common/data'
  3. @Component
  4. export struct Message{
  5. build(){
  6. //采用列布局
  7. Column({space:10}){
  8. Row(){//头部区域,可以自己封装成一个组件
  9. Stack(){//通过堆叠容器,能使文字居中,图标在右边显示
  10. Text('微信')
  11. .width('100%')
  12. .lineHeight(40)
  13. .fontSize(28)
  14. .fontWeight(FontWeight.Bold)
  15. .textAlign(TextAlign.Center)
  16. Row({space:20}){
  17. Image($rawfile('images/search.png'))
  18. .width(35).height(35)
  19. Image($rawfile('images/add.png'))
  20. .width(35).height(40)
  21. }.width('100%').justifyContent(FlexAlign.End)//居右靠齐
  22. }
  23. }
  24. .width('100%').backgroundColor("#EDEDED").padding('1%')
  25. //用list容器,如果内容超出高度之后,可以通过滑动展示下面的内容
  26. List(){
  27. ListItem(){
  28. Column() {
  29. //循环数据
  30. ForEach(datas.message, (item) => {
  31. Column() {
  32. Row() {
  33. Image(item.url)
  34. .width(80).height(80).borderRadius(10)
  35. Column() {
  36. Text(item.name)
  37. .fontSize(22)
  38. .fontWeight(800)
  39. Text(item.message)
  40. .fontSize(16)
  41. .fontWeight(400)
  42. }
  43. .width('50%')
  44. .height(80)
  45. .margin({ left: '5%' })
  46. .alignItems(HorizontalAlign.Start)//居左对齐
  47. .justifyContent(FlexAlign.SpaceAround)//felx布局中的SpaceAround
  48. Row() {
  49. Text(item.time)
  50. .fontSize(15)
  51. .fontWeight(300)
  52. }.height(60).alignItems(VerticalAlign.Top)
  53. }.width('100%').padding('1%')
  54. Row(){
  55. Divider()
  56. .strokeWidth(1)//分割线的粗细
  57. .opacity(0.1)//透明度
  58. .width('80%')//定义一个长度,然后从右对齐,实现微信中的分割线
  59. }.width('100%').justifyContent(FlexAlign.End)//将线居右对齐
  60. }
  61. })
  62. }
  63. }
  64. }.layoutWeight(1)//定义了头部之后,下面所有的高度都属于List
  65. }
  66. .width('100%').height('100%')
  67. }
  68. }

编写联系人组件:

  1. import {datas} from '../common/data'
  2. @Component
  3. export struct Contacts{
  4. build(){
  5. Column({space:10}){
  6. Row(){
  7. Stack(){
  8. Text('通讯录')
  9. .width('100%')
  10. .lineHeight(40)
  11. .fontSize(28)
  12. .fontWeight(FontWeight.Bold)
  13. .textAlign(TextAlign.Center)
  14. Row({space:20}){
  15. Image($rawfile('images/search.png'))
  16. .width(35).height(35)
  17. Image($rawfile('images/add.png'))
  18. .width(35).height(40)
  19. }.width('100%').justifyContent(FlexAlign.End)
  20. }
  21. }
  22. .width('100%').backgroundColor("#EDEDED").padding('1%')
  23. List(){
  24. ListItem(){
  25. Column() {
  26. ForEach(datas.contacts, (item, index: number) => {
  27. //通过数据和索引判断,当渲染到其内容的时候,就在上面展示一段文字
  28. if(index == 5||index == 6){
  29. Row(){
  30. //三元表达式判断
  31. Text(index == 5 ? '我的企业及企业联系人' : '我的朋友')
  32. .fontSize(16)
  33. .fontWeight(400)
  34. }.width('100%').justifyContent(FlexAlign.Start).padding('1%')
  35. }
  36. Row() {
  37. Image(item.url)
  38. .width(35).height(35)
  39. Text(item.name)
  40. .fontSize(20)
  41. .margin({ left: '6%' })
  42. }.width('100%').height(50)
  43. .padding({ left: '3%', right: '3%' })
  44. .backgroundColor("#FFFFFF")
  45. .alignItems(VerticalAlign.Center)
  46. Row(){
  47. Divider().strokeWidth(1).opacity(0.1).width('80%')
  48. }.width('100%').justifyContent(FlexAlign.End)
  49. })
  50. }
  51. }
  52. }.layoutWeight(1).backgroundColor("#EDEDED")
  53. }
  54. .width('100%').height('100%')
  55. }
  56. }

编写发现页组件:

  1. import {datas} from '../common/data'
  2. @Component
  3. export struct Find{
  4. build(){
  5. Column({space:10}){
  6. Row(){
  7. Stack(){
  8. Text('发现')
  9. .width('100%')
  10. .lineHeight(40)
  11. .fontSize(28)
  12. .fontWeight(FontWeight.Bold)
  13. .textAlign(TextAlign.Center)
  14. Row({space:20}){
  15. Image($rawfile('images/search.png'))
  16. .width(35).height(35)
  17. Image($rawfile('images/add.png'))
  18. .width(35).height(40)
  19. }.width('100%').justifyContent(FlexAlign.End)
  20. }
  21. }
  22. .width('100%').backgroundColor("#EDEDED").padding('1%')
  23. List(){
  24. ListItem(){
  25. Column() {
  26. ForEach(datas.find, (item, index: number) => {
  27. //如果索引等于这些,那么就实现空行效果
  28. if(index == 1||index == 3||index == 5||index == 7||index == 8||index == 10){
  29. //撑起一个空内容的有宽高的盒子
  30. Text('')
  31. .width('100%')
  32. .height(10)
  33. .margin({top:5})
  34. }
  35. Row() {
  36. Image(item.url)
  37. .width(35).height(35)
  38. Text(item.name)
  39. .fontSize(20)
  40. .margin({ left: '6%' })
  41. Blank()
  42. Text('>')
  43. .fontSize(30)
  44. .fontWeight(300)
  45. }.width('100%').height(50)
  46. .padding({ left: '3%', right: '3%' })
  47. .backgroundColor("#FFFFFF")
  48. .alignItems(VerticalAlign.Center)
  49. Row(){
  50. Divider().strokeWidth(1).opacity(0.1).width('80%')
  51. }.width('100%').justifyContent(FlexAlign.End)
  52. })
  53. }
  54. }
  55. }.layoutWeight(1).backgroundColor("#EDEDED")
  56. }
  57. .width('100%').height('100%')
  58. }
  59. }

编写我的页面组件:

  1. import {datas} from '../common/data'
  2. @Entry
  3. @Component
  4. export struct My{
  5. //定义自己的头像
  6. @State tx:Resource = $rawfile('images/tx1.jpg')
  7. build(){
  8. Column(){
  9. Row(){
  10. Row() {
  11. Image(this.tx)
  12. .width(80).height(80).borderRadius(10)
  13. Column() {
  14. Text('阿顾y')
  15. .fontSize(22)
  16. .fontWeight(900)
  17. Text('微信号:Agu_Vzz')
  18. .fontSize(16)
  19. .fontWeight(300)
  20. }
  21. .width('50%')
  22. .height(80)
  23. .margin({ left: '5%' })
  24. .alignItems(HorizontalAlign.Start)
  25. .justifyContent(FlexAlign.SpaceAround)
  26. Row() {
  27. Text('>')
  28. .fontSize(20)
  29. .fontWeight(300)
  30. }.height(80).alignItems(VerticalAlign.Center)
  31. }.width('100%').padding('1%')
  32. }
  33. .width('100%').layoutWeight(1)//和下面的内容等比例分配高度
  34. Row(){
  35. Column() {
  36. ForEach(datas.my, (item, index: number) => {
  37. if(index == 0||index == 1||index == 5){
  38. Text('')
  39. .width('100%')
  40. .height(10)
  41. .margin({top:5})
  42. }
  43. Row() {
  44. Image(item.url)
  45. .width(35).height(35)
  46. Text(item.name)
  47. .fontSize(20)
  48. .margin({ left: '6%' })
  49. Blank()
  50. Text('>')
  51. .fontSize(20)
  52. .fontWeight(300)
  53. }.width('100%').height(50)
  54. .padding({ left: '3%', right: '3%' })
  55. .backgroundColor("#FFFFFF")
  56. .alignItems(VerticalAlign.Center)
  57. Row(){
  58. Divider().strokeWidth(1).opacity(0.1).width('80%')
  59. }.width('100%').justifyContent(FlexAlign.End)
  60. })
  61. }
  62. }
  63. .width('100%').layoutWeight(3).alignItems(VerticalAlign.Top).backgroundColor("#EDEDED")
  64. }
  65. .width('100%')
  66. .height('100%')
  67. }
  68. }

总结:

文中的数据,图片,以及完整代码在下列链接中,有需要的可以自行下载使用

https://wwi.lanzoup.com/b0cd6b54h
密码:gk15

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/289001?site
推荐阅读
相关标签
  

闽ICP备14008679号