首页 > 其他分享 >海思NativeUI界面添加

海思NativeUI界面添加

时间:2023-10-20 20:11:29浏览次数:31  
标签:container GetInstance void nullptr SleepDetailPresenter SleepDetailView 界面 海思 Na

1 NativeAbilityFwk框架

  对于hi3321芯片的brandy sdk而言,ui的开发是基于NativeAbilityFwk应用框架;

  NativeAbilityFwk是基于穿戴产品的特点从鸿蒙原生Native中裁剪定制的轻量级UI;

  该框架后续另起一文叙述,本文我们先基于代码,讲述添加界面的完整步骤;

2 sliceID定义

  添加页面的时候,为待添加页面在AppViewId中定义一个id;

//AppViewIDs.h
typedef enum : uint16_t {
    VIEW_INVALID = 0,
    VIEW_MAIN = 1,
    //...
    VIEW_MAX_INTER_APP,
} AppViewId;

3 slice信息添加

  添加页面的时候,需要将slice信息记录到NativeLauncher中,NativeLauncher将slice信息添加到NativeAbility中管理;

  3.1 NativeAbilityFwk的入口函数

    添加页面的时候,这部分不需要修改;

    这部分是程序ui入口执行的逻辑流,不写出来感觉逻辑不清晰;

//NativeAbility.cpp
void NativeAbility::InstallAbility(void){
    // 注册nativeability到AMS
    InstallNativeAbility(nullptr, this);
    // 初始化Launcher;
    NativeLauncher::GetInstance().InitNativeLauncher();
    return;
}

//NativeLauncher.cpp
void NativeLauncher::InitNativeLauncher() {
    GraphicStartUp::InitFontEngine(MEM_POOL_UI_FONT, MEM_POOL_UI_FONT_SIZE,\
                                   OHOS::VECTOR_FONT_DIR, DEFAULT_VECTOR_FONT_FILENAME);
    // 初始化所有预加载slice
    InitBtHeadsetEvent(); 
    //cae:把每个initSlices函数都调用了一遍,把创建的实例和ID对应上
    InitAllNativeSlices();    
    CallerLogModel::GetInstance()->InitPhoneService();
    PresenterTask::GetInstance()->Init();
    PlayersModel::GetInstance()->AudioInit();
    ActivityModel::GetInstance()->Init();
    ScreenModels::GetInstance()->InitCardConfig();
    VocassistModel::GetInstance()->Init();
    HeartModel::GetInstance()->Init();
    BluetoothModel::GetInstance()->Init();
    // 初始化默认首页
    ScreenModels::GetInstance()->PreLoadAppimages();
    NativeAbility::GetInstance().SetDefaultSliceId(VIEW_MAIN_SAMPLE);
}

void NativeLauncher::InitAllNativeSlices(void){
    uint16_t size = sizeof(SLICE_MAPPER) / sizeof(SLICE_MAPPER[0]);
    for (int index = 0; index < size; index++) {
        
        if ((SLICE_MAPPER[index].id >= VIEW_MAX_INTER_APP))   continue;
        //cae:将SLICE_MAPPER[]中的每个地址以函数指针的形式调用;
        ( this->*(SLICE_MAPPER[index].func) )();
    }
    return;
}

  3.2 slice的地址映射

    添加页面的时候,为页面添加对应的数组成员、slice初始化函数;

    这个slice的初始化函数声明、xxView.h、xxPresenter.h也要添加到NativeLauncher.h文件中

//NativeLauncher.cpp
struct AppViewMapper{
    AppViewId id;
    void (NativeLauncher::*func)(void);
};
 
static const AppViewMapper SLICE_MAPPER[] = {
    {VIEW_MAIN,     &NativeLauncher::InitMainSlice},
    {VIEW_SETTING,  &NativeLauncher::InitSettingSlice},
    //...
    //ps: static const data;   
};

