零基礎快速上手HarmonyOS開發2---開發工具使用技巧、Java布局開發指南


繼續接着上一次https://www.cnblogs.com/webor2006/p/15142553.html鴻蒙開發往下學習,在上一次也主要是對鴻蒙系統跟Android系統進行一個對比的認識,那這次,則需要開始接觸開發鴻蒙應用開發時的一些基礎知識了,就像學習Android時,四大組件、UI是必須要過關的一樣。

開發工具使用技巧:

鴻蒙開發時使用的工具是DevEco-Studio對吧,在真正學習鴻蒙相關基礎知識之前,先來對官方的IDE的常用開發技巧有一個整體的了解,由於我機器使用的是MAC,所以其操作是基於MAC版本的,對於其它平台的應該步驟都類似,另外目前我使用的IDE的版本為:

不同版本其功能菜單也不一定相同。

Ability創建:

新建一個工程:

此時,工程結構為:

可以看到既有Java代碼,也有JS代碼,雖說可以根據自己擅長的開發語言來選擇性的來選擇,但是!!!做為一名合格的鴻蒙開發者來說,我覺得應該都要有所了解,就類似於Android中有Java和Kotlin、IOS中有OC和Swift,對於你接手的項目很有可能兩種語言都並存,如果你只熟悉其中一種語言,可想而知是多么的被動,基於它,我感覺鴻蒙開發相比Android開發來說不一定簡單。

創建各種Ability:

其中Page Ability就類似於Android中的Activity,有JS和Java版本的,而Data Ability和Service Ability官方說明為:https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ability-ability-overview-0000000000029852

 

是不是可以這樣理解:Service Ability類似於Android中的Service組件,而Data Ability類似於Android的ContentProvider?其實很多思想都是來自於Android,所以一個Android學鴻蒙也是非常順其自然的,下面則嘗試按着向導創建幾個,看在工程中發生了啥變化。

1、Java版本的Page Ability:

此時工程發現的變化如下【由於我的學習工程被git管理了,所以有新的文件添加都能監聽到】:

其中看到一個比較新鮮的目錄:slice

關於這塊的了解可以參考官網這https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ability-page-switching-0000000000037999,貌似是頁面導航用的,其中在MainAbility2中打開也會用到它:

具體有啥用,之后再說,接下來再看一下config.json的配置變更:

跟Android的Manifest的效果一樣,組件新建了一定要在里面聲明一下,看一下它跟默認的MainAbility的區別就是在這:

2、Data Ability:

在上面也說過它類似於Android的ContentProvider對吧,那咱們看一下它里面的代碼像不像:

簡直不要太像哦~~然后再看一下在配置中的變化:

3、Service Ability:

它類似於Android中的Service對吧,那咱們新建對比着看一下,像不像:

那這個開關有啥用呢?打開就可以知道了,其實就是不同場景的設定:

然后創建看一下:

再看一下config:

總結:

通過創建不同的Ability,可以發現其實它就可以理解成Android的三大組件(Activity、Service、ContentProvider),而跟Android一樣,對於這些組件的創建,是一定要在config中進行配置聲明的。

添加JS Component和JS Page:

對於想通過JS來進行開發的工程中,支持添加新的JS Component和JS Page:

  • JS Component:
    在JS工程中,可以存在多個JS Component,例如js目錄下的default文件夾就是一個Js Component:

    一個JS FA對應一個JS Component,可以獨立編譯、運行和調試。其中啥是JS FA呢?上官網搜一下:

    待未來接觸時再探究,先有一個概念上的了解。

  • JS Page:
    Page是表示JS FA的一個前台頁面,由JS、HTML和CSS文件組成,是Component的最基本單元,構成了JS FA的每一個界面。

注意:輕量級智能穿戴對應的JS工程是只存在一個JS FA,因此,輕量級智能穿戴的JS工程是不允許創建新的JS Component的,那啥是“輕量級智能穿戴工程”呢?其實就是工程配置中的deviceType這里有它:

添加JS Component:

新建:

此時,多出來的文件有:

此時看一下配置的變化:

運行:

