自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

OpenHarmony 源碼解析之圖形子系統(tǒng)(UI)

系統(tǒng)
本文基于OpenHarmony 3.0為基礎(chǔ),講解Graphic子系統(tǒng)的UI。 圖形UI組件實(shí)現(xiàn)了一套系統(tǒng)級(jí)的圖形引擎,該組件為應(yīng)用開(kāi)發(fā)提供UIKit接口,包括了動(dòng)畫(huà)、布局、圖形轉(zhuǎn)換、事件處理,以及豐富的UI組件。

[[441037]]

想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

1 簡(jiǎn)介

本文基于OpenHarmony 3.0為基礎(chǔ),講解Graphic子系統(tǒng)的UI。 圖形UI組件實(shí)現(xiàn)了一套系統(tǒng)級(jí)的圖形引擎,該組件為應(yīng)用開(kāi)發(fā)提供UIKit接口,包括了動(dòng)畫(huà)、布局、圖形轉(zhuǎn)換、事件處理,以及豐富的UI組件。組件內(nèi)部直接調(diào)用HAL接口,或者使用WMS(Window Manager Service)提供的客戶(hù)端與硬件交互,以完成事件響應(yīng)、圖像繪制等操作。目前只看到在L1有使用。

1.1 圖形子系統(tǒng)相關(guān)

  • 《OpenHarmony 源碼解析之圖形子系統(tǒng) (一)》
  • 《OpenHarmony 源碼解析之圖形子系統(tǒng)(UI)》

1.2 OpenHarmony 架構(gòu)圖

#星光計(jì)劃2.0# OpenHarmony 源碼解析之圖形子系統(tǒng)(UI)-鴻蒙HarmonyOS技術(shù)社區(qū)

1.3 圖形子系統(tǒng)架構(gòu)圖

#星光計(jì)劃2.0# OpenHarmony 源碼解析之圖形子系統(tǒng)(UI)-鴻蒙HarmonyOS技術(shù)社區(qū)

2 基礎(chǔ)知識(shí)

2.1 代碼目錄

  1. /foundation/graphic/ui 
  2. ├── frameworks                  # 框架代碼 
  3. │   ├── animator                # 動(dòng)畫(huà)模塊 
  4. │   ├── common                  # 公共模塊 
  5. │   ├── components              # 組件 
  6. │   ├── core                    # ui主流程(渲染、任務(wù)管理等) 
  7. │   ├── default_resource 
  8. │   ├── dfx                     # 維測(cè)功能 
  9. │   ├── dock                    # 驅(qū)動(dòng)適配層 
  10. │   │   └── ohos                # ohos平臺(tái)適配 
  11. │   ├── draw                    # 繪制邏輯 
  12. │   ├── engines                 # 繪制引擎 
  13. │   │   ├── dfb 
  14. │   │   ├── general 
  15. │   │   ├── gpu_vglite 
  16. │   │   └── software_zlite 
  17. │   ├── events                  # 事件 
  18. │   ├── font                    # 字體 
  19. │   ├── imgdecode               # 圖片管理 
  20. │   ├── layout                  # 頁(yè)面布局 
  21. │   ├── themes                  # 主題管理 
  22. │   ├── window                  # 窗口管理適配層 
  23. │   └── window_manager 
  24. │       └── dfb 
  25. ├── interfaces                  # 接口 
  26. │   ├── innerkits               # 模塊間接口 
  27. │   │   └── xxx                 # 子模塊的接口 
  28. │   └── kits                    # 對(duì)外接口 
  29. │       └── xxx                 # 子模塊的接口 
  30. ├── test                        # 測(cè)試代碼 
  31. │   ├── framework 
  32. │   │   ├── include             # 測(cè)試框架頭文件 
  33. │   │   └── src                 # 測(cè)試框架源碼 
  34. │   ├── uitest                  # 顯示效果測(cè)試(可執(zhí)行程序在foundation/graphic/wms/test:sample_ui) 
  35. │   │   └── test_xxx            # 具體UI組件效果測(cè)試 
  36. │   └── unittest                # 單元測(cè)試 
  37. │       └── xxx                 # 具體UI組件單元測(cè)試 
  38. └── tools                       # 測(cè)試和模擬器工具(模擬器工程、資源文件) 
  39.     └── qt                      # QT工程 

2.2 圖形組件一覽

#星光計(jì)劃2.0# OpenHarmony 源碼解析之圖形子系統(tǒng)(UI)-鴻蒙HarmonyOS技術(shù)社區(qū)

3 實(shí)踐