//所以那些界面id和界面方法是在这里对应起来的;
//这个函数在哪里调用的呢?在前面初始化所有slice的时候,以函数指针的形式调用的;
void NativeLauncher::InitMainSlice(void){
    //分配内存存储一个带有xx属性的slice
    SliceProxy *mainSlice = new AbilitySliceProxy<MainView, MainPresenter>;
    if (mainSlice != nullptr) {
        //将其同界面ID对应起来,添加到NativeAbility;
        NativeAbility::GetInstance().AddSliceProxy(VIEW_MAIN, mainSlice);
    }
}

  3.3 slice字符串ID的地址映射

    添加页面的时候,为页面添加对应的字符串ID;

//NativeLauncher.cpp  感觉作用不大,先放着,毕竟NativeLauncher.cpp中也没多少内容;
struct ViewIdToString{
    AppViewId id;
    char idForUikit[256];
};

static const ViewIdToString VIEW_MAPPER[] = {
    {VIEW_MAIN,     "main"},
    {VIEW_SETTING,  "setting"},
    //...
    //ps: static const data;
};

 4 slice页面构建

  使用mvp框架来构建slice页面;框架原理详见Sparta OpenHarmony Native Slice开发用户指南;

  这些mvp模块,更应该将其理解为是一种属性和结构;只有创建了他们的存储实例化后,才是具体的对象;(重要)

  4.1 model模块

    用于获取数据;目前只是创建页面,暂时不用先放着;  

   4.2 presenter模块

    用于处理页面监听,数据交互;

#ifndef SLEEPDETAIL_PRESENTER_H
#define SLEEPDETAIL_PRESENTER_H

#include "Presenter.h"

#include "SleepDetailView.h"

namespace OHOS
{
    class SleepDetailView;
	
    class SleepDetailPresenter : public Presenter<SleepDetailView>,
                                 public UIView::OnClickListener,
                                 public UIView::OnDragListener
    {
    public:
        SleepDetailPresenter();
        virtual ~SleepDetailPresenter();

        void OnStart() override;  
        void OnPause() override;  
        void OnResume() override; 
        void OnStop() override;   

        static SleepDetailPresenter *GetInstance();     

    private:
        //因为继承了OnClickListener,所以有OnClick属性,至于参数,原函数也这样直接继承;
        bool OnClick(UIView &view, const ClickEvent &event) override; 
        bool OnDrag(UIView &view, const DragEvent &event) override;   
    };
} //namespace OHOS


#endif  //SLEEPDETAIL_PRESENTER_H
#include "AppViewIDs.h"
#include "NativeAbility.h"

#include "SleepDetailPresenter.h"

namespace OHOS{

    //当前Presenter属性实例化的内存指针
    static SleepDetailPresenter *g_pSleepDetailPresenter = nullptr; 
    
    SleepDetailPresenter::SleepDetailPresenter(){
		
        g_pSleepDetailPresenter = this;
    }

    SleepDetailPresenter::~SleepDetailPresenter(){
    
        g_pSleepDetailPresenter = nullptr;
    }

    SleepDetailPresenter *SleepDetailPresenter::GetInstance(){
    
        return g_pSleepDetailPresenter;
    }

    void SleepDetailPresenter::OnStart(){
    
        Presenter<SleepDetailView>::OnStart(); 
    }

    void SleepDetailPresenter::OnPause(void){
    
        Presenter<SleepDetailView>::OnPause();
    }

    void SleepDetailPresenter::OnResume(void){
    
        Presenter<SleepDetailView>::OnResume();
    }

    void SleepDetailPresenter::OnStop(void){
    
        Presenter<SleepDetailView>::OnStop(); 
    }

    bool SleepDetailPresenter::OnDrag(UIView &view, const DragEvent &event){
    
        if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT)
        {
            NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);
        }
        return true;
    }

    bool SleepDetailPresenter::OnClick(UIView &view, const ClickEvent &event){
    
        // 根据控件id查找是哪个控件触发了点击回调
        // if (strcmp(view.GetViewId(), 控件ID) == 0)
        return true;
    }
}

  4.3 view模块

    用于视图构建和显示;

