【鸿蒙开发教程】HarmonyOS 开发中角落里的小知识 —— AvoidArea

一、前言

根据研究机构Counterpoint Research发布的最新数据,2024年第一季度,鸿蒙OS份额由去年一季度的8%上涨至17%,iOS份额则从20%下降至16%。

这意味着,华为鸿蒙OS在中国市场的份额超越苹果iOS,已成中国第二大操作系统

随着鸿蒙市场份额的不断提升,相应的岗位也会迎来一个爆发式的增长。这对于想要换赛道的程序员来说是一个非常好的消息,话说大家最近有想法转型鸿蒙开发吗?

这篇文章主要是讲一讲鸿蒙开发的一个小知识AvoidArea

在探索 HarmonyOS 的过程中,我们发现了许多有趣且实用的功能和特性。有些总是在不经意间或者触类旁通的找到。其中,AvoidArea 是窗口内容需要规避区域,也是我们在处理沉浸式、全屏时遇到的。
该系列将着重分享、介绍HarmonyOS API11+的新版本特性或者奇奇怪怪的解决方案、BUG。(弃用API非必要不提及)

二、沉浸式

和窗口相关的API几乎都在@ohos.window模块下,直接使用window.setWindowLayoutFullScreen(true)即可获得一个沉浸式效果。此时布局不避让状态栏与导航栏,组件与其重叠。

一般而言你可以在任何地方使用await window.getLastWindow(getContext())来获得当前的window对象,subwindow不在此列。当然它也有对应的callback写法(但是,是await不好用吗?)

 import { BusinessError } from '@ohos.base';
 ​
 let isLayoutFullScreen = true;
 try {
   let promise = windowClass.setWindowLayoutFullScreen(isLayoutFullScreen);
   promise.then(() => {
     console.info('Succeeded in setting the window layout to full-screen mode.');
   }).catch((err: BusinessError) => {
     console.error('Failed to set the window layout to full-screen mode. Cause:' + JSON.stringify(err));
   });
 } catch (exception) {
   console.error('Failed to set the window layout to full-screen mode. Cause:' + JSON.stringify(exception));
 }

三、全屏

全屏一般是指隐藏NavigationBar和StatusBar,使用setWindowSystemBarEnable,传入一个空的数组。就可以获得一个光溜溜的界面了。(此时自带沉浸式,毕竟沉浸的地方都没了)

 let win = await window.getLastWindow(getContext())
 win.setWindowSystemBarEnable([])

目前该方法接收一个数组对象,setWindowSystemBarEnable(names: Array<‘status’ | ‘navigation’>),不显示哪个,就不传入哪个便好。
还有一个API,用于单独控制,而且多了一个导航条的控制,但是其表现在API12上,完全不符合预期。所以不做赘述

 win.setSpecificSystemBarEnabled("status",false)
 win.setSpecificSystemBarEnabled("navigation",false)
 win.setSpecificSystemBarEnabled("navigationIndicator",true)

四、AvoidArea

这是正主了,往往沉浸式的时候,需要去处理组件被系统栏盖住的情况。此时你可以使用getWindowAvoidArea(type: AvoidAreaType): AvoidArea

 let type = window.AvoidAreaType.TYPE_SYSTEM;
 try {
   let avoidArea = windowClass.getWindowAvoidArea(type);
 } catch (exception) {
   console.error('Failed to obtain the area. Cause:' + JSON.stringify(exception));
 }

在这里插入图片描述

可以看到,接收5种类型。其中TYPE_NAVIGATION_INDICATOR是为了解决,沉浸式的时候,获取TYPE_SYSTEM底部规避区域高度为0的BUG,而诞生的新Type。

AvoidArea是一个拥有4个Rect的容器。
在这里插入图片描述

值得注意的是:

●底部手势区域中非导航条区域支持点击、长按事件透传,不支持拖入。
●左右侧边手势区域支持点击、长按以及上下滑动事件透传,不支持拖入。
●导航条区域支持长按、点击、拖入事件响应,不支持事件向下透传。

有时候,规避区域是会变化的,监听一下就好了。反过来off解除。

 try {
   windowClass.on('avoidAreaChange', (data) => {
     console.info('Succeeded in enabling the listener for system avoid area changes. type:' +
     JSON.stringify(data.type) + ', area: ' + JSON.stringify(data.area));
   });
 } catch (exception) {
   console.error('Failed to enable the listener for system avoid area changes. Cause: ' + JSON.stringify(exception));
 }

五、expandSafeArea

这个API是在做自定义键盘面板的时候发现的。实际上它完全可以用来做沉浸式,而且更加的方便,只在加了的地方生效,而不像window直接生效在整个页面。

使用起来也很简单,直接在根组件(任意组件都行)

 build() {
     Column() {
         Column() {
            
         }
         .width('100%')
         .height('100%')
     }
     .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.BOTTOM,SafeAreaEdge.TOP])
     .backgroundColor(Color.Orange)
     .size({ width: '100%', height: '100%' })
 }

此时,和window.setWindowLayoutFullScreen(true)的效果是一模一样的。
哦,这个要API 11。

写在最后

有很多小伙伴不知道该从哪里开始学习鸿蒙开发技术?也不知道鸿蒙开发的知识点重点掌握的又有哪些?自学时频繁踩坑,导致浪费大量时间。结果还是一知半解。所以有一份实用的鸿蒙(HarmonyOS NEXT)全栈开发资料用来跟着学习是非常有必要的。

这份鸿蒙(HarmonyOS NEXT)资料包含了鸿蒙开发必掌握的核心知识要点,内容包含了

最新鸿蒙全栈开发学习线路在这里插入图片描述

鸿蒙HarmonyOS开发教学视频

在这里插入图片描述
在这里插入图片描述

大厂面试真题

在这里插入图片描述

在这里插入图片描述

鸿蒙OpenHarmony源码剖析

在这里插入图片描述

这份资料能帮住各位小伙伴理清自己的学习思路,更加快捷有效的掌握鸿蒙开发的各种知识。有需要的小伙伴自行领取,,先到先得~无套路领取!!

获取这份完整版高清学习路线,请点击→鸿蒙全栈开发学习资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值