当前位置: 首页 > news >正文

玩Android Harmony next版,通过项目了解harmony项目快速搭建开发

玩Android 纯血鸿蒙版

最近利用一些休息时间,开发了纯血鸿蒙版的玩Android,代码已经提交到gitee,感兴趣的同学可以下载打包使用(文章同步发布到稀土掘金)

仓库地址

wan_android

项目介绍

结合v2版本的状态管理,使用MVVM模式,官方demo可参考:MVVM模式(状态管理V2)

  1. 支持浅色/深色模式(跟随系统)
  2. 支持语言切换(跟随系统)
  3. 支持沉浸式状态栏
  4. 通用的appbar
  5. 支持页面导航路由

相关技术

一、浅色/深色模式

与android配置类似,在resources下创建dark目录,在目录下存放深色模式的颜色&图片等资源。其中base则是浅色使用的资源

在这里插入图片描述

二、语言切换

与android配置类似,在resources下创建en_US目录,在目录下存放en_US等资源。其中base则是默认使用的资源

在这里插入图片描述

三、沉浸式状态栏

目前官方提供两种方式支持沉浸式状态栏:

  1. 窗口全屏布局方案(项目中使用该方案)
// 1. 设置窗口全屏
windowStage.loadContent('pages/Index', (err) => {...let isLayoutFullScreen = true;windowClass.setWindowLayoutFullScreen(isLayoutFullScreen).then(() => {console.info('Succeeded in setting the window layout to full-screen mode.');}).catch((err: BusinessError) => {});});
});// 2. 在Page中通过设置padding避让
export struct BasePage {@Local statusBarHeight: number = 0@Local bottomNavHeight: number = 0aboutToAppear(): void {window.getLastWindow(getContext(this)).then((data) => {let avoidArea1 = data.getWindowAvoidArea(window.AvoidAreaType.TYPE_SYSTEM)this.statusBarHeight = avoidArea1.topRect.heightlet avoidArea2 = data.getWindowAvoidArea(window.AvoidAreaType.TYPE_NAVIGATION_INDICATOR)this.bottomNavHeight = avoidArea2.bottomRect.height}).catch((err: BusinessError) => {})}build() {Column() {if (this.showAppBar) {BassAppBar({appBarColor: this.appBarColor,title: this.titleName,backPress: () => {this.backPress()},appBarActionBuild: this.appBarActionBuild})}this.contentBuild()}.width("100%").height("100%").padding({bottom: this.getUIContext().px2vp(this.bottomNavHeight),top: this.showAppBar ? 0 : this.getUIContext().px2vp(this.statusBarHeight)}).backgroundColor($r('app.color.bg_container_color'))}
}

这里封装了BasePage,结合BaseAppBar,可轻松实现沉浸式状态栏的components

  1. 组件安全区方案(要注意延伸出去的组件是否与状态栏/导航栏相交)
