0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

鴻蒙推箱子小游戲:UI界面美化

OpenHarmony技術(shù)社區(qū) ? 來源:OST開源開發(fā)者 ? 2023-01-09 10:00 ? 次閱讀

在上文筆者向大家分享了推箱子小游戲基礎(chǔ)功能的實現(xiàn),本文將繼續(xù)向大家介紹如何做 UI 界面美化,以及如何利用輕量級偏好數(shù)據(jù)庫做數(shù)據(jù)的存儲和讀取。

UI 界面美化

①MainAbilitySlice

29d2b8ee-8f42-11ed-bfe3-dac502259ad0.png

我們可以看到,所有的界面都是采用無框全屏化設(shè)計,因此第一步是要修改 config.json 文件。

打開文件,將代碼做出如下修改:

......
"launchType":"standard"
}
],
"metaData":{
"customizeData":[
{
"name":"hwc-theme",
"value":"androidhwext:style/Theme.Emui.Light.NoTitleBar",
"extra":""
}
]
}
}
}
然后設(shè)計按鈕樣式,首先新建一個 graphic 文件:

29ec8576-8f42-11ed-bfe3-dac502259ad0.png

接著在里面添加美化代碼:







現(xiàn)在分析界面需求,其中帶有“Pokemon”字樣的是本地圖片,因此我們需要的控件有四個按鈕以及一張圖片,布局采用 DirectionalLayout 即可。 代碼如下:




至此第一個界面就美化完成了。

②SelectSlice

29fc758a-8f42-11ed-bfe3-dac502259ad0.png

這個界面的布局跟第一個界面大同小異,只是少了一個按鈕,還有就是按鈕的樣式有點不同,因此需要再寫一個 graphic 文件,方法同上。

這里直接給出代碼:







界面的代碼如下:



③InitSlice


2a0918e4-8f42-11ed-bfe3-dac502259ad0.png

在加載界面中,只是用到了一個播放 gif 的第三方組件,以及一張圖片(文字圖片)一個進度條組件,布局也使用最常規(guī)的 DirectionalLayout 即可實現(xiàn)。








④GameSlice

2a395540-8f42-11ed-bfe3-dac502259ad0.png

游戲界面的 UI 就稍微復(fù)雜一點,需要用到嵌套,之前說過,地圖類繼承自布局,所以實際上地圖也是一個組件,理解了這一點之后,再來看代碼會容易理解很多。 整體布局用了 DirectionalLayout 縱向布局,在里面有需要橫向布局的,則添加 DirectionalLayout 的橫向布局,做一個簡單的嵌套。




四個界面美化完畢!接下來做一些細節(jié)的調(diào)整。在按下歷史記錄按鈕時,會顯示每個關(guān)卡最近的一次歷史記錄,效果如下:

2a569aec-8f42-11ed-bfe3-dac502259ad0.png

這實際上是一個自定義樣式的 CommonDialog,如何自定義?首先創(chuàng)建一個自定義的 RecordDialog 類和美化用的 xml 文件,然后在類里面添加自己的 xml 文件。

具體方法可以看代碼:

publicclassRecordDialog{
staticCommonDialogcommonDialog;

staticvoidshowDialog(Contextcontext,Strings1,Strings2,Strings3){
DirectionalLayoutdl=(DirectionalLayout)LayoutScatter.getInstance(context)
.parse(ResourceTable.Layout_recordlayout,null,false);
commonDialog=newCommonDialog(context);
commonDialog.setAutoClosable(true);

ButtonBtn=(Button)dl.findComponentById(ResourceTable.Id_Btn);

Textfirst=(Text)dl.findComponentById(ResourceTable.Id_firstText);
first.setText(s1);

Textsecond=(Text)dl.findComponentById(ResourceTable.Id_secondText);
second.setText(s2);

Textthird=(Text)dl.findComponentById(ResourceTable.Id_thirdText);
third.setText(s3);

Btn.setClickedListener(newComponent.ClickedListener(){
@Override
publicvoidonClick(Componentcomponent){
commonDialog.destroy();
}
});
commonDialog.setCornerRadius(15);
commonDialog.setContentCustomComponent(dl).show();
}
}

xml 文件如下:








關(guān)于這樣的設(shè)計,這個小游戲中還有一處,點擊關(guān)于游戲彈出的界面同樣也是這么實現(xiàn)的:

2a757624-8f42-11ed-bfe3-dac502259ad0.png

代碼如下:

publicclassMyDialog{
privatestaticTextversion;
staticvoidshowDialog(Contextcontext){
DirectionalLayoutdl=(DirectionalLayout)LayoutScatter.getInstance(context)
.parse(ResourceTable.Layout_mydialoglayout,null,false);
CommonDialogcommonDialog=newCommonDialog(context);
commonDialog.setAutoClosable(true);

ButtonknowBtn=(Button)dl.findComponentById(ResourceTable.Id_knowBtn);



knowBtn.setClickedListener(newComponent.ClickedListener(){
@Override
publicvoidonClick(Componentcomponent){
commonDialog.destroy();
}
});



commonDialog.setCornerRadius(15);
commonDialog.setContentCustomComponent(dl).show();
}
staticStringgetVersion(){
returnversion.getText();
}
}







游戲中最后一處 UI 設(shè)計,就是點擊設(shè)置按鈕時出現(xiàn)的一個滑動塊組件,可以保存一些全局設(shè)置:

2a9a2bcc-8f42-11ed-bfe3-dac502259ad0.png

publicclassSetDialog{
staticvoidshowDialog(Contextcontext){
DirectionalLayoutdl=(DirectionalLayout)LayoutScatter.getInstance(context)
.parse(ResourceTable.Layout_setlayout,null,false);
CommonDialogcommonDialog=newCommonDialog(context);
commonDialog.setAutoClosable(true);

ButtonsureBtn=(Button)dl.findComponentById(ResourceTable.Id_sureBtn);
Switchchoose=(Switch)dl.findComponentById(ResourceTable.Id_choose);

Stringvalue=MyDB.getString(dl.getContext(),"save");
if(value!=null){
if(value.compareTo("開")==0){
choose.setChecked(true);
}
elseif(value.compareTo("關(guān)")==0){
choose.setChecked(false);
}
}

choose.setCheckedStateChangedListener(newAbsButton.CheckedStateChangedListener(){
@Override
publicvoidonCheckedChanged(AbsButtonabsButton,booleanb){
Stringkey="save";
if(b){
MyDB.putString(dl.getContext(),key,"開");
}
else{
MyDB.putString(dl.getContext(),key,"關(guān)");
}
}
});


sureBtn.setClickedListener(newComponent.ClickedListener(){
@Override
publicvoidonClick(Componentcomponent){
commonDialog.destroy();
}
});

commonDialog.setCornerRadius(15);
commonDialog.setContentCustomComponent(dl).show();
}
}










至此,UI 美化部分已經(jīng)全部完成。

數(shù)據(jù)存儲

這里用到輕量級偏好數(shù)據(jù)庫,關(guān)于數(shù)據(jù)庫怎么使用,可以看這篇文章,文章寫得很詳細!

https://ost.51cto.com/posts/7911
利用數(shù)據(jù)庫存儲每個關(guān)卡的信息,首先要新建一個數(shù)據(jù)庫類 MyDB:
publicclassMyDB{
privatestaticfinalStringPREFERENCE_FILE_NAME="DB";
privatestaticPreferencespreferences;
privatestaticDatabaseHelperdatabaseHelper;
privatestaticPreferences.PreferencesObservermPreferencesObserver;

privatestaticvoidinitPreference(Contextcontext){
if(databaseHelper==null){
databaseHelper=newDatabaseHelper(context);
}
if(preferences==null){
preferences=databaseHelper.getPreferences(PREFERENCE_FILE_NAME);
}

}

publicstaticvoidputString(Contextcontext,Stringkey,Stringvalue){
initPreference(context);
preferences.putString(key,value);
preferences.flush();
}

publicstaticStringgetString(Contextcontext,Stringkey){
initPreference(context);
returnpreferences.getString(key,null);
}

publicstaticbooleandeletePreferences(Contextcontext){
initPreference(context);
booleanisDelete=databaseHelper.deletePreferences(PREFERENCE_FILE_NAME);
returnisDelete;
}

publicstaticvoidregisterObserver(Contextcontext,Preferences.PreferencesObserverpreferencesObserver){
initPreference(context);
mPreferencesObserver=preferencesObserver;
preferences.registerObserver(mPreferencesObserver);
}

publicstaticvoidunregisterObserver(){
if(mPreferencesObserver!=null){
//向preferences實例注銷觀察者
preferences.unregisterObserver(mPreferencesObserver);
}
}
}