接下來咱們來運行看一下效果,為了跟默認的js component區別,咱們更改一下頁面的內容:

然后運行一下:

目前顯示的是默認的js component:

那如果想默認顯示咱們自己新建的js component呢? 此時就需要回到MainAbility中設置如下:

此時再運行:

 

添加JS Page:

新建:

這里看一下新建的文件:

其中有個細節:

此時再看一下config:

運行:

為了能夠加載咱們新建的page2,先更改一下頁面的文案,醒目一點:

然后還需要設置一下:

此時再運行看一下,是否顯示Page2了?

創建Module:

新建Ability Module:

有熟悉Android開發的小伙伴一定知道,如今多Module的開發方式是最為普遍的,也就是:

同樣的,對於鴻蒙工程來說,也是支持新建Module的,如下:

其中Module也跟Android一樣,分為Ability類型【跟Android的Application類型類似】和Library類型的,這里先創建Ability Module:

此時新建的文件有:

新建Library Module:

新建:

新建的文件有:

封裝一個工具類供Module使用:

這里在Library中封裝一個日志輸出的工具類,然后簡單在Module使用一下,其方式跟Android一模一樣,如下:

而由於鴻蒙也是采用gradle來進行項目構建的,所以要在Module中使用這個library也很簡單,依賴一下既可:

然后調用一下:

運行: 

接下來運行一下,由於目前咱們工程有兩個Ability類型的Module了:

而我們調用是在entry module中,所以運行時記得在這塊選擇一下:

其中在運行時,又發現一個細節:

Android 的應用叫APP,華為的應用叫HPP,嗯,不錯。

此時運行時,打開日志查看窗口:

成功調用。

Java布局開發指南:

在對整個開發工具的開發技巧有一定的了解之后,接下來則就是應用開發學習的第一關,學會進行界面布局,像Android經典的四大布局一樣,所以學鴻蒙開發也從界面布局開始。

UI框架概述:

前言:

關於這塊的概述可以參考官網:https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ui-java-overview-0000000000500404,這里為了督促自己詳細閱讀一下它,也為了完整性,當一下搬運工吧,將其貼出來,哪怕照着官網敲一遍文字也是好的,那可能有人會問,這有必要么,純浪費時間浪費表情,每人有每人有學習方式,對我來說,笨人只有笨辦法,總之只要對自己有利無害就成,哪怕是一丁點利也可以。

概述:

應用的Ability在屏幕上將顯示一個用戶界面,該界面用來顯示所有可被用戶查看和交互的內容。

應用中所有的用戶界面元素都是由Component和ComponentContainer對象構成。Component是繪制在屏幕上的一個對象,用戶能與之交互。ComponentContainer是一個用於容納其他Component和ComponentContainer對象的容器。
這里可以看一下具體類:

其中目前下載的sdk木有帶源碼,現在看到的就只是IDE自己反編譯的信息了。

Java UI框架提供了一部分Component和ComponentContainer的具體子類,即創建用戶界面(UI)的各類組件,包括一些常用的組件(比如:文本、按鈕、圖片、列表等)和常用的布局(比如:DirectionalLayout和DependentLayout),這個也可以從系統類繼承體系中來觀察到:

用戶可通過組件進行交互操作,並獲得響應。

所有的UI操作都應該在主線程進行設置【這跟Android一模一樣】。

組件和布局

用戶界面元素統稱為組件,組件根據一定的層級結構進行組合形成布局。組件在未被添加到布局中時,既無法顯示也無法交互,因此一個用戶界面至少包含一個布局。在UI框架中,具體的布局類通常以XXLayout命名,完整的用戶界面是一個布局,用戶界面中的一部分也可以是一個布局。布局中容納Component與ComponentContainer對象。

Component和ComponentContainer

  • Component:提供內容顯示,是界面中所有組件的基類,開發者可以給Component設置事件處理回調來創建一個可交互的組件。Java UI框架提供了一些常用的界面元素,也可稱之為組件,組件一般直接繼承Component或它的子類,如Text、Image等。【可以類比成Android的View】
  • ComponentContainer:作為容器容納Component或ComponentContainer對象,並對它們進行布局。Java UI框架提供了一些標准布局功能的容器,它們繼承自ComponentContainer,一般以“Layout”結尾,如DirectionalLayout、DependentLayout等。【可以類比成Android的ViewGroup】