#ifndef SLEEPDETAIL_VIEW_H
#define SLEEPDETAIL_VIEW_H

#include "BaseView.h"
#include "View.h"

#include "components/ui_view_group.h"
#include "components/ui_label.h"
#include "components/ui_image_view.h"

namespace OHOS
{
    class SleepDetailPresenter;
    class SleepDetailView : public View<SleepDetailPresenter>{ 

    public:
        SleepDetailView();                         
        virtual ~SleepDetailView();                 
        static SleepDetailView *GetInstance(void);  

        void OnStart() override;        
        void OnSetUpView() override;    
        void OnTearDownView() override; 
        void OnStop() override;         
    
    private:
        UIView::OnDragListener *draglistener{nullptr}; 

        void InitImage(void);
        void InitLable(void);
		
        //以下控件属性通过new实例化后,add到对应root属性上;
        UIViewGroup *container_ = nullptr;  //container属性指针   
        UILabel *titleLabel{nullptr};       //label属性指针
        UIImageView *icon{nullptr};         //image属性指针
    };
} //namespace OHOS
#endif	//SLEEPDETAIL_PRESENTER_H
#include "SleepDetailView.h"
#include "SleepDetailPresenter.h"

#include "common/image_cache_manager.h"
#include "UiConfig.h"
#include "ui_resource_image.h"


namespace OHOS{

    static SleepDetailView *g_pSleepDetailView{nullptr}; 

    SleepDetailView::SleepDetailView(){
		
        g_pSleepDetailView = this;
    }

    SleepDetailView::~SleepDetailView(){
    
        container_->RemoveAll();
        delete container_;
        container_ = nullptr;

        if (titleLabel != nullptr){
        }
        if (icon != nullptr){
            delete icon;
            icon = nullptr;
        }
        g_pSleepDetailView = nullptr;
    }
	
    SleepDetailView *SleepDetailView::GetInstance(){
    
        return g_pSleepDetailView;
    }

    void SleepDetailView::InitLable(){

        //label属性 new
        titleLabel = new UILabel();
		
        //label属性 扩展
        titleLabel->SetPosition(62, 288, 369, 200);
        titleLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30U);
        titleLabel->SetText("No record.wear watch to monitor sleep quality.");
        titleLabel->SetStyle(STYLE_TEXT_COLOR, Color::Gray().full);
		
        //label属性 add
        container_->Add(titleLabel);
    }

    void SleepDetailView::InitImage(){
        //image属性 new
        icon = new UIImageView();
		
        //image属性 扩展
        ImageInfo *imageInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes(SSLEEP_SCREMINDSLEEP_396X292, SSLEEP);
        if (imageInfo == nullptr){
            return;
        }
        icon->SetPosition(35, 17, 396, 292);
        icon->SetSrc(imageInfo);
		
        //image属性 add
        container_->Add(icon);
    }

    void SleepDetailView::OnStart(){

        //container_容器属性 new
        container_ = new UIViewGroup();
        if (container_ == nullptr){
            return;
        }

        //container_容器属性 扩展
        container_->SetPosition(0, 0);
        container_->SetWidth(Screen::GetInstance().GetWidth());
        container_->SetHeight(Screen::GetInstance().GetHeight());
        
        draglistener = static_cast<UIView::OnDragListener *>(SleepDetailPresenter::GetInstance());
        if (draglistener == nullptr){
            return;
        }
        container_->SetOnDragListener(draglistener);
        container_->SetTouchable(true); 
        container_->SetDraggable(true); 
        
        InitImage();
        InitLable();

        //container_容器属性 add
        RootView::GetInstance()->Add(container_); 

        //label、image >> container_    ;
        //container_   >> 当前RootView   ;
    }

    void SleepDetailView::OnSetUpView(){
    
        View<SleepDetailPresenter>::OnSetUpView();
        Draw();
    }

    void SleepDetailView::OnTearDownView(){
    
        View<SleepDetailPresenter>::OnTearDownView();
        return;
    }

    void SleepDetailView::OnStop(){
    
        View<SleepDetailPresenter>::OnStop();
        RootView::GetInstance()->RemoveAll();
        return;
    }
}

5 CmakeList增加

  在对应目录下的cmakelist中添加xx.cpp路径,以及头文件路径;

  如果编译有报错,改一下报错;页面添加流程至此完成;

标签:container,GetInstance,void,nullptr,SleepDetailPresenter,SleepDetailView,界面,海思,Na
From: https://www.cnblogs.com/caesura-k/p/17756987.html

相关文章

  • 泛微emessage管理界面存在任意文件读取漏洞2023
    漏洞简介泛微emessage管理界面存在任意文件读取漏洞隐患,攻击者可通过此漏洞获取敏感信息,为下一步攻击做准备。漏洞复现fofa语法:icon_hash="-1477694668"登录页面如下:POC:POST/HTTP/1.1Host:User-Agent:Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.......
  • Burp Suite 插件开发之UI界面——以Button举例
    Guide不管是什么软件,大多是需要UI界面的。BurpSuite的插件开发也不例外,某些场景下也需要配合UI界面才能更好操作插件的功能。UI界面的开发,无法是学习各种组件的使用方法,根据它们的使用特点去编写特定的事件函数。由于组件都是前人都写好的,我们只管拿过来使用即可,主要是熟悉组......
  • 界面组件DevExpress WPF v23.1 - 全面升级文档处理功能
    DevExpressWPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpressWPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。无论是Office办公软件的衍伸产品,还是以数据为中心......
  • 视频监控/安防监控平台EasyCVR(3.4.0)界面更新大曝光,速来抢先看!
    视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同,支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频监控平台EasyCVR拓展性强,视频能力丰富,具体可实现视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务......
  • 视频监控/安防监控平台EasyCVR(V.3.4.0)界面更新大曝光,速来抢先看!
    视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同,支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频监控平台EasyCVR拓展性强,视频能力丰富,具体可实现视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务......
  • 连接html界面和数据库
    1.建立java项目。2.右击项目名称添加框架支持3.在web下面建立HTML4.配置tomcat后,点击编辑配置,部署工件后,将url结尾更改为项目名称,部署最下面应用程序上下文改成/5.右击文件,点击项目结构,选择模块,选择依赖,加号添加上mysql驱动器 ......
  • ubuntu禁用图形界面
    1,查询默认的启动级别:systemctrlget-default2,设置命令行模式:systemctrlset-defaultmulti-user.target3,设置图形模式:systemctlset-defaultgraphical.target ......
  • 树叶识别系统python+Django网页界面+TensorFlow+算法模型+数据集+图像识别分类
    一、介绍树叶识别系统。使用Python作为主要编程语言开发,通过收集常见的6中树叶('广玉兰','杜鹃','梧桐','樟叶','芭蕉','银杏')图片作为数据集,然后使用TensorFlow搭建ResNet50算法网络模型,通过对数据集进行处理后进行模型迭代训练,得到一个识别精度较高的H5模型文件。并基于Dja......
  • 手撕Vue-数据驱动界面改变下
    经过上一篇的介绍,已经实现了观察者模式的基本内容,接下来要完成的就是将上一篇的发布订阅模式运用到Nue中,实现数据驱动界面改变。在监听数据变化的章节当中,根据指定的区域和数据去编译渲染界面这个步骤处,我写了一个注释,这个注释是这样的:第一步:给外界传入的所有数据都添加get/se......
  • UE4 C++关联蓝图界面(仅显示)
    使用的自带第三人称c++模板,UE4.27实现教程参考:UE5虚幻引擎C++【第六期】实现UMG控件_哔哩哔哩_bilibili1.创建一个蓝图界面控件,设置好布局2.找到项目代码xx(项目名称).build.cs文件1)添加UMG及后续部分,使得可以调用蓝图模块相关内容PublicDependencyModuleNames.AddRange(news......