1、HarmonyOS 可以把App的风格设置成dark模式吗?
可以把App的风格设置成dark模式吗
设置深色模式可参考:https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-dark-mode-adaptation
深色模式(Dark Mode)又称之为暗色模式,是与日常应用使用过程中的浅色模式(Light Mode)相对应的一种UI主题。深色模式最早来源于人机交互领域的研究和实践,该模式并非简单地将页面背景变为黑色,文字内容变为白色,而是提供一整套适配深色模式的应用配色主题。深色模式相较浅色模式更加柔和,能减少亮度对用户眼睛造成的刺激和疲劳,此外深色模式能在一定程度上降低应用功耗,提升续航表现。
应用深色模式适配,需遵循基本的UX设计原则,保障应用页面内容的易读性、舒适性和一致性,具体可参考深色模式设计原则。应用适配过程主要包含字体颜色、元素背景色等颜色资源的适配,媒体资源如图片图标的适配,以及系统状态栏的适配,此外需要对一些特殊情况如使用了Web组件加载的Web页面进行处理。
实现原理
当系统切换到深色模式后,应用内可能会出现部分内容切换到深色主题的情况,例如状态栏、弹窗背景色、系统控件等,会导致应用内页面效果错乱。
为应对上述情况,需要对应用进行深色模式下的内容适配,目前该适配主要依靠资源目录。当系统对应的设置项发生变化后(如系统语言、深浅色模式等),应用会自动加载对应资源目录下的资源文件。
系统为深色模式预留了dark目录,该目录在应用创建时默认不存在,在进行深色模式适配时,需要开发者在src/main/resources中手动地创建出dark目录,将深色模式所需的资源放置到该目录下。对于浅色模式所需的资源,可以放入默认存在的src/main/resources/base目录下。
一般情况下深浅色模式切换不会导致应用界面产生结构上的变化,而是页面结构一致但是采用不同的主题配色、配图等,使得整个应用在切换到深色模式后依然保持自然美观,以下为深色模式适配的UX示例。
在应用进行深色模式适配过程中主要的适配项有颜色资源适配、媒体资源适配、状态栏适配,除此之外若应用内使用了Web组件加载了Web内容,那么还需对Web页面适配深色模式,具体适配方案可点击对应链接跳转到具体章节查看。
目前业内应用向用户提供的深浅色模式切换有以下两种常见方式。
- 应用跟随系统深浅色模式切换:实现上,需要开发者使用setColorMode()方法将ColorMode设置为COLOR_MODE_NOT_SET(未设置颜色模式),然后应用在运行过程中就可以自动感知到系统颜色模式切换,若应用完成了深浅色模式适配,将自动切换到对应的颜色模式。
- 应用内提供手动控制深浅色的开关供用户自行选择:实现上,切换深色模式需要调用setColorMode()方法将ColorMode设置为COLOR_MODE_DARK(深色模式),切换浅色模式需要将ColorMode设置为COLOR_MODE_LIGHT(浅色模式),这样就可以完成对应用深浅色的手动控制。
2、HarmonyOS 在App滑到应用管理窗口的时机有事件回调吗?
在播放视频时,将App滑向手机的应用管理窗口,视频依然播放,无法停止。有没有可以监听App滑动到应用管理窗口的事件。
参考下window窗口的监听事件:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-window-V5#offwindowevent10
demo:
curWindow: window.Window | undefined = undefined;
context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext
async aboutToAppear(): Promise<void> {
if (this.context) {
window.getLastWindow(getContext(this), (err, data) => {
this.curWindow = data
if (this.curWindow) {
this.curWindow.on('windowEvent', (data) => {
console.info('Window event happened. Event:' + JSON.stringify(data));
if (data.toString() == '6') {
this.videoPlayerModel.controller.pause();
}
3、HarmonyOS Refresh可以通过调用方法触发下拉刷新么?
Refresh通过参数refreshing判断当前组件是否正在刷新,可以控制该参数变化来触发下拉刷新
参考文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-container-refresh-V5#ZH-CN_TOPIC_0000001930756929__refreshoptions%E5%AF%B9%E8%B1%A1%E8%AF%B4%E6%98%8E
demo:
// xxx.ets
@Entry
@Component
struct RefreshExample {
@State isRefreshing: boolean = false
@State arr: String[] = ['0', '1', '2', '3', '4','5','6','7','8','9','10']
build() {
Column() {
Button('刷新').onClick(()=>{
this.isRefreshing = true
})
Refresh({ refreshing: $$this.isRefreshing}) {
List() {
ForEach(this.arr, (item: string) => {
ListItem() {
Text('' + item)
.width('100%').height(100).fontSize(16)
.textAlign(TextAlign.Center).borderRadius(10).backgroundColor(0xFFFFFF)
}
}, (item: string) => item)
}
.onScrollIndex((first: number) => {
console.info(first.toString())
})
.width('100%')
.height('100%')
.divider({strokeWidth:1,color:Color.Yellow,startMargin:10,endMargin:10})
.scrollBar(BarState.Off)
}
.onStateChange((refreshStatus: RefreshStatus) => {
console.info('Refresh onStatueChange state is ' + refreshStatus)
})
.onOffsetChange((value: number) => {
console.info('Refresh onOffsetChange offset:' + value)
})
.onRefreshing(() => {
setTimeout(() => {
this.isRefreshing = false
}, 2000)
console.log('onRefreshing test')
})
.backgroundColor(0x89CFF0)
.refreshOffset(64)
.pullToRefresh(true)
}
}
}
4、HarmonyOS Image 组件支持加载缓存吗?
官方 Image 组件支持 在无网络情况下加载缓存图片吗。比如设置 了url 但是无网络情况下能加载出来图片吗
Image组件具有缓存功能,通过设置setImageRawDataCacheSize和setImageCacheCount 来实现,缓存采用内置的LRU策略。 如果设置了缓存,Image组件加载网络图片第一次会读取网络图片,后续在加载图片会从缓存中读取。参考:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-system-app-V5#setimagecachecount7
5、HarmonyOS ArkTS 如何访问沙盒路径?
发送的图片消息本地路径可能是沙盒路径,现在希望用 Image 控件展示这个图片,但是展示不出来
Image组件不能直接传入应用沙箱路径,需要传入应用沙箱uri;
解决方案:拿到文件的沙箱路径后,通过调用@ohos.file.fileuri
模块的fileuri.getUriFromPath(file.path)将沙箱路径转化为沙箱uri,传入之后即可正常显示。this.ImageUri = fileUri.getUriFromPath(ImagePath);
此api参考链接:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-file-fileuri-V5#ZH-CN_TOPIC_0000001884918402__fileurigeturifrompath