// xxx.ets
@Entry
@Component
struct Example {build() {Column() {Row() {Text('Top Content').fontSize(40).textAlign(TextAlign.Center).width('100%')}.backgroundColor('#2786d9')// 设置顶部绘制延伸到状态栏.expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP])Row() {Text('Display Content 2').fontSize(30)}.backgroundColor(Color.White).padding(20).borderRadius(15).width('80%')Row() {Text('Display Content 3').fontSize(30)}.backgroundColor(Color.White).padding(20).borderRadius(15).width('80%')Row() {Text('Display Content 4').fontSize(30)}.backgroundColor(Color.White).padding(20).borderRadius(15).width('80%')Row() {Text('Display Content 5').fontSize(30)}.backgroundColor(Color.White).padding(20).borderRadius(15).width('80%')Row() {Text('Bottom Content').fontSize(40).textAlign(TextAlign.Center).width('100%')}.backgroundColor('#96dffa')// 设置底部绘制延伸到导航区域.expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.BOTTOM])}.width('100%').height('100%').alignItems(HorizontalAlign.Center).backgroundColor('#d5d5d5').justifyContent(FlexAlign.SpaceBetween)}
}

四、导航路由

HMRouter

比较好用,使用 @HMRouter 标签定义页面,绑定拦截器、生命周期及自定义转场动画

1、全局初始化
export default class EntryAbility extends UIAbility {onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {// 初始化路由管理器HMRouterMgr.init({ context: this.context })HMRouterMgr.openLog("DEBUG")}
}
2. 页面定义
@HMRouter({ pageUrl: AppRoutes.ArticlePage })
@ComponentV2
export default struct ArticlePage {......
}
3. 页面跳转
let commonBrowserModel: CommonBrowserModel = { title: item.title, link: item.link }
RouteManager.toPage({route: AppRoutes.ArticlePage,param: commonBrowserModel
})
4. 页面携带参数获取
async aboutToAppear(): Promise<void> {this.param = RouteManager.getCurrentParam<HotBuzzwordModel>()this.searchViewModel.loadSearchData(this.param?.name ?? "", this.currentPage)
}

项目中对HMRouterMgr进行了二次封装,避免繁琐的调用


export default interface RouteParam {navigationId?: stringroute: stringparam?: ESObjectonResult?: Callback<HMPopInfo>
}export class RouteManager {static toPage(routeParam: RouteParam) {HMRouterMgr.to(routeParam.route).withNavigation(routeParam.navigationId ?? AppRoutes.NavigationId).withParam(routeParam.param).onResult(routeParam.onResult).pushAsync()}static toPageAsync(routeParam: RouteParam): Promise<void> {return HMRouterMgr.to(routeParam.route).withNavigation(routeParam.navigationId ?? AppRoutes.NavigationId).withParam(routeParam.param).onResult(routeParam.onResult).pushAsync()}static back(pathInfo?: HMRouterPathInfo): void {HMRouterMgr.pop(pathInfo);}static backAsync(pathInfo?: HMRouterPathInfo): Promise<void> {return HMRouterMgr.popAsync(pathInfo);}static getCurrentParam<T>(type?: HMParamType): T | null {let param = HMRouterMgr.getCurrentParam(type)try {return param as T} catch (e) {return null}}
}

五、MVVM

@ObservedV2
export default class HomeViewModel {...// banner数据集@Trace banners: Array<BannerModel> = new Array<BannerModel>()async loadBannerData() {get<Array<BannerModel>>({url: "banner/json", response: (response) => {if (response.data != null && response.data.length > 0) {this.banners.push(...response.data)}}, error: (error: AxiosError) => {return Promise.reject(error)}})}...
}// page中使用
@ComponentV2
export struct Home {...// viewmodel@Local homeViewModel: HomeViewModel = new HomeViewModel()aboutToAppear(): void {// 加载数据this.homeViewModel.loadBannerData()}@BuilderheaderLayout() {ListItem() {// 使用数据HomeBanner({ bannerList: this.homeViewModel.banners })}}
}

六、其他功能

以下功能都进行了二次封装,放在common下

  1. 全局事件通知,可以使用系统提供的EventHub
  2. 本地缓存,继续腾讯的mmkv:mmkv
  3. 网络框架,使用axio:axio
http://www.dtcms.com/a/495291.html

相关文章:

  • 公司免费网站域名申请免费网址
  • 华为鲲鹏 Aarch64 环境下多 Oracle 数据库汇聚操作指南 CMP(类 Cloudera CDP 7.3)
  • Chromedriver放项目里就行!Selenium 3 和 4 指定路径方法对比 + 兼容写法
  • Spring Boot 项目, idea 控制台日志设置彩色
  • wap网站建设好不好百度小程序官方收费标准
  • Go语言数据竞争Data Race 问题怎么检测?怎么解决?
  • 作为项目经理,如何做好项目复盘?
  • 网站建设百度不通过杭州建站模板系统
  • A函数里调用B函数 ,且往B函数里传了个二级指针,并在B返回后,释放该指针
  • 茶社网站开发与设计的开题报告自适应网站好建们
  • 做拍福利爱福利视频网站网站建设与维护实训
  • LangGraph学习笔记(一):langgraph安装
  • DFS算法原理及其模板
  • 【小程序】微信小程序点击效果(view、button、navigator)
  • 快速上手 Scrapy:5 分钟创建一个可扩展的爬虫项目
  • 青岛网站设计公司在哪找网店代运营什么意思
  • 数字图像处理-图像增强(2)
  • JPA 用 List 入参在 @Query中报错 unexpected AST node: {vector}
  • 国外网站顶部菜单设计电子商务 网站设计
  • 南城县建设局网站北京vi设计公司哪
  • spark性能优化1:通过依赖关系重组优化Spark性能:宽窄依赖集中处理实践
  • 工程师的烹饪 - 空气炸锅菜谱
  • 如何在腾讯云上建设网站手机必备网站
  • Linux:12.线程同步与互斥
  • 泰安网站建设哪家强wordpress m1
  • el-table中控制单列内容多行超出省略及tooltip
  • 构建企业级跨境电商(Temu)财务数据自动化采集系统
  • B-tree索引像字典查词一样工作?那哪些数据库查询它能加速,哪些不能?
  • C++实现二叉树搜索树
  • 网站开发和美工的区别手机域名注册被骗