问题背景

目前单框架上的亮度调节接口是绑定在window上,而非具体页面上,如果一个页面A调节了亮度,在页面A返回后,如果没有做恢复操作,跳转/返回到页面B后,还会保持该亮度,导致页面亮度和预期可能不符,针对该背景,总结了三类应用场景:

场景一(调整亮度页面退出后其他页面仍为系统亮度)

如上图,每次进入和退出页面都恢复到系统默认亮度。

关键解决方法(通过UIObserver实现页面跳转监听)

uiObserver.on('navDestinationUpdate', (info)=>{})

当页面使用Navigation进行路由跳转时,可使用observer.on('navDestinationUpdate')来实现路由页面声明周期的监听,并进行做统一处理。

实现方案

1、通过自定义函数ResetBrightness将亮度设置成默认值,实际调用windowClass.setWindowBrightness(-1)将亮度设置成系统默认亮度,如果要设置具体亮度,可以自行添加入参(0到1)。

// 抽出公共能力代码
import { window } from '@kit.ArkUI';

// 重置亮度到默认值
export function ResetBrightness() {
  window.getLastWindow(getContext(), (err, windowClass) => {
    const errCode = err.code;
    if (errCode) {
      console.log('window:', JSON.stringify(err))
      return;
    }
    // 设置默认亮度
    windowClass.setWindowBrightness(-1);
  })
}

2、在onWindowStageCreate中通过uiObserver监听navDestinationUpdate事件,并在状态uiObserver.NavDestinationState.ON\_WILL\_HIDE(页面隐藏)时触发。

onWindowStageCreate(windowStage: window.WindowStage): void {
  // Main window is created, set main page for this ability
  windowStage.loadContent('pages/Index', (err) => {
    if (err.code) {
      hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
      return;
    }
    hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.');
  });
  // 使用uiObserver监听navDestinationUpdate事件
  uiObserver.on('navDestinationUpdate', (info) => {
    // 监听ON_WILL_HIDE状态,如果想过滤特定页面,可以使用info.name来进行过滤
    if (info.state == uiObserver.NavDestinationState.ON_WILL_HIDE) {
      // 重置亮度到默认值
      ResetBrightness();
    }
  });
}

场景二(页面进入后,自动调节成页面之前保存的亮度)

实现方案

1、保存每个页面的亮度(如果页面有设置的情况下)到存储对象中,比如AppStorage。

2、在页面ON\_WILL\_SHOW中增加亮度恢复逻辑(如果有保存指定页面的亮度,则主动设置成该亮度,否则设置成默认亮度即可)。

// 同2.2中第二部分,使用uiObserver监听navDestinationUpdate事件
uiObserver.on('navDestinationUpdate', (info) => {
  // 监听ON_WILL_SHOW状态,如果想过滤特定页面,可以使用info.name来进行过滤
  if (info.state == uiObserver.NavDestinationState.ON_WILL_SHOW && info.name == '页面B') {
    // 恢复之前亮度
    ResetPreBrightness();
  }
})

场景三(页面进入后,自动调节成确定值(最高)亮度)

同场景一,如上图只需要在ON\_WILL\_SHOW状态中,手动设置成最亮即可,注意需要在ON\_WILL\_HIDE时恢复默认亮度,针对特定页面可以在uiObserver中通过info.name判断页面(比如二维码收付款页面)。

// 使用uiObserver监听navDestinationUpdate事件
uiObserver.on('navDestinationUpdate', (info) => {
  // 监听ON_WILL_HIDE状态,如果想过滤特定页面,可以使用info.name来进行过滤
  if (info.state == uiObserver.NavDestinationState.ON_WILL_HIDE) {
    // 重置亮度到默认值
    ResetBrightness();
  }
  if (info.state == uiObserver.NavDestinationState.ON_WILL_SHOW && info.name == '页面B') {
    // 调整最大亮度
    SetMaxBrightness();
  }
});

HarmonyOS码上奇行
6.7k 声望2.7k 粉丝