讨论广场 问答详情
Open Harmony开机动画不同显示策略分别可应用于什么场景
好苦瓜 2025-02-11 16:02:53
115 评论 分享

鸿蒙开机动画于24年4月有如下链接和截图主要逻辑提交改动,对应修改日志为“boot animation support double screen”,改动增加了三种显示策略,compatible、associative、independent,依照配置控制变量isCompatible_, isMultiDisPlay结果,进而根据上述变量和配置动画资源数量选择不同的策略。

问题1: 开机动画不同显示策略分别可应用于什么场景?

    自行理解逻辑如下,

     其中配置json文件中不存在变量“screen_config”,则isCompatible_为true,可以理解为兼容老版本,选择策略compatible, 确保老版本动画资源和配置能正常播放。

    若存在变量“screen_config”,则可以配置‘multi_display’变量,此处不太理解该变量的实际含义,配置为true和false分别对应什么场景, 同时并未找到相关配置了样例,screen_config可支持配置多屏,理解为不同屏幕配置不同的资源。

   下述Get_BootType接口中依据参数选择不同策略,其中isMultiDisplay_ 为真或动画资源仅配置1个则选择independent独立显示策略。否则选择associative结合显示策略。
    if (isMultiDisplay_ || animationConfigs_.size() == 1) {
        return BootStrategyType::INDEPENDENT;
    }
    return BootStrategyType::ASSOCIATIVE;

此处大致想了下,结合实际对应策略的代码,理解如下

independent显示策略,显示时n个屏有n个对应的资源,资源与屏幕id1对1,n>=1, 配置了多少个资源,对应的屏幕会显示独立显示对应的资源

associative显示策略,从代码上理解,会先获取默认屏幕id和活跃屏幕id,并且只会在活跃屏幕上显示,其他屏幕选择屏幕状态关闭。可以配置多个资源,但是只会匹配得到活跃屏幕所在配置资源,并在这单一屏幕上进行显示。但是无法将此策略与“associative”名字联系起来,不理解此处配置多个资源的意义,是否是因为“活跃屏幕”可能依据其他参数在每次开机时不一样。

有理解不对的地方求大佬指点!!!

 

 

https://gitee.com/ZhuGangQiang/graphic_graphic_2d/commit/209aac96b98a5a4237bf411d7740de3a43f9dde5

115 评论 分享
写回答
全部评论(5)
2 楼

开机动画的显示策略在OpenHarmony中主要用于支持多屏设备的不同场景。以下是针对你提到的三种显示策略的解释:

  1. Compatible(兼容模式): 当配置文件中不存在screen_config变量时,或者设置为true,这个策略确保了向后兼容性。这意味着系统会使用老版本的动画资源和配置,即使在支持多屏的新设备上运行,也能保证基础动画正常播放。

  2. Associative(关联模式): 当存在screen_config变量且multi_display为false时,或者当动画资源数量大于1但只有一个屏幕是活跃的(通过isMultiDisplay_判断),系统会选择关联显示策略。在这种情况下,动画资源会匹配到当前活动屏幕,并仅在该屏幕上播放。这意味着多个屏幕中,只有一个是实际参与动画展示的,其他可能处于关闭状态。

  3. Independent(独立模式): 当multi_display为true或者动画资源数量等于屏幕数量时,系统会选择独立显示策略。在这种模式下,每个屏幕都有自己的动画资源,确保每个屏幕都能独立播放其对应的动画内容。这意味着每个屏幕都会根据配置的资源进行单独的动画展示。

1
2025-02-11 16:29:55
2025-02-11 17:36:38
引用:“从逻辑上看,INDEPENDENT可以支持单屏和多屏。ASSOCIATIVE和activeScreenId_相关,当前只有折叠屏使用。”
好的,谢谢
2025-02-11 17:36:38
2025-02-11 17:32:12
引用:“好的,感谢解惑。对于关联模式和独立模式使用场景已经了解。 对于系统在模式选择上您的解释还有点疑问 关于系统在选择关联模式还是独立模式还有点疑问。 if (isMultiDisplay_ || animationConfigs_.size() == 1) { return BootStrategyType::INDEPENDENT; } return BootStrategyType::ASSOCI”
从逻辑上看,INDEPENDENT可以支持单屏和多屏。ASSOCIATIVE和activeScreenId_相关,当前只有折叠屏使用。
2025-02-11 17:32:12
2025-02-11 17:26:14
好的,感谢解惑。对于关联模式和独立模式使用场景已经了解。 对于系统在模式选择上您的解释还有点疑问 关于系统在选择关联模式还是独立模式还有点疑问。 if (isMultiDisplay_ || animationConfigs_.size() == 1) { return BootStrategyType::INDEPENDENT; } return BootStrategyType::ASSOCIATIVE; 1. 关联模式选择 回答中解释为 {当存在screen_config变量且multi_display为false时} 或者 {当动画资源数量大于1但只有一个屏幕是活跃的(通过isMultiDisplay_判断)} 从代码中理解如下 第一,isMultiDisplay_来源解析json文件中的multi_display 第二,选择关联模式的条件应该是 {isMultiDisplay_即multi_display为false}且{动画资源数量大于1} 第三,选择模式时并未去查看活跃屏幕数量,仅在各个显示策略中有相关活跃屏幕代码 所以您的解释中条件中的"或者"、"但只有一个屏幕是活跃的(通过isMultiDisplay_判断"能否再确定一下是这样解释的吗? 2. 独立模式选择 回答中解释为 {当multi_display为true或者动画资源数量等于屏幕数量时} 从代码中理解如下 第一,选择独立模式的条件应该是 {isMultiDisplay_为true}或{动画资源数量等于1} 第二,并未看到关于逻辑"动画资源数量等于屏幕数量"的对比 第三,逻辑中如为何还要或上{动画资源数量等于1}?这种场景对应{isMultiDisplay_为false}且{动画资源数量等于1}则选择独立模式,是担心没有这个逻辑的话,这种配置会进入关联模式不显示开机动画吗(活跃屏幕id与单个动画资源屏幕id不匹配时)?
2025-02-11 17:26:14
1 楼
void RSScreenManager::HandleSensorData(float angle)
{
    std::unique_lock<std::mutex> lock(activeScreenIdAssignedMutex_);
    FoldState foldState = TransferAngleToScreenState(angle);
    if (foldState == FoldState::FOLDED) {
        activeScreenId_ = externalScreenId_;
    } else {
        activeScreenId_ = innerScreenId_;
    }
    isPostureSensorDataHandled_ = true;
    HgmCore::Instance().SetActiveScreenId(activeScreenId_);
    activeScreenIdAssignedCV_.notify_one();
}

从代码上看,这只是为了区分折叠屏的内屏和扩展屏。

2025-02-11 16:29:14