具體兩者的關系可以參考官方的這么一張圖:

LayoutConfig

每種布局都根據自身特點提供LayoutConfig供子Component設定布局屬性和參數,通過指定布局屬性可以對子Component在布局中的顯示效果進行約束。例如:“width”、“height”是最基本的布局屬性,它們指定了組件的大小。整體印象可以看下圖:

說了這么多,類比一下Android的概念,瞬間秒懂----LayoutParams。

組件樹: 

布局把Component和ComponentContainer以樹狀的層級結構進行組織,這樣的一個布局就稱為組件樹。組件樹的特點是僅有一個根組件,其他組件有且僅有一個父節點,組件之間的關系受到父節點的規則約束。

這就是個純概念,基本上帶UI元素的都有樹的概念,如Flutter。

開發指南:

關於這塊可以參考:https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ui-java-component-layout-overview-0000000000500400

HarmonyOS提供了Ability(可類比成Android的Activity)和AbilitySlice(可類比成Android的Fragment)兩個基礎類。有界面的Ability綁定了系統的Window進行UI展示,且具有生命周期。AbilitySlice主要用於承載Ability的具體邏輯實現和界面UI,是應用顯示、運行和跳轉的最小單元。AbilitySlice通過setUIContent()為界面設置布局。

它的接口聲明為:

 

其實在我們新建的工程中就已經有使用過了:

組件需要進行組合,並添加到界面的布局中。在Java UI框架中,提供了兩種編寫布局的方式【跟Android一樣】:

  • 在代碼中創建布局:用代碼創建Component和ComponentContainer對象,為這些對象設置合適的布局參數和屬性值,並將Component添加到ComponentContainer中,從而創建出完整界面。
  • 在XML中聲明UI布局:按層級結構來描述Component和ComponentContainer的關系,給組件節點設定合適的布局參數和屬性值,代碼中可直接加載生成此布局。

這兩種方式創建出的布局沒有本質差別,在XML中聲明布局,在加載后同樣可在代碼中對該布局進行修改。

組件分類:

根據組件的功能,可以將組件分為布局類、顯示類、交互類三類:

關於這塊的學習就不具體一個個去學了,待之后用到時再現學。

布局單位:

在Android布局元素時,通常的單位使用的是dp、sp對吧,而在HarmonyOS也類似,使用了vp、sp,具體可以參考官網:https://developer.harmonyos.com/cn/docs/design/des-guides/basic-0000001055539104

虛擬像素單位:vp

它與屏幕的像素的關系是1vp約等於160dp屏幕密度設備上的1px,在不同密度的設備之間,HarmonyOS會針對性的轉換設備間對應的實際像素值,關於屏幕密度有哪些可以參考https://developer.harmonyos.com/cn/docs/documentation/doc-references/js-framework-resource-restriction-0000001090332998

表示設備的屏幕密度(單位為dpi),取值如下:

  • ldpi:表示低密度屏幕(~120dpi)(0.75基准密度)
  • mdpi:表示中密度屏幕(~160dpi)(基准密度)
  • hdpi:表示高密度屏幕(~240dpi)(1.5基准密度)
  • xhdpi:表示加高密度屏幕(~320dpi)(2.0基准密度)
  • xxhdpi:表示超超高密度屏幕(~480dpi)(3.0基准密度)
  • xxxhdpi:表示超超超高密度屏幕(~640dpi)(4.0基准密度)

其實這關系跟Android的是一樣的,有想了解Android dp跟sp關系的可以參考https://www.cnblogs.com/webor2006/p/4439323.html

字體像素單位:fp

這個跟Android是一樣的,字體像素(font pixel) 大小默認情況下與 vp 相同,即默認情況下 1 fp = 1vp。如果用戶在設置中選擇了更大的字體,字體的實際顯示大小就會在 vp 的基礎上乘以 scale 系數,即 1 fp = 1 vp * scale。

