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

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

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

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

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

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

UI 界面美化

①M(fèi)ainAbilitySlice

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

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

打開(kāi)文件,將代碼做出如下修改:

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

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

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







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




至此第一個(gè)界面就美化完成了。

②SelectSlice

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

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

這里直接給出代碼:







界面的代碼如下:



③InitSlice


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

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








④GameSlice

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

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




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

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

這實(shí)際上是一個(gè)自定義樣式的 CommonDialog,如何自定義?首先創(chuàng)建一個(gè)自定義的 RecordDialog 類(lèi)和美化用的 xml 文件,然后在類(lèi)里面添加自己的 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è)計(jì),這個(gè)小游戲中還有一處,點(diǎn)擊關(guān)于游戲彈出的界面同樣也是這么實(shí)現(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è)計(jì),就是點(diǎn)擊設(shè)置按鈕時(shí)出現(xiàn)的一個(gè)滑動(dòng)塊組件,可以保存一些全局設(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("開(kāi)")==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,"開(kāi)");
}
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ù)存儲(chǔ)

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

https://ost.51cto.com/posts/7911
利用數(shù)據(jù)庫(kù)存儲(chǔ)每個(gè)關(guān)卡的信息,首先要新建一個(gè)數(shù)據(jù)庫(kù)類(lèi) 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實(shí)例注銷(xiāo)觀(guān)察者
preferences.unregisterObserver(mPreferencesObserver);
}
}
}

在結(jié)束游戲時(shí),如果打開(kāi)了自動(dòng)保存按鈕,則進(jìn)行存儲(chǔ):

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("開(kāi)")==0){
MyDB.putString(getContext(),key,tickTimer.getText());
}
}
present(newSelectSlice(),newIntent());
terminate();
}
});
commonDialog.show();


}
在點(diǎn)擊歷史記錄時(shí),會(huì)進(jìn)行數(shù)據(jù)讀?。?
//歷史記錄按鈕
recordBtn.setClickedListener(newComponent.ClickedListener(){
@Override
publicvoidonClick(Componentcomponent){
String[]s={"第一關(guān):無(wú)","第二關(guān):無(wú)","第三關(guān):無(wú)"};
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);
}
});
開(kāi)啟自動(dòng)保存,才會(huì)在游戲結(jié)束時(shí)存進(jìn)數(shù)據(jù)庫(kù),實(shí)際上也是利用數(shù)據(jù)庫(kù)中某個(gè) key 中的 value 控制。 具體實(shí)現(xiàn)如下:
choose.setCheckedStateChangedListener(newAbsButton.CheckedStateChangedListener(){
@Override
publicvoidonCheckedChanged(AbsButtonabsButton,booleanb){
Stringkey="save";
if(b){
MyDB.putString(dl.getContext(),key,"開(kāi)");
}
else{
MyDB.putString(dl.getContext(),key,"關(guān)");
}
}
});
至此,項(xiàng)目已經(jīng)全部分享完成,由于作品中涉及大量的圖片資源均是網(wǎng)絡(luò)資源(避免侵權(quán)),故僅作學(xué)習(xí)交流使用,實(shí)際上,絕大部分代碼已經(jīng)在文章中了,剩下的就是讀者理解之后動(dòng)手銜接起來(lái)!一定要?jiǎng)邮郑?

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

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

    關(guān)注

    2

    文章

    722

    瀏覽量

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

    關(guān)注

    0

    文章

    11

    瀏覽量

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

    關(guān)注

    56

    文章

    2267

    瀏覽量

    42481
  • OpenHarmony
    +關(guān)注

    關(guān)注

    25

    文章

    3546

    瀏覽量

    15734

原文標(biāo)題:鴻蒙推箱子小游戲:UI界面美化

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    單片機(jī)箱子游戲程序模擬仿真

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

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

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

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

    請(qǐng)問(wèn)基于單片機(jī)箱子游戲設(shè)計(jì)與制作。
    發(fā)表于 12-14 19:34

    箱子小游戲

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

    LabView資料分享:箱子游戲

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

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

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

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

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

    基于C語(yǔ)言設(shè)計(jì)編寫(xiě)的ARM箱子

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

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

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

    單片機(jī):箱子游戲HEX文件

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

    箱子小游戲設(shè)計(jì)

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

    語(yǔ)音識(shí)別的箱子游戲設(shè)計(jì)

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

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

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

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

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

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

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