在結(jié)束游戲時,如果打開了自動保存按鈕,則進行存儲:

if(gameMap.isWin()){
tickTimer.stop();
CommonDialogcommonDialog=newCommonDialog(getContext());
commonDialog.setSize(800,400);
commonDialog.setTitleText("注意");
commonDialog.setContentText("恭喜您完成游戲?。?!");
commonDialog.setButton(0,"確定",newIDialog.ClickedListener(){
@Override
publicvoidonClick(IDialogiDialog,inti){
commonDialog.destroy();
Stringvalue=MyDB.getString(getContext(),"save");
if(value!=null){
if(value.compareTo("開")==0){
MyDB.putString(getContext(),key,tickTimer.getText());
}
}
present(newSelectSlice(),newIntent());
terminate();
}
});
commonDialog.show();


}
在點擊歷史記錄時,會進行數(shù)據(jù)讀取:
//歷史記錄按鈕
recordBtn.setClickedListener(newComponent.ClickedListener(){
@Override
publicvoidonClick(Componentcomponent){
String[]s={"第一關(guān):無","第二關(guān):無","第三關(guān):無"};
Stringfirst=MyDB.getString(getContext(),"first");
Stringsecond=MyDB.getString(getContext(),"second");
Stringthird=MyDB.getString(getContext(),"third");

if(first==null){
first=s[0];
}
else{
first="第一關(guān):"+first;
}
if(second==null){
second=s[1];
}
else{
second="第二關(guān):"+second;
}
if(third==null){
third=s[2];
}
else{
third="第三關(guān):"+third;
}

RecordDialog.showDialog(getContext(),first,second,third);
}
});
開啟自動保存,才會在游戲結(jié)束時存進數(shù)據(jù)庫,實際上也是利用數(shù)據(jù)庫中某個 key 中的 value 控制。 具體實現(xiàn)如下:
choose.setCheckedStateChangedListener(newAbsButton.CheckedStateChangedListener(){
@Override
publicvoidonCheckedChanged(AbsButtonabsButton,booleanb){
Stringkey="save";
if(b){
MyDB.putString(dl.getContext(),key,"開");
}
else{
MyDB.putString(dl.getContext(),key,"關(guān)");
}
}
});
至此,項目已經(jīng)全部分享完成,由于作品中涉及大量的圖片資源均是網(wǎng)絡(luò)資源(避免侵權(quán)),故僅作學(xué)習(xí)交流使用,實際上,絕大部分代碼已經(jīng)在文章中了,剩下的就是讀者理解之后動手銜接起來!一定要動手!