但是,實際商業APP可能不想讓字體隨着設置的變化而變化,所以,通常對於字體也可以使用vp。

布局實踐:

目標:

接下來,則通過一個很簡單的頁面,分別從代碼角度來xml角度來完成所需的效果,來感受一下和Android的區別,由於最終演練的是一個穿戴設備的小項目,所以這里運行設備改為它:

啟動之后,長這樣:

而咱們演練的效果也非常簡單,就兩個元素:

呃,這也太簡單了吧,是的,先初步感受一下鴻蒙布局既可,為之后的小案例的練習打基礎。

如何通過代碼進行布局?

1、創建項目:

先來創建一個項目,類型選擇穿戴設備:

默認目前是以xml的方式來設置界面布局的:

接下來將其刪掉,改成用純代碼的方式。

2、聲明父布局:

很明顯我們這邊需要一個豎方向的父布局,類似於Android的LinearLayout對吧,在鴻蒙中也有一個類似的布局,叫DirectionalLayout:

3、添加子元素--文本和按鈕:

先來個文本吧:

此時,我得將它添加到父布局了對吧,此時就需要使用到了LayoutConfig【類似於Android的LayoutParams】了,如下:

接下來再添加一個Button:

另外按鈕不是一個圓角背景么,那如何設置呢?如下:

4、給按鈕設置監聽:

接下來給按鈕設置一下監聽:

5、運行:

當然實際對於這么簡單的布局,不可能用純代碼來生成,太麻煩了,這里僅僅就是為了學習而學習,實際用得多的還是下面xml的布局方式。

如何通過xml進行布局?

准備布局:

還是用之前創建工程時的xml布局文件來進行修改:

調整界面,這塊就直接貼出來了,比較簡單【因為我本身就是搞Android滴,所以~~】:

<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    ohos:height="match_parent"
    ohos:width="match_parent"
    ohos:orientation="vertical">

    <Text
        ohos:id="$+id:tv_tips"
        ohos:height="match_content"
        ohos:width="match_content"
        ohos:layout_alignment="horizontal_center"
        ohos:text="count:0"
        ohos:text_size="25vp"
        />

    <Button
        ohos:id="$+id:btn_add"
        ohos:height="match_content"
        ohos:width="match_content"
        ohos:layout_alignment="horizontal_center"
        ohos:padding="5vp"
        ohos:text="Click me"
        ohos:text_size="30vp"
        ohos:top_margin="20vp"/>

</DirectionalLayout>

基本上跟Android寫法沒太大的區別,雖說id的寫法,一些屬性可能不一樣,但!!!你有Android的感覺,再加上IDE的智能提示,寫起來還是非常流暢,其中對於布局的預覽是在這塊:

將其設置到Ability中:

這塊感覺就沒有Android便捷了,我明明布局文件是叫“ability_main.xml”,而在代碼中設置是,開頭變成了“Layout”了,如果以布局文件的文件名來進行輸入又提示不出來,不過這個問題也不大,主要是小白還不熟悉鴻蒙的規則,了解了其實也就很順其自然地能敲出了,另外Android里的資源文件都是生成在R中,而鴻蒙是ResourceTable中,這塊需要熟悉一下。

處理按鈕監聽及按鈕圓角設置:

其實也比較簡單,就是先通過ID找到相關元素進行處理既可,直接貼出代碼:

最后運行效果就一樣了,這里就不再演示。

小結:

不管是代碼布局還是xml布局,是不是如果你了解Android,簡直不要太順暢喲,很多用法基本都能直接類比,所以,如果你熟悉Android,那學鴻蒙應該是很輕松的,當然目前基礎知識才剛起步,可能隨着未來的不斷深入,會有很多跟Android不一樣的,這塊就在未來不斷深入過程中再來感受一下。

總結:

接下來應該再學一學JS UI相關的東東的,但是篇幅有限,下次再繼續,其實在學習鴻蒙時,對於每一個知識其實官方都有提供對應的DEMO案例,比如UI這塊,在這塊就有案例推薦:

而總的DEMO git地址為:https://gitee.com/openharmony/app_samples

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM