【HarmonyOS实战开发】ArkTS仿写微信-通讯录_arkts 通讯录(1)

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数HarmonyOS鸿蒙开发工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年HarmonyOS鸿蒙开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img

img
img
htt

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上HarmonyOS鸿蒙开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注鸿蒙获取)
img

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  {'name':'王富贵1','avtar':'/images/icon3.png'},
  {'name':'王富贵2','avtar':'/images/icon3.png'},
  {'name':'王富贵3','avtar':'/images/icon3.png'},
  {'name':'王富贵4','avtar':'/images/icon3.png'},
  {'name':'王富贵5','avtar':'/images/icon3.png'},
  {'name':'王富贵6','avtar':'/images/icon3.png'},
]},
{'letter':"Z",'data':[
  {'name':'猪头','avtar':'/images/icon1.png'},
  {'name':'猪头1','avtar':'/images/icon1.png'},
  {'name':'猪头2','avtar':'/images/icon1.png'},
  {'name':'猪头3','avtar':'/images/icon1.png'},
  {'name':'猪头4','avtar':'/images/icon1.png'},
  {'name':'猪头5','avtar':'/images/icon1.png'},
  {'name':'猪头6','avtar':'/images/icon1.png'},
  {'name':'猪头7','avtar':'/images/icon1.png'},
  {'name':'猪头8','avtar':'/images/icon1.png'},
  {'name':'猪头9','avtar':'/images/icon1.png'},
  {'name':'猪头10','avtar':'/images/icon1.png'},
  {'name':'猪头11','avtar':'/images/icon1.png'},
  {'name':'猪头12','avtar':'/images/icon1.png'},
]},

]

