【每日学点HarmonyOS Next知识】黑夜模式、滑到应用管理窗口回调、手动触发Refresh刷新、图片缓存、访问沙盒

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

轻口味

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值