后續(xù)作者也會開發(fā)更多的小游戲供大家學(xué)習(xí)交流~(下期可能就是 ArkUI 的小游戲啦?。┢诖c大家一起進步!??!

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 游戲
    +關(guān)注

    關(guān)注

    2

    文章

    742

    瀏覽量

    26316
  • ui界面
    +關(guān)注

    關(guān)注

    0

    文章

    11

    瀏覽量

    1573
  • 鴻蒙
    +關(guān)注

    關(guān)注

    57

    文章

    2351

    瀏覽量

    42849
  • OpenHarmony
    +關(guān)注

    關(guān)注

    25

    文章

    3722

    瀏覽量

    16313

原文標題:鴻蒙推箱子小游戲:UI界面美化

文章出處:【微信號:gh_834c4b3d87fe,微信公眾號:OpenHarmony技術(shù)社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    單片機箱子游戲程序模擬仿真

    單片機箱子游戲程序模擬仿真本程序仿真了ks0108驅(qū)動芯片的12864液晶屏,獨立的5個按鍵,程序的主要部分是箱子的部分的邏輯。增加計時
    發(fā)表于 11-06 20:41

    基于PROTEUS的箱子游戲(proteus仿真電路+匯編源程序)

    基于PROTEUS的箱子游戲
    發(fā)表于 07-06 17:26

    基于單片機箱子游戲設(shè)計與制作

    請問基于單片機箱子游戲設(shè)計與制作。
    發(fā)表于 12-14 19:34

    箱子小游戲!

    上班無聊,練練手打發(fā)時間的,界面有點簡陋,編地圖實在太麻煩了,就只編了5關(guān)
    發(fā)表于 06-09 14:54

    LabView資料分享:箱子游戲

    `附件為LabView編寫的箱子游戲,源碼來自網(wǎng)絡(luò),分享給大家,僅供學(xué)習(xí)用途,不得用于商業(yè)用途。如涉及侵權(quán),請聯(lián)系刪除謝謝。另外:對物聯(lián)網(wǎng)感興趣的童鞋,可以關(guān)注公眾號"玩轉(zhuǎn)IoT物聯(lián)網(wǎng)",回復(fù)“Labvie
    發(fā)表于 06-14 16:25

    基于labview開發(fā)的10個小游戲(貪吃蛇、俄羅斯方塊、五子棋、象棋、2048、箱子等)

    1.倒水游戲2.過河游戲3.計算器4.俄羅斯方塊5.貪吃蛇6.五子棋7.象棋8.拼圖游戲9.204810.箱子
    發(fā)表于 09-15 08:52

    如何利用STM32制作貪吃蛇和箱子游戲?

    如何利用STM32制作貪吃蛇和箱子游戲?
    發(fā)表于 09-27 08:07

    基于C語言設(shè)計編寫的ARM箱子

    ARM箱子的原型是基于C語言設(shè)計編寫的箱子小游戲,通過使用LCD、鍵盤、看門狗定時器、LED數(shù)碼管、GPIO、觸摸中斷等ARM實驗?zāi)K,
    發(fā)表于 12-14 08:09

    基于單片機的箱子游戲仿真結(jié)果

    本軟件是電子工程師DIY:基于單片機的箱子游戲的仿真結(jié)果。主要是采用STC89C54單片機,使用LCD12864 (0108)無字庫液晶屏來完成的。
    發(fā)表于 07-09 09:38 ?337次下載
    基于單片機的<b class='flag-5'>推</b><b class='flag-5'>箱子</b><b class='flag-5'>游戲</b>仿真結(jié)果

    單片機:箱子游戲HEX文件

    本文是電子工程師DIY:基于單片機的箱子游戲的HEX文件。該游戲主要是采用STC89C54單片機,使用LCD12864 (0108)無字庫液晶屏來完成的。
    發(fā)表于 07-09 09:43 ?249次下載

    箱子小游戲設(shè)計

    箱子小游戲設(shè)計
    發(fā)表于 06-09 09:49 ?98次下載

    語音識別的箱子游戲設(shè)計

    Matlab,是國際上使用最為廣泛的科學(xué)與工程計算軟件工具。其具有強大、豐富的內(nèi)置函數(shù)和工具箱。在簡要介紹箱子游戲核心算法的基礎(chǔ)上,給出一種基于Matlab CJUI的能進行實時語音識別的
    發(fā)表于 11-13 11:10 ?13次下載
    語音識別的<b class='flag-5'>推</b><b class='flag-5'>箱子</b><b class='flag-5'>游戲</b>設(shè)計

    鴻蒙上實現(xiàn)“數(shù)字華容道”小游戲

    本篇文章教大家如何在鴻蒙上實現(xiàn)“數(shù)字華容道”小游戲。
    的頭像 發(fā)表于 12-26 09:52 ?1250次閱讀

    基于JAVA UI開發(fā)的“箱子小游戲

    實際上,筆者在進行開發(fā)的過程中,并不是寫完一個界面的內(nèi)部邏輯,就開始對界面進行美化,而是先讓所有的東西可以正常地跑起來,再談美化。
    的頭像 發(fā)表于 01-05 09:32 ?565次閱讀

    鴻蒙上開發(fā)“箱子小游戲

    本文我們將逐步分享基于 JAVA UI 開發(fā)的“箱子小游戲這個項目的構(gòu)建流程。
    的頭像 發(fā)表于 01-05 09:33 ?1088次閱讀