
鸿蒙开机动画于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

开机动画的显示策略在OpenHarmony中主要用于支持多屏设备的不同场景。以下是针对你提到的三种显示策略的解释:
-
Compatible(兼容模式): 当配置文件中不存在
screen_config
变量时,或者设置为true,这个策略确保了向后兼容性。这意味着系统会使用老版本的动画资源和配置,即使在支持多屏的新设备上运行,也能保证基础动画正常播放。 -
Associative(关联模式): 当存在
screen_config
变量且multi_display
为false时,或者当动画资源数量大于1但只有一个屏幕是活跃的(通过isMultiDisplay_
判断),系统会选择关联显示策略。在这种情况下,动画资源会匹配到当前活动屏幕,并仅在该屏幕上播放。这意味着多个屏幕中,只有一个是实际参与动画展示的,其他可能处于关闭状态。 -
Independent(独立模式): 当
multi_display
为true或者动画资源数量等于屏幕数量时,系统会选择独立显示策略。在这种模式下,每个屏幕都有自己的动画资源,确保每个屏幕都能独立播放其对应的动画内容。这意味着每个屏幕都会根据配置的资源进行单独的动画展示。



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();
}
从代码上看,这只是为了区分折叠屏的内屏和扩展屏。
