1、开始
bootanimation 是openharmony开机启动动画,也是openharmony图形子系统的一个比较不错的入口点,之前对基础和框架有个大概了解,这章用这个实例做一个把整个流程过一遍。它是一个service,在开机加载service是启动,下面是graphic.rc
service vsync_server /system/bin/vsync_server
class weston
disabled
seclabel u:r:wms_service:s0
service bootanimation /system/bin/bootanimation
class weston
disabled
oneshot
on 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<struct WMDisplayInfo> 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<AppExecFwk::EventHandler>(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<struct WMDisplayInfo> 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<struct ZlibInfo> infos;中
4、画到屏幕
4.1 启动任务
Main m;
auto runner = AppExecFwk::EventRunner::Create(false);
auto handler = std::make_shared<AppExecFwk::EventHandler>(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实现的,看一下客户端流程