「本文正在參加星光計劃3.0--夏日挑戰賽」
前言
小夥伴們,木棉花又更新了!
在序言的内容中,筆者向大家展示了數獨小遊戲項目的效果圖。而從這一期開始,我将把此項目的設計思路與相關代碼逐期分享給大家,希望能給學鴻蒙的小夥伴們提供幫助與靈感。
序言内容的傳送門——>> https://ost.51cto.com/posts/12863

正文
在本期的分享中,筆者将介紹如何搭建基礎的頁面架構(為之後的開發做準備),以及應用圖像和标簽的修改、應用的全屏化。
建立新的項目
打開DevEco Studio,建立一個新的Empty Ability,将其命名為project,相關勾選如下:(Device type至少要勾選phone選項)
建立6個新的AbilitySlice
通常情況下,一個應用是包含若幹個AbilitySlice的,每個AbilitySlice都有獨一無二的業務功能,而不同的AbilitySlice由互不幹擾的互動邏輯互相聯系,他們共同組成一個有機的應用架構。我們之是以要建立6個新的AbilitySlice,無疑是因為要搭建整個項目的頁面基礎。
如圖,打開entry>src>main>Java>com.example.project>slice,右擊slice>建立>Java類,然後為這個建立的AbilitySlice命名。因為我們的目的是建立6個新的AbilitySlice,是以本操作執行6次,輸入的名稱分别為——GameAbilitySlice,SelectAbilitySlice,RecordAbilitySlice,HowToPlayAbilitySlice,TeamAbilitySlice,
InitialAbilitySlice。
完成後的效果圖如下:
經過這些操作後,我們就成功建立了6個空白頁面。加上項目自帶的MainAbilitySlice,這個項目一共由七個頁面組成,在之後的内容中,我們會在每個AbilitySlice中寫入不同的功能,并且建立頁面與頁面之間的跳轉路由。這7個頁面之間的頁面路由的概念圖如下:
當然,這張圖看起來很抽象,而這些頁面的具體邏輯關系筆者将在後文詳細闡述。
設計首頁面(MainAbilitySlice)的UI界面
設計Button元件的背景元素
首先,我們需要合理設計Button元件的背景元素,這些我們将通過Graphic檔案來實作。
打開entry>src>main>resource>base>graphic>background_ability_main.xml,将代碼修改為如下:
<?xml version="1.0" encoding="UTF-8" ?>
<shape xmlns:ohos="http://schemas.huawei.com/res/ohos"
ohos:shape="rectangle">
<corners
ohos:radius="120"/> //設定圓角
<stroke
ohos:color="#007CFD"
ohos:width="3vp"/>
<solid
ohos:color="#007CFD"/> //設定背景色
</shape>
然後,打開entry>src>main>resource>base>graphic,右擊graphic>建立>Graphic Resource File,建立一個新的Graphic檔案,并命名為button:
建立完成後,打開這個建立Graphic檔案,将代碼修改為如下:
<?xml version="1.0" encoding="UTF-8" ?>
<shape xmlns:ohos="http://schemas.huawei.com/res/ohos"
ohos:shape="rectangle">
<corners
ohos:radius="120"/> //設定圓角
<stroke
ohos:color="#007CFD"
ohos:width="3vp"/> //設定邊框的厚度與顔色
<solid
ohos:color="white"/> //設定背景色
</shape>
這樣之後,我們就得到了兩個Graphic檔案,每份檔案都定義了不同的Button元件樣式,它們在xml布局時可以被引用。
通過XML布局設計首頁面的UI
首先,複制如下圖檔,然後打開entry>src>main>resource>base>media,将已複制的圖檔粘貼到media目錄中,并命名為game8,這張圖檔将在XML檔案中的Image元件中被引用:
接着,打開entry>src>main>resource>base>layout>ability_main.xml,将代碼修改為如下:
<?xml version="1.0" encoding="utf-8"?>
<DependentLayout
xmlns:ohos="http://schemas.huawei.com/res/ohos"
ohos:height="match_parent"
ohos:width="match_parent"
ohos:orientation="vertical">
<Image
ohos:height="220vp"
ohos:width="365vp"
ohos:image_src="$media:game8"
ohos:horizontal_center="true"
ohos:above="$id:Game"
ohos:margin="20vp"
/>
<Button
ohos:id="$+id:Game"
ohos:center_in_parent="true"
ohos:height="50vp"
ohos:width="250vp"
ohos:background_element="$graphic:background_ability_main"
ohos:text_color="white"
ohos:text_weight="700"
ohos:text_size="20vp"
ohos:text="開始遊戲"
ohos:margin="14vp"
/>
<Button
ohos:id="$+id:record"
ohos:below="$id:Game"
ohos:horizontal_center="true"
ohos:height="50vp"
ohos:width="250vp"
ohos:background_element="$graphic:button"
ohos:text_color="#007CFD"
ohos:text_weight="700"
ohos:text_size="20vp"
ohos:text="遊戲記錄"
ohos:margin="14vp"
/>
<Button
ohos:id="$+id:HowToPlay"
ohos:below="$id:record"
ohos:horizontal_center="true"
ohos:height="50vp"
ohos:width="250vp"
ohos:background_element="$graphic:button"
ohos:text_color="#007CFD"
ohos:text_weight="700"
ohos:text_size="20vp"
ohos:text="遊戲規則"
ohos:margin="14vp"
/>
<Button
ohos:id="$+id:Team"
ohos:below="$id:HowToPlay"
ohos:horizontal_center="true"
ohos:height="50vp"
ohos:width="250vp"
ohos:background_element="$graphic:button"
ohos:text_color="#007CFD"
ohos:text_weight="700"
ohos:text_size="20vp"
ohos:text="關于我們"
ohos:margin="14vp"
/>
</DependentLayout>
在這個XML檔案中,我們使用的容器元件是依賴布局,是以筆者為每個元件都設定了ID号,并通過below的的關系垂直排布這些元件。
打開Previewer,便可檢視效果
當然,讀者們也可以随心所欲地設計Button元件的樣式。如果想要得到一份得體美觀的UI界面,那麼設計的過程難免會花比較多的時間。筆者在設計這個UI界面時,也是投入了不少時間打磨的。在首頁面中,筆者設定了四個Button元件,它們用于聯系其他的AbilitySlice。
設計進入應用時的歡迎界面
在生活中我們不難發現,當我們打開手機内的一款App時,手機會優先顯示這個應用的歡迎界面,然後才會彈出應用的主界面。通常情況下,歡迎界面會帶有開發公司的logo,甚至還可能顯示一段廣告。顯然,合理設計的歡迎界面能為這個應用的UI互動錦上添花。
在數獨小遊戲的頁面架構中,筆者也設計了歡迎界面。其中,InitialAbilitySlice用于承載歡迎界面的内容,MainAbilitySlice用于承載首頁面的内容。打開數獨小遊戲後,InitialAbilitySlice會顯示一小段時間,接着系統會将頁面跳轉至MainAbilitySlice。
首先,我們為InitialAbilitySlice定制一個xml檔案,用于承載InitialAbilitySlice需要的界面元素。
打開entry>src>main>resource>base>layout>ability_main.xml,然後右擊ability_main.xml并選擇複制,将已複制的檔案粘貼在layout的目錄下,并重命名為initial.xml(這裡我們通過複制後重命名的方式得到新xml檔案,因為此操作的難度相對較小);
接着,打開剛剛得到的initial.xml,将代碼修改為如下:
<?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:alignment="center"
ohos:orientation="vertical">
<Image
ohos:height="match_content"
ohos:width="match_content"
ohos:layout_alignment="center"
ohos:image_src="$media:media1"/>
</DirectionalLayout>
這裡的Image元件引用的資源為media1,是一張木棉花的logo圖檔,筆者在此就不分享這個圖檔資源了。讀者們可以使用自己想用的圖檔,隻要将自己喜歡的圖檔粘貼在media目錄下并命名為media1即可。
然後,打開InitialAbilitySlice,将代碼修改為如下:
package com.example.project.slice;
import com.example.project.ResourceTable;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import java.util.Timer;
import java.util.TimerTask;
public class InitialAbilitySlice extends AbilitySlice { //繼承AbilitySlice
@Override
protected void onStart(Intent intent) {
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_initial); //将此頁面的UI資源與initial.xml檔案綁定
TimerTask task = new TimerTask() { //定義一個計時器任務
@Override
public void run() {
present(new MainAbilitySlice(),new Intent()); //設定一個任務——将頁面導航到MainAbilitySlice
}
};
Timer timer = new Timer(); //建立新的計時器對象
timer.schedule(task, 3000); //将任務的執行時間設定為3秒後
}
@Override
public void onActive() {
super.onActive();
}
@Override
protected void onBackground() { //AbilitySlice的背景态
super.onBackground();
terminate(); //頁面進入背景後啟動頁面銷毀,減少記憶體占用
}
@Override
public void onForeground(Intent intent) {
super.onForeground(intent);
}
}
在InitialAbilitySlice中,我們先是讓InitialAbilitySlice繼承AbilitySlice類,并寫入相應的回調函數,之後在onStart中寫入了TimerTask與Timer。這個代碼的原理是——調用系統的計時器并設定3秒的時間間隔,當計時器走完這個時間間隔後,系統便執行相應的任務——從InitialAbilitySlice導航至MainAbilitySlice(即從歡迎頁面導航至主界面)。
最後,打開entry>src>main>Java>com.example.project>MainAbility,将代碼修改為如下:
package com.example.project;
import com.example.project.slice.InitialAbilitySlice; //導入InitialAbilitySlice的類
import ohos.aafwk.ability.Ability;
import ohos.aafwk.content.Intent;
public class MainAbility extends Ability {
@Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setMainRoute(InitialAbilitySlice.class.getName()); //将預設顯示的首頁面由MainAbilitySlice改為InitialAbilitySlice
}
}
此操作的目的是把應用預設顯示的頁面由MainAbilitySlice改為InitialAbilitySlice。這樣之後,打開應用時我們将看到的第一個頁面就是InitialAbilitySlice(歡迎頁面)了。
打開支援API6的手機模拟器,即可檢視緩沖頁面的效果。
應用的全屏化與修改應用的圖示和标簽
毋庸置疑,設計應用項目最基礎的就是修改應用的圖示和标簽,以便展示應用的簡單基本資訊。
打開entry>src>main>resource>zh.element>string.json,将字元串”entry_MainAbility”的value值改為“數獨”(這個字元串顯示的資訊就是應用的标簽資訊);
接着,将如下圖檔放置在media目錄中,并命名為img.png:
然後,打開config.json檔案,下滑找到“icon”,并将其内容改為"$media:img",效果圖如下:
打開手機模拟器,并将模拟機的頁面切換到桌面,我們就能看到改動後的應用圖示與标簽:
最後,我們需要實作全屏化,也就是把圖中那個黑框框去掉;
打開config.json檔案,下滑到檔案底部,并将代碼修改為如下:
......
"launchType": "standard"
}
],
"metaData": {
"customizeData": [
{
"name": "hwc-theme",
"value": "androidhwext:style/Theme.Emui.Light.NoTitleBar",
"extra": ""
}
]
}
}
}
完成這部操作後,應用的頁面便可實作全屏化,讀者可以打來模拟機檢視效果。
結尾
本期的内容就先分享到這裡,更多關于數獨小遊戲項目精彩的内容我将在下期繼續為大家揭曉。
想了解更多關于開源的内容,請通路:
51CTO 開源基礎軟體社群
https://ost.51cto.com/#bkwz