3.1 UI控件效果

具體UI控件效果可以通過(guò)QT Creator運(yùn)行QT工程,效果如下:

#星光計(jì)劃2.0# OpenHarmony 源碼解析之圖形子系統(tǒng)(UI)-鴻蒙HarmonyOS技術(shù)社區(qū)
#星光計(jì)劃2.0# OpenHarmony 源碼解析之圖形子系統(tǒng)(UI)-鴻蒙HarmonyOS技術(shù)社區(qū)

所有UI控件在工程都可以找到效果,通過(guò)查看工程代碼可以了解到各控件的使用方式以及參數(shù)詳情。

3.2 示例

下面我們舉例UIButton解析控件的實(shí)現(xiàn):

構(gòu)造函數(shù)-參數(shù)

  1. UIButton::UIButton() 
  2.     : defaultImgSrc_(nullptr), 
  3.       triggeredImgSrc_(nullptr), 
  4.       currentImgSrc_(ButtonImageSrc::BTN_IMAGE_DEFAULT), 
  5.       imgX_(0), 
  6.       imgY_(0), 
  7.       contentWidth_(0), 
  8.       contentHeight_(0), 
  9.       state_(RELEASED), 
  10.       styleState_(RELEASED), 
  11. #if DEFAULT_ANIMATION 
  12.       enableAnimation_(true), 
  13.       animator_(*this), 
  14. #endif 
  15.       buttonStyleAllocFlag_(false

 設(shè)置Theme

  1. void UIButton::SetupThemeStyles() 
  2.     Theme* theme = ThemeManager::GetInstance().GetCurrent(); 
  3.  
  4.     if (theme == nullptr) { 
  5.         buttonStyles_[RELEASED] = &(StyleDefault::GetButtonReleasedStyle()); 
  6.         buttonStyles_[PRESSED] = &(StyleDefault::GetButtonPressedStyle()); 
  7.         buttonStyles_[INACTIVE] = &(StyleDefault::GetButtonInactiveStyle()); 
  8.     } else { 
  9.         buttonStyles_[RELEASED] = &(theme->GetButtonStyle().released); 
  10.         buttonStyles_[PRESSED] = &(theme->GetButtonStyle().pressed); 
  11.         buttonStyles_[INACTIVE] = &(theme->GetButtonStyle().inactive); 
  12.     } 
  13.     style_ = buttonStyles_[RELEASED]; 

 繪制OnDraw

  1. void UIButton::OnDraw(BufferInfo& gfxDstBuffer, const Rect& invalidatedArea) 
  2.     OpacityType opa = GetMixOpaScale(); 
  3.     BaseGfxEngine::GetInstance()->DrawRect(gfxDstBuffer, GetOrigRect(), invalidatedArea, *buttonStyles_[state_], opa); 
  4.     DrawImg(gfxDstBuffer, invalidatedArea, opa); 

 可以看到需要繪制2個(gè),第一個(gè)通過(guò)繪制引擎繪制點(diǎn)->DrawRect,

  1. void BaseGfxEngine::DrawRect(BufferInfo& dst, 
  2.                              const Rect& rect, 
  3.                              const Rect& dirtyRect, 
  4.                              const Style& style, 
  5.                              OpacityType opacity) 
  6.     DrawRect::Draw(dst, rect, dirtyRect, style, opacity); 

 第2個(gè)繪制圖片->DrawImg

  1. void UIButton::DrawImg(BufferInfo& gfxDstBuffer, const Rect& invalidatedArea, OpacityType opaScale) 
  2.     const Image* image = GetCurImageSrc(); 
  3.     if (image == nullptr) { 
  4.         return
  5.     } 
  6.  
  7.     ImageHeader header = {0}; 
  8.     image->GetHeader(header); 
  9.     Rect coords; 
  10.     Rect viewRect = GetContentRect(); 
  11.     coords.SetLeft(viewRect.GetLeft() + GetImageX()); 
  12.     coords.SetTop(viewRect.GetTop() + GetImageY()); 
  13.     coords.SetWidth(header.width); 
  14.     coords.SetHeight(header.height); 
  15.  
  16.     Rect trunc(invalidatedArea); 
  17.     if (trunc.Intersect(trunc, viewRect)) { 
  18.         image->DrawImage(gfxDstBuffer, coords, trunc, *buttonStyles_[state_], opaScale); 
  19.     } 

 可以發(fā)現(xiàn)最終還是調(diào)用draw目錄下通過(guò)繪制點(diǎn)、線(xiàn)、圖片等等來(lái)進(jìn)行繪制:

#星光計(jì)劃2.0# OpenHarmony 源碼解析之圖形子系統(tǒng)(UI)-鴻蒙HarmonyOS技術(shù)社區(qū)

事件處理

UIButton只重寫(xiě)了OnPressEvent,OnReleaseEvent和OnCancelEvent,增加了動(dòng)畫(huà),具體實(shí)現(xiàn)還是在基類(lèi)UIView,主要使用的函數(shù):

  1. void UIView::InvalidateRect(const Rect& invalidatedArea) 
  2.     if (!visible_) { 
  3.         if (needRedraw_) { 
  4.             needRedraw_ = false
  5.         } else { 
  6.             return
  7.         } 
  8.     } 
  9.  
  10.     Rect trunc(invalidatedArea); 
  11.     bool isIntersect = true
  12.     UIView* par = parent_; 
  13.     UIView* cur = this; 
  14.  
  15.     while (par != nullptr) { 
  16.         if (!par->visible_) { 
  17.             return
  18.         } 
  19.  
  20.         isIntersect = trunc.Intersect(par->GetContentRect(), trunc); 
  21.         if (!isIntersect) { 
  22.             break; 
  23.         } 
  24.  
  25.         cur = par; 
  26.         par = par->parent_; 
  27.     } 
  28.  
  29.     if (isIntersect && (cur->GetViewType() == UI_ROOT_VIEW)) { 
  30.         RootView* rootView = reinterpret_cast<RootView*>(cur); 
  31.         rootView->AddInvalidateRectWithLock(trunc, this); 
  32.     } 

在UIView里面可以發(fā)現(xiàn)還有很多事件比如:OnLongPressEvent,我們可以重寫(xiě)來(lái)自定義效果。

UIView重要函數(shù)說(shuō)明

(1) OnPreDraw——準(zhǔn)備繪制

(2) OnDraw——繪制動(dòng)作

(3) OnPostDraw——能在UI線(xiàn)程繪制

(4) Invalidate——請(qǐng)求重新繪制,有需要更新界面就可以調(diào)用此函數(shù)重新繪制

(5) Scale——縮放事件

(6) Translate——移動(dòng)事件

(7) OnPressEvent等——觸摸事件

還有很多常用的函數(shù),有興趣的同學(xué)可以自行查閱。

4 總結(jié)

到這我們對(duì)UI控件的一個(gè)使用和效果都有了解,底層實(shí)現(xiàn)流程也熟悉。不管是直接繪制還是通過(guò)繪制引擎繪制,最終還是調(diào)用draw目錄下的繪制函數(shù)。自定義控件我們可以繼承現(xiàn)有控件,擴(kuò)展實(shí)現(xiàn)效果,還可以直接繼承基類(lèi)UIView。

想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

 

責(zé)任編輯:jianghua 來(lái)源: 鴻蒙社區(qū)
相關(guān)推薦

2022-01-06 16:17:58

鴻蒙HarmonyOS應(yīng)用

2021-09-18 14:40:37

鴻蒙HarmonyOS應(yīng)用

2021-11-08 15:04:47

鴻蒙HarmonyOS應(yīng)用

2022-02-17 20:57:07

OpenHarmon操作系統(tǒng)鴻蒙

2023-04-12 15:31:11

系統(tǒng)服務(wù)管理鴻蒙

2022-01-10 15:30:11

鴻蒙HarmonyOS應(yīng)用

2022-05-10 11:17:27

電話(huà)子系統(tǒng)數(shù)據(jù)服務(wù)模塊

2021-11-18 10:28:03

鴻蒙HarmonyOS應(yīng)用

2022-05-24 15:46:51

Wi-FiSTA模式

2021-09-13 15:15:18

鴻蒙HarmonyOS應(yīng)用

2023-04-06 09:14:11

多模輸入子系統(tǒng)鴻蒙

2022-01-13 10:11:59

鴻蒙HarmonyOS應(yīng)用

2023-06-28 15:00:02

開(kāi)源鴻蒙輸入系統(tǒng)架構(gòu)

2022-01-20 11:04:31

Linux DRMOpenHarmon鴻蒙

2021-09-17 14:38:58

鴻蒙HarmonyOS應(yīng)用

2022-01-20 14:33:29

openharmonwayland協(xié)議鴻蒙

2022-02-14 14:47:11

SystemUIOpenHarmon鴻蒙

2022-03-18 16:07:04

Graphic子系統(tǒng)鴻蒙

2022-05-17 10:42:36

reboot源碼解析

2013-01-06 13:06:02

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)