@State letters: string[] = [‘→’, ‘※’, ‘A’,‘B’,‘C’,‘D’,‘E’,‘F’,‘H’,‘I’,‘G’,‘K’,‘L’,‘M’,‘N’, ‘O’,‘P’,‘Q’,‘R’,‘S’,‘T’,‘U’,‘V’,‘W’,‘X’,‘Y’,‘Z’,‘#’]

@Builder NavigationMenus() { // CustomBuilder类型的菜单栏
Row() {
Image(‘/images/contact_add.png’)
.size({ width: 24, height: 24 })
.margin({ left: 5, top: 16 })
.onClick(()=>{

    })
}.justifyContent(FlexAlign.End)

}

@Builder NavigationTitle() {
Row(){
Text(“通讯录”)
.width(‘100’)
}
.width(‘100%’)
.justifyContent(FlexAlign.Center)
}

@Builder itemHead(text:string) {
Text(text)
.fontSize(14)
.backgroundColor(‘#E6E6E6’)
.width(“120%”)
.padding({
left: 15,
top: 8,
bottom: 8
})
.fontColor(Color.Gray)
.margin({
left: -15,
})
}

private listScroller: Scroller = new Scroller();
@State selectedIndex: number = 0;

@Builder itemEnd(index: number) {
// 侧滑后尾端出现的组件
Button({ type: ButtonType.Circle }) {
Image($r(‘app.media.ic_public_delete_filled’))
.width(20)
.height(20)
.fillColor(Color.Red)
}
.backgroundColor(Color.Transparent)
.padding(12)
.margin({
right: 18
})
.onClick(() => {
// 操作数据/请求后台删除数据;
})
}

build() {
Column() {
Navigation(){
Stack({ alignContent: Alignment.End }){
Column(){
List({ scroller: this.listScroller }){
ListItemGroup() {
ListItem(){
ContactsRow({imagePath:‘/images/contact_0.png’,titleString:‘新的朋友’})
}

            ListItem(){
              ContactsRow({imagePath:'/images/contact_1.png',titleString:'仅聊天的朋友'})
            }

            ListItem(){
              ContactsRow({imagePath:'/images/contact_2.png',titleString:'群聊'})
            }

            ListItem(){
              ContactsRow({imagePath:'/images/contact_3.png',titleString:'标签'})
            }

            ListItem(){
              ContactsRow({imagePath:'/images/contact_4.png',titleString:'公众号'})
            }
          }
          .padding({left:15,right:15})
          .divider({ strokeWidth: 2, color: 'rgb(247,247,247)', startMargin: 60, endMargin: 0 })

          ListItemGroup() {
            ListItem(){
              Column() {
                Column() {
                  Text('我的企业及企业联系人').fontSize(14).fontColor(Color.Gray)
                }
                .backgroundColor('#E6E6E6')
                .width('100%')
                .height(36)
                .padding({
                  left: 15
                })
                .justifyContent(FlexAlign.Center)
                .alignItems(HorizontalAlign.Start)

                ContactsRow({
                  imagePath:'/images/contact_5.png',
                  titleString:'企业微信联系人'
                }).padding({left:15,right:15})
              }
            }
            ListItem(){
              ContactsRow({
                imagePath:'/images/contact_5.png',
                titleString:'企业微信通知',
                count: 36
              }).padding({left:15,right:15})
            }
          }
          .divider({ strokeWidth: 2, color: 'rgb(247,247,247)', startMargin: 60, endMargin: 0 })

          ListItemGroup() {
            ListItem(){
              Column() {
                Column() {
                  Text('星标朋友').fontSize(14).fontColor(Color.Gray)
                }
                .backgroundColor('#E6E6E6')
                .width('100%')
                .height(36)
                .padding({
                  left: 15
                })
                .justifyContent(FlexAlign.Center)
                .alignItems(HorizontalAlign.Start)
              }
            }
            ListItem(){
              ContactsRow({imagePath: $rawfile('start1.jpg'),titleString:'老婆'})
                .padding({left:15,right:15})
            }
            .swipeAction({ end: this.itemEnd.bind(this, 0) })
            ListItem(){
              ContactsRow({imagePath:$rawfile('start2.jpg'),titleString:'大甜'})
                .padding({left:15,right:15})
            }.swipeAction({ end: this.itemEnd.bind(this, 1) })
            ListItem(){
              ContactsRow({imagePath:$rawfile('start3.jpg'),titleString:'大甜'})
                .padding({left:15,right:15})
            }.swipeAction({ end: this.itemEnd.bind(this, 2) })
          }
          .divider({ strokeWidth: 2, color: 'rgb(247,247,247)', startMargin: 60, endMargin: 0 })

          ForEach(this.fList,(item:object,index:number)=>{
            ListItemGroup({header:this.itemHead(item['letter'])}){
              ForEach(item['data'],(p:object,i:number)=>{
                ListItem(){
                  Flex({direction:FlexDirection.Row,alignItems:ItemAlign.Center}){
                    Image(p['avtar'])
                      .width(45)
                      .height(45)
                      .borderRadius(5)
                    Text(p['name'])
                      .fontSize(18)
                      .margin({left:10})
                  }
                  .height(55)
                }
                .onClick(()=>{
                  router.pushUrl({url:'pages/Contact/PersonalPage',params: {
                    person: p
                  }})
                })
              })
            }
            .divider({ strokeWidth: 2, color: 'rgb(247,247,247)', startMargin: 60, endMargin: 0 })
            .padding({left:15,right:15})
            .margin({top:10})
          })

        }
        .divider({ strokeWidth: 2, color: 'rgb(247,247,247)', startMargin: 60, endMargin: 0 }) // 每行之间的分界线
        .margin({top:17})
        .backgroundColor(Color.White)
        .height('100%')
        .onScrollIndex((firstIndex: number) => {
          this.selectedIndex = firstIndex
          console.log('**************', firstIndex);
          if(firstIndex > 2) {
            this.selectedIndex = this.letters.findIndex(i => i === this.fList[firstIndex - 3]['letter'])
          }
          // 根据列表滚动到的索引值,重新计算对应联系人索引栏的位置this.selectedIndex
        })
      }


    AlphabetIndexer({ arrayValue: this.letters, selected: 0 })
      .color(Color.Black)
      .selectedColor(0xFFFFFF) // 选中项文本颜色
      .popupColor(0xFFFAF0) // 弹出框文本颜色
      .selectedBackgroundColor('rgb(1,196,194)') // 选中项背景颜色
      .popupBackground(0xD2B48C) // 弹出框背景颜色
      .usingPopup(true) // 是否显示弹出框
      .selectedFont({ size: 13, weight: FontWeight.Bolder }) // 选中项字体样式
      .popupFont({ size: 30, weight: FontWeight.Bolder }) // 弹出框内容的字体样式
      .itemSize(20) // 每一项的尺寸大小
      .alignStyle(IndexerAlign.Left) // 弹出框在索引条左侧弹出
      .onSelect((index: number) => {
        console.info(this.letters[index] + ' Selected!', index)
        this.listScroller.scrollToIndex(index)
      })
      .onPopupSelect((index: number) => {
        console.info('onPopupSelected:' + index)
      })
      .selected(this.selectedIndex)

  }
  .width('100%')
  .height('100%')
  }
  .title(this.NavigationTitle())
  .mode(NavigationMode.Stack)
  .titleMode(NavigationTitleMode.Mini)
  .hideBackButton(true)
  .menus(this.NavigationMenus())
  .size({ width: '100%', height: '100%' })
  .backgroundColor('rgb(237,237,237)')
}
// .bindMenu(this.MyMenu())
.width('100%')
.height('95%')

}
}

@Component
struct ContactsRow {
imagePath:string | Resource
titleString:string
count?: number

build(){
Flex({direction:FlexDirection.Row,alignItems:ItemAlign.Center}){
Badge({
count: this.count,
position: BadgePosition.RightTop,
style: { badgeSize: 16, badgeColor: ‘#FA2A2D’ }
}) {
Image(this.imagePath)
.width(41)
.height(41)
.borderRadius(3)
}
Text(this.titleString)
.fontSize(18)
.margin({left:10})
}
.height(55)
}
}


#### 扩展:LazyForEach,长列表处理


循环渲染适用于短列表,当构建具有大量列表项的长列表时,如果直接采用循环渲染方式,会一次性加载所有的列表元素,会导致页面启动时间过长,影响用户体验。因此,推荐使用数据懒加载(LazyForEach)方式实现按需迭代加载数据,从而提升列表性能。


当使用懒加载方式渲染列表时,为了更好的列表滚动体验,减少列表滑动时出现白块,List组件提供了cachedCount参数用于设置列表项缓存数,只在懒加载LazyForEach中生效。


具体参考文档:https://docs.openharmony.cn/pages/v4.0/zh-cn/application-dev/quick-start/arkts-rendering-control-lazyforeach.md/



List() {
LazyForEach(this.list, item => {
ListItem() {

}
})
}.cachedCount(3)


最后,有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的**鸿蒙(Harmony NEXT)资料**用来跟着学习是非常有必要的。 


**这份鸿蒙(Harmony NEXT)资料包含了鸿蒙开发必掌握的核心知识要点,内容包含了**(**ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony****多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(Harmony NEXT)**技术知识点。


希望这一份鸿蒙学习资料能够给大家带来帮助,有需要的小伙伴自行领取,**限时开源,先到先得~无套路领取!!**


**如果你是一名有经验的资深Android移动开发、Java开发、前端开发、对鸿蒙感兴趣以及转行人员,可以直接领取这份资料**


**获取这份完整版高清学习路线,请点击→**[纯血版全套鸿蒙HarmonyOS学习资料]( )****


### **鸿蒙(Harmony NEXT)最新学习路线**


**![](https://img-blog.csdnimg.cn/direct/309a2ac95b5d40aa8c0f79885edb295a.png)**


* **HarmonOS基础技能**


![](https://img-blog.csdnimg.cn/direct/72fd2509a44e4bf98bbe1f983b5a4ff6.png)


* **HarmonOS就业必备技能** ![](https://img-blog.csdnimg.cn/direct/18f024bc5f0a4353912996010ed6cc81.png)
* **HarmonOS多媒体技术**


![](https://img-blog.csdnimg.cn/direct/b9ead66dadc245fdadce4d77feb47a28.png)


* **鸿蒙NaPi组件进阶**


![](https://img-blog.csdnimg.cn/direct/0744fbd1454f41b0a3f605fb4a51f5f3.png)


* **HarmonOS高级技能**


![](https://img-blog.csdnimg.cn/direct/743b668910224b259a5ffe804fa6d0db.png)


* **初识HarmonOS内核**![](https://img-blog.csdnimg.cn/direct/9e79fbdc4bb74f179584c5552aa547d5.png)
* **实战就业级设备开发**


![](https://img-blog.csdnimg.cn/direct/d2012fa9c57a400da25a2182a38cbdcb.png)


 有了路线图,怎么能没有学习资料呢,小编也准备了一份联合鸿蒙官方发布笔记整理收纳的一套系统性的**鸿蒙(OpenHarmony )学习手册(共计1236页)**与**鸿蒙(OpenHarmony )开发入门教学视频**,内容包含:**ArkTS、ArkUI、Web开发、应用模型、资源分类…等知识点。**


**获取以上完整版高清学习路线,请点击→[纯血版全套鸿蒙HarmonyOS学习资料]( )**


#### **《鸿蒙 (OpenHarmony)开发入门教学视频》**


![](https://img-blog.csdnimg.cn/direct/ad3cb3acb77e470fa93ac0471d4e7f0f.png)


#### 《鸿蒙生态应用开发V2.0白皮书》


![图片](https://img-blog.csdnimg.cn/img_convert/bf439a395d3ce8e8cf3dee8e8b75e3a9.jpeg)


#### **《鸿蒙 (OpenHarmony)开发基础到实战手册》**


OpenHarmony北向、南向开发环境搭建


![图片](https://img-blog.csdnimg.cn/img_convert/aff76dc1c3c84c360a9ff825908b2e98.png)


#### **《鸿蒙开发基础》**


* ArkTS语言
* 安装DevEco Studio
* 运用你的第一个ArkTS应用
* ArkUI声明式UI开发
* .……


![图片](https://img-blog.csdnimg.cn/img_convert/2b8f290e39e52efb0a5709be96ff82ea.png)


#### **《鸿蒙开发进阶》**


* Stage模型入门
* 网络管理
* 数据管理
* 电话服务
* 分布式应用开发
* 通知与窗口管理
* 多媒体技术
* 安全技能
* 任务管理
* WebGL
* 国际化开发
* 应用测试
* DFX面向未来设计
* 鸿蒙系统移植和裁剪定制
* ……


![图片](https://img-blog.csdnimg.cn/img_convert/06651107041ecdf7d26caed596ac4302.png)


#### **《鸿蒙进阶实战》**


* ArkTS实践
* UIAbility应用
* 网络案例
* ……

用你的第一个ArkTS应用
* ArkUI声明式UI开发
* .……


![图片](https://img-blog.csdnimg.cn/img_convert/2b8f290e39e52efb0a5709be96ff82ea.png)


#### **《鸿蒙开发进阶》**


* Stage模型入门
* 网络管理
* 数据管理
* 电话服务
* 分布式应用开发
* 通知与窗口管理
* 多媒体技术
* 安全技能
* 任务管理
* WebGL
* 国际化开发
* 应用测试
* DFX面向未来设计
* 鸿蒙系统移植和裁剪定制
* ……


![图片](https://img-blog.csdnimg.cn/img_convert/06651107041ecdf7d26caed596ac4302.png)


#### **《鸿蒙进阶实战》**


* ArkTS实践
* UIAbility应用
* 网络案例
* ……

  • 25
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《Netty入门实战: 仿写微信IM即时通讯系统》是一本关于网络编程框架Netty的实践指南。本书以仿写微信IM即时通讯系统为例,通过实际的项目案例引导读者学习和掌握Netty的使用。 Netty是一款基于Java的网络编程框架,提供了高性能、异步、事件驱动的特性。在本书中,作者基于Netty框架,通过分析微信IM即时通讯系统的架构和功能需求,逐步引入Netty的概念和使用方法。 首先,本书介绍了Netty的基本概念和工作原理,解释了Netty的事件驱动模型以及异步IO操作的优势。接着,读者会学习到如何使用Netty构建网络服务器和客户端,以及如何处理网络通信中的数据包、编解码、心跳检测等问题。同时,本书也强调了Netty在高并发情况下的性能优势,示范了如何使用Netty进行性能优化和扩展。 通过跟随本书的实例代码,读者将逐步了解和掌握Netty的各项功能和使用方法。同时,通过仿写微信IM即时通讯系统的实践项目,读者也能够更好地理解Netty框架在实际项目中的应用场景和解决方案。 总而言之,《Netty入门实战: 仿写微信IM即时通讯系统》通过实际案例的方式,帮助读者深入理解Netty框架的使用和原理,并将其应用于实际的项目中。无论是对于新手还是有一定经验的开发者来说,本书都是一个很好的学习和实践指南,能够帮助读者快速入门和提升自己在网络编程领域的技能水平。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值