openharmony bootanimation
1、开始
bootanimation 是openharmony开机启动动画,也是openharmony图形子系统的一个比较不错的入口点,之前对基础和框架有个大概了解,这章用这个实例做一个把整个流程过一遍。它是一个service,在开机加载service是启动,下面是graphic.rc
service vsync_server /system/bin/vsync_server class weston disabled seclabel u:r:wms_service:s0service bootanimation /system/bin/bootanimation class weston disabled oneshoton weston_start start bootanimation
如下为代码
int main(int argc, const char *argv[]){ const auto &wmi = WindowManager::GetInstance(); auto wret = wmi->Init(); if (wret != WM_OK) { LOG("WindowManager::Init() return %{public}s", WMErrorStr(wret).c_str()); return 1; } std::vector displays; wret = wmi->GetDisplays(displays); if (wret != WM_OK) { LOG("WindowManager::GetDisplays() return %{public}s", WMErrorStr(wret).c_str()); return 1; } if (displays.size() == 0) { LOG("no display, cannot continue"); return 1; } int64_t start = GetNowTime(); if (RawParser::GetInstance()->Parse(displays[0].width, displays[0].height)) { return -1; } LOG("time: %{public}" PRIu64 "", GetNowTime() - start); Main m; auto runner = AppExecFwk::EventRunner::Create(false); auto handler = std::make_shared(runner); handler->PostTask(std::bind(&Main::Init, &m, displays[0].width, displays[0].height)); runner->Run(); return 0;}
大致可以分为三个步骤,
- 准备display
- 解析动画文件
- 画到屏幕
我们按照这三步详细解析一下
2、准备display
const auto &wmi = WindowManager::GetInstance(); auto wret = wmi->Init(); if (wret != WM_OK) { LOG("WindowManager::Init() return %{public}s", WMErrorStr(wret).c_str()); return 1; } std::vector displays; wret = wmi->GetDisplays(displays); if (wret != WM_OK) { LOG("WindowManager::GetDisplays() return %{public}s", WMErrorStr(wret).c_str()); return 1; }
3、解析开机动画
鸿蒙开发者喜欢单例,这个开机动画文件解析真没有必要用单例
if (RawParser::GetInstance()->Parse(displays[0].width, displays[0].height)) { return -1; }
对bootanimation的ss << "/system/etc/bootanimation-" << width << "x" << height << ".raw";文件解析,放进std::vector infos;中
4、画到屏幕
4.1 启动任务
Main m; auto runner = AppExecFwk::EventRunner::Create(false); auto handler = std::make_shared(runner); handler->PostTask(std::bind(&Main::Init, &m, displays[0].width, displays[0].height)); runner->Run();
这个主要启动一个任务,定时刷新页面,接下来一起看看怎么画的
4.2 创建窗口
const auto &wmi = WindowManager::GetInstance(); auto option = WindowOption::Get(); option->SetWindowType(WINDOW_TYPE_NORMAL); option->SetWidth(width); option->SetHeight(height); option->SetX(0); option->SetY(0); auto wret = wmi->CreateWindow(window, option);
WindowManager:窗口管理模块,包括窗口创建、显示隐藏、合成等处理,标准系统Windows使用WindowManagerImpl实现的,看一下客户端流程