> 文档中心 > openharmony bootanimation

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实现的,看一下客户端流程