一、開發(fā)環(huán)境
1.系統(tǒng)環(huán)境:Windows、Mac等
2.集成開發(fā)環(huán)境:Android Studio、虛擬機(jī)版本為Android 7.0(Nexus 5 API 24型號)
數(shù)據(jù)庫系統(tǒng):Android Studio自帶輕量級數(shù)據(jù)庫SQLite
輔助工具:Mark Man(圖標(biāo)標(biāo)注工具)、iconfont(阿里巴巴矢量圖庫)、MindMaster(流程分析)
二、系統(tǒng)演示
Android
三、主要功能
1.Android客戶端登錄界面首先要有選擇不同角色(用戶、管理員)登錄的下拉列表,可以根據(jù)用戶各自的選項(xiàng)來確定展示部分,即可使用功能部分的多少。
2.登錄界面還需設(shè)置不同的登錄方式,可進(jìn)行本機(jī)一鍵登錄,也可以根據(jù)不同的手機(jī)號,通過消息提示框發(fā)送六位隨機(jī)驗(yàn)證碼的形式,和用戶輸入的進(jìn)行對比,匹配成功后方可登錄菜單界面。
3.普通用戶登陸成功后,首先可以看到菜單界面,包括一個(gè)可左右滑動的健身不分類型選擇,和一個(gè)可以上下滑動的課程分類。
4.會員用戶登錄后,可以在普通用戶的基礎(chǔ)上增添一個(gè)利用frame頁面切換的效果,鏈接到自定義課程頁面,可以根據(jù)課程名和課程類型,對自定義課程進(jìn)行增、刪、改、查操作,并將最終用戶的課程添加到日常課程選項(xiàng)里。
5.用戶可以通過下拉列表選擇不同強(qiáng)度的訓(xùn)練,并且可以依照不同的日期,進(jìn)行當(dāng)天課程的規(guī)劃安排。
6.用戶可以根據(jù)每個(gè)課程所學(xué)的時(shí)間在個(gè)人信息界面統(tǒng)計(jì)出自己所學(xué)課程的總健身時(shí)間。
四、需求分析
(一)、用例建模
????????根據(jù)上述的用戶需求,我們主要?dú)w納該軟件的功能模塊如下:
1.健身課程模塊,對健身課程進(jìn)行基本的分類展示
2.組圖模塊,將健身課程以一個(gè)列表組合的圖片形式進(jìn)行展現(xiàn)
3.視頻模塊,將健身視頻有機(jī)融合在軟件的設(shè)計(jì)中
4.課程詳情頁,可以根據(jù)用戶的需求,自定義健身課程,并添加到日常課程中
5.反饋模塊,用戶可以將自己使用軟件的反饋信息提交到控制臺,也可接收自己的課程信息
6.用戶管理界面,管理員可根據(jù)選擇的用戶信息進(jìn)行修改、刪除
????????根據(jù)系統(tǒng)的需求實(shí)現(xiàn)和功能分析,我主要?dú)w納整理出以下四個(gè)大主體——普通用戶、會員用戶、管理員以及課程管理數(shù)據(jù)庫,通過功能重疊、交叉,畫出該系統(tǒng)的用例分析圖如下:
五、總體設(shè)計(jì)
(一)、概要設(shè)計(jì)
????????根據(jù)軟件系統(tǒng)的設(shè)計(jì)理念,將上述需求分析階段得到的用戶需求進(jìn)行分析、總結(jié)、歸納,得到該系統(tǒng)的實(shí)體以及實(shí)體屬性,并在這里采用層次圖的方式抽象成信息結(jié)構(gòu)即概念模型。
(二)、數(shù)據(jù)庫設(shè)計(jì)
????????本系統(tǒng)主要分為用戶數(shù)據(jù)庫和課程數(shù)據(jù)庫兩類,如下圖所示:
表1 用戶表
字段名稱 |
數(shù)據(jù)類型 |
長度 |
是否允許null值 |
約束 |
備注 |
用戶編號 |
Integer |
否 |
主鍵 |
||
用戶名 |
VarChar |
否 |
|||
用戶類型 |
Boolean |
是 |
表2 課程表
字段名稱 |
數(shù)據(jù)類型 |
長度 |
是否允許null值 |
約束 |
備注 |
課程編號 |
Integer |
否 |
主鍵 |
||
課程名 |
VarChar |
否 |
|||
課程類型 |
Varchar |
是 |
(三)、算法設(shè)計(jì)
????????根據(jù)上述概要設(shè)計(jì),我們對本系統(tǒng)的功能有了大體的了解,緊接著,便是選擇合適的編程算法,對所要達(dá)到的目的進(jìn)行操作上的實(shí)現(xiàn),為了避免自然語言在語法和語義上常常展示的多義性,導(dǎo)致運(yùn)行系統(tǒng)、試用群體及編程者們出現(xiàn)歧義,這里我們選擇用流程圖的方式對我們需要做到的登錄界面的過程進(jìn)行簡單的概括,為后期的具體功能的開發(fā)提供良好的算法支持,登錄界面的流程圖如下所示:
六、功能實(shí)現(xiàn)?
(一)、廣告界面的設(shè)計(jì)
1.UI設(shè)計(jì)
????????用默認(rèn)布局ConstraintLayout(約束布局)作為底層布局,為保證代碼在整體設(shè)計(jì)之初就盡量減少,因此我這里也本著控件減少的理念設(shè)計(jì)第一個(gè)主頁布局,即將其的背景直接設(shè)置為Keep軟件起始展示的背景圖片,由于約束布局本身的自適應(yīng)手機(jī)大小的特性,也避免了用ImageView插入圖片后再繼續(xù)調(diào)整圖片大小與位置的漏洞,避免圖片的拉伸導(dǎo)致失幀。
????????緊接著,我對右上方的跳過按鈕進(jìn)行了簡單的優(yōu)化,設(shè)計(jì)靈感也是來源于平日生活中,大部分軟件對于廣告跳過時(shí)出現(xiàn)的按鈕樣式,這里,我在drawable文件夾中自定義新建了一個(gè)名為shape的Drawable resource file,用來改變按鈕的原始默認(rèn)樣式,具體效果展示如下:
????????部分代碼如下所示 :
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="#585060" />
<size
android:width="50dp"
android:height="20dp" />
<stroke
android:width="2dp"
android:color="#ffffff"
android:dashGap="270dp" />
</shape>
2.功能實(shí)現(xiàn)
? ? ? ?這里我首先選擇使用Timer對象,通過新建的timer調(diào)用定時(shí)器的常用方法schedule接著創(chuàng)建TimerTask()執(zhí)行其定義的抽象方法run(),將顯示意圖的跳轉(zhuǎn)效果寫在方法體內(nèi)部,執(zhí)行意圖,并設(shè)定其延遲時(shí)間。可是,在運(yùn)行時(shí)發(fā)現(xiàn)了一個(gè)運(yùn)行bug,即無論我是否點(diǎn)擊跳過按鈕進(jìn)行及時(shí)跳過,這個(gè)延遲三秒的方法都會實(shí)現(xiàn),也就是說,他們跳轉(zhuǎn)的下一個(gè)界面會打開兩次,這里我便開始思考,如何設(shè)置自己的方法,讓它進(jìn)行簡單的方法體互斥,因此,我想到了使用全局變量和if語句條件判斷進(jìn)行攔截的方式,即設(shè)置一個(gè)布爾類型的變量進(jìn)行條件篩選,運(yùn)行后依舊出現(xiàn)問題,在對方法體進(jìn)行分析后,發(fā)現(xiàn)此類方法體雖然設(shè)定了延遲時(shí)間,但其本身方法與延遲時(shí)間在同一個(gè)方法體內(nèi)部定義,即它要先執(zhí)行這個(gè)方法才能延遲時(shí)間,也就是說,無論布爾值后期被改變?yōu)槎嗌?,由于方法的同時(shí)性,它在進(jìn)入時(shí)始終是變量初值,后期按鈕的監(jiān)聽事件并不能進(jìn)行改變。
new Thread() {
@Override
public void run() {
super.run();
try {
Thread.sleep(3000);//休眠3秒
} catch (InterruptedException e) {
e.printStackTrace();}
if (!skip) {
Intent intent = new Intent(MainActivity.this, LoginFrame.class);
startActivity(intent); }}}.start();
(二)、登錄界面的設(shè)計(jì)
1.UI設(shè)計(jì)
????????通過插入videoView視頻控件作為接收視頻的容器,設(shè)置其大小布滿手機(jī)屏幕。其中為方便所要插入的圖片格式自適應(yīng),這里大多圖片都以TextView設(shè)置背景圖的形式展現(xiàn)。而為實(shí)現(xiàn)后期功能的分支,這里也使用了Spinner下拉列表控件,也設(shè)置了單選按鈕來模擬現(xiàn)實(shí)生活中軟件與用戶的協(xié)議要求。具體實(shí)現(xiàn)效果如下圖:
2.功能實(shí)現(xiàn)
????????這里Android開發(fā)提供了兩種不同的導(dǎo)入方式,其中使用MeidiaPlayer播放音頻,并不能簡單插入在某個(gè)布局文件的內(nèi)部,因此,只能通過在class內(nèi)設(shè)置方法,才能通過此類來播放音頻。為方便用戶查看,實(shí)現(xiàn)打開界面就能保證始終播放,這里我最終選擇使用VideoView控件進(jìn)行視頻文件的播放,通過在res文件目錄下,引入視頻源文件,通過相對路徑進(jìn)行引入,具體代碼如下:
public void video(){
videoView=findViewById(R.id.videoView);
String packageName = getPackageName();
videoView.setVideoURI(Uri.parse("android.resource://"+packageName+"/"+R.raw.login));
videoView.start();
videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
mp.setLooping(true); }});}
????????通過適配器為它編寫初始展示樣式,也通過調(diào)用setDropDownViewResource()方法設(shè)置下拉列表下拉時(shí)的菜單樣式,最后進(jìn)行展示,具體代碼如下所示:?
list.add("普通用戶");
list.add("會員用戶");
spinneruser=(Spinner)findViewById(R.id.spinner3);
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinneruser.setAdapter(adapter);
(三)、驗(yàn)證碼界面的設(shè)計(jì)
1.UI設(shè)計(jì)
????????根據(jù)上述理念的描述過程,我在默認(rèn)的約束布局內(nèi)部加入簡單的幾個(gè)文本框與按鈕控件,僅修改其文字大小、內(nèi)邊距等控件屬性,這里采用約束布局能較快的分配每個(gè)控件在手機(jī)展示窗口的大體位置,方便做進(jìn)一步調(diào)整,展示效果如下所示:
????????根據(jù)上述要求,這里繼續(xù)選用控件設(shè)定位置相對靈活性較高的約束布局,添加文本框提示用戶輸入驗(yàn)證碼的信息,具體效果體現(xiàn)如下:
2.功能實(shí)現(xiàn)
????????通過Math類的random方法生成一個(gè)六位隨機(jī)數(shù),將這兩個(gè)重要信息與本機(jī)號碼一同添加至大籃子(Bundle)對象中,進(jìn)行下一個(gè)界面的值傳遞,為了更好的實(shí)現(xiàn)變量的動態(tài)共用方法。具體代碼操作如下:
db = openOrCreateDatabase("test.db", Context.MODE_PRIVATE, null);
Cursor cursor=db.query("user",null,"number like ?",
new String[]{number},null,null,null);
while (cursor.moveToNext()){
String position=String.valueOf(cursor.getString(2));
if(position.equals("1")){
int round = (int) Math.round(Math.random() * (999999 - 100000) + 100000);
String code = String.valueOf(round);
Toast.makeText(LoginFrameOther.this, "驗(yàn)證碼為"+code, Toast.LENGTH_SHORT).show();
Bundle bundle=new Bundle();
bundle.putString("code",code);
bundle.putString("number",number);
bundle.putString("judgement","true");
Intent intent=new Intent(this,LoginFrameOtherNext.class);
intent.putExtras(bundle);
startActivity(intent);
(四)、菜單頁界面的設(shè)計(jì)
1.UI設(shè)計(jì)
????????在默認(rèn)約束布局內(nèi)添加ViewPager控件即可。
2.功能實(shí)現(xiàn)
????????首先該類需要繼承FragmentActivity父類的抽象方法,還需要實(shí)現(xiàn)兩個(gè)Fragment對象各自的接口,以設(shè)置監(jiān)聽事件的抽象方法,接下來在該類中自定義FragAdapter類繼承FragmentPagerAdapter,用來與ViewPager進(jìn)行適配,創(chuàng)建的兩個(gè)Fragment對象文件,添加至一個(gè)數(shù)組中,初始化ViewPager控件,并調(diào)用setAdapter()方法即可,具體代碼體現(xiàn)如下:
public class FragAdapter extends FragmentPagerAdapter {
public FragAdapter(FragmentManager fm, List<Fragment>fragments) {
super(fm);
fragmentList=fragments;}
@Override
public Fragment getItem(int arg0) {
return fragmentList.get(arg0);}
@Override
public int getCount() {
return fragmentList.size();}}
(五)、推薦頁界面的設(shè)計(jì)
1.UI設(shè)計(jì)
????????剩下的兩個(gè)切換效果,我分別使用了HorizontalScrollView橫向滾動條和ListView控件,對課程的類型及具體課程的信息進(jìn)行了簡單的分類,兩種生成滾動條的不同形式,避免了相同代碼的冗余情況,實(shí)現(xiàn)了相同效果的不同體現(xiàn)方式的代碼創(chuàng)新。這里對各個(gè)文本框的樣式也進(jìn)行了細(xì)節(jié)上的優(yōu)化,即設(shè)置一個(gè)布局文件,將文本框的background屬性設(shè)置為該文件的相對路徑。
2.功能實(shí)現(xiàn)
????????初始化ListView控件,進(jìn)行綁定設(shè)置,定義一個(gè)內(nèi)部類MyBaseAdapter繼承最基本的適配器BaseAdapter,并且實(shí)現(xiàn)它繼承的四個(gè)抽象方法,分別得到當(dāng)前item的條目總數(shù)、代表對象、id下標(biāo)以及轉(zhuǎn)換后的View視圖對象,最后在該類建成的onCreate()方法中創(chuàng)建一個(gè)Adapter實(shí)例,設(shè)置listview控件添加當(dāng)前適配器。具體代碼如下:
public View getView(int position, View convertView, ViewGroup parent) {
View view=View.inflate(Fragment1.this.getActivity(),R.layout.list_item,null);
TextView textView=(TextView) view.findViewById(R.id.textView10);
TextView textView1=(TextView) view.findViewById(R.id.textView11);
TextView textView2=(TextView) view.findViewById(R.id.textView14);
textView.setText(names[position]);
textView1.setText(text1[position]);
textView2.setText(text2[position]);
ImageView imageView=(ImageView)view.findViewById(R.id.imageView9);
imageView.setBackgroundResource(icons[position]);
return view;}
(六)、會員精選界面的設(shè)計(jì)
1.UI設(shè)計(jì)
????????對于該頁面的UI設(shè)計(jì),我首先引用了之前推薦頁的標(biāo)題欄,將“會員精選”的樣式進(jìn)行突出,接著添加一個(gè)ListView控件用于顯示會員自定義的課程數(shù)據(jù),接著是兩個(gè)編輯框的添加,首行編輯框是主要運(yùn)行的字段名檢索,而課程類型編輯框則用于修改按鈕的單獨(dú)使用,最后是四個(gè)按鈕控件的添加。展示效果為追求查詢效率,則故意簡化UI設(shè)計(jì),以減少加載時(shí)間。
2.功能實(shí)現(xiàn)
????????采用for循環(huán)進(jìn)行圖片的循環(huán)輸出,其中定義一個(gè)判別變量flag,根據(jù)它值的不同設(shè)置不同的圖片,而根據(jù)簡單的數(shù)學(xué)思想指定的算法,利用取余的方式,實(shí)現(xiàn)簡單的循環(huán)效果,具體代碼如下:
if(flag<=2){ if(flag==0){
layout.setBackgroundResource(R.drawable.classone);
flag=flag+1; }else if(flag==1){
layout.setBackgroundResource(R.drawable.classtwo);
flag=flag+1; }else if(flag==2){
layout.setBackgroundResource(R.drawable.classthree);
flag=flag+1;}}else{ flag=flag%3;
if(flag==0){ layout.setBackgroundResource(R.drawable.classone);
flag=flag+1;
}else if(flag==1){ layout.setBackgroundResource(R.drawable.classtwo);
flag=flag+1;
}else if(flag==2){ layout.setBackgroundResource(R.drawable.classthree);
flag=flag+1;}}
(七)、個(gè)人信息界面的設(shè)計(jì)(定時(shí)公告滾動條)
1.UI設(shè)計(jì)
????????根據(jù)上述要求,我開始設(shè)計(jì)本頁面的具體布局形式,為了進(jìn)一步利用幀布局體現(xiàn)UI疊加的效果,這里我選用FrameLayout作為打底布局,上下兩個(gè)線性布局采用2:1的形式隔開,同等級別下,在建立一個(gè)約束布局,在其中添加文本框控件,并設(shè)置其背景與外邊距屬性,根據(jù)用戶自定義的位置,讓其懸浮于兩個(gè)線性布局之上,形成所需效果。具體效果圖如下:
2.功能實(shí)現(xiàn)
????????實(shí)例化一個(gè)Handler對象,將所要執(zhí)行的循環(huán)體寫在其繼承實(shí)現(xiàn)的Runnable方法體內(nèi)部,根據(jù)調(diào)用postDelayed()方法,設(shè)置所要執(zhí)行的方法體和間隔時(shí)間,具體代碼如下:
Runnable runnable = new Runnable() {
@Override
public void run() {
if(judge==1){ textView.setText("618狂歡,年卡超值7折起");
judge=0;
}else{ textView.setText("學(xué)生618專屬,限時(shí)5折起"); judge=1;}
handler.postDelayed(this, 3000);}
(八)、全部課程規(guī)劃界面的設(shè)計(jì)
1.UI設(shè)計(jì)
????????首先我添加了一個(gè)水平方向的線性布局,在其中設(shè)置了四個(gè)按鈕作為日期,為了整體布局的美觀考慮,給它的屬性添加了特殊的按鈕樣式,這里也可以繼續(xù)使用橫向滾動條的控件,進(jìn)一步實(shí)現(xiàn)貼近生活的效果,此后我選擇幀布局作為底層布局,將四個(gè)線性布局疊加嵌套在同一個(gè)位置,根據(jù)下拉列表Spinner控件選擇的文本信息,對課程進(jìn)行添加,這里為了避免多次使用ListView控件匹配適配器的方法,為了實(shí)現(xiàn)同樣的效果,通過線性布局疊加滾動條的辦法,根據(jù)用戶單擊事件,去增添新視圖,而四個(gè)日期的即時(shí)切換效果,則根據(jù)不同的日期按鈕,設(shè)置四個(gè)布局文件是否可見的屬性,自主控制它們的顯示優(yōu)先級來完成。具體效果體現(xiàn)如下圖所示:
2.功能實(shí)現(xiàn)
????????一個(gè)是對下拉列表的設(shè)置,通過定義下拉列表內(nèi)容、為下拉列表定義一個(gè)適配器、設(shè)置下拉列表下拉時(shí)的菜單樣式、將適配器添加到下拉列表上、添加監(jiān)聽器,為下拉列表設(shè)置事件的響應(yīng)五步走,對下拉列表控件進(jìn)行綁定和功能實(shí)現(xiàn),第二部分則是對課程添加操作的編寫,最后是與個(gè)人信息界面達(dá)成值回傳的綁定效果。
spinnername=(Spinner)findViewById(R.id.spinner);
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinnername.setAdapter(adapter);
spinnername.setOnItemSelectedListener(new Spinner.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { name=adapter.getItem(position);
parent.setVisibility(View.VISIBLE); }
public void onNothingSelected(AdapterView<?> parent) {
name=""; parent.setVisibility(View.VISIBLE); }});
(九)、管理員操作界面的設(shè)計(jì)
1.UI設(shè)計(jì)
????????根據(jù)概述的信息,我們首先對管理員的布局界面進(jìn)行設(shè)計(jì),這里采用視圖控件與文本框控件交替的方法,其中View視圖起到的作用是在兩列之間起到分割的作用,縱觀這個(gè)布局文件,就是完成這樣的工作,設(shè)置一個(gè)表頭,將三個(gè)TextView放置在一個(gè)水平的線性布局中去,分別顯示一列的表頭,然后需要一個(gè)ListView與上述的線性布局一同放入一個(gè)垂直的線性布局中去,用來顯示每一條記錄。而每一條記錄的顯示需要我們來實(shí)現(xiàn)一個(gè)adapter適配器去適配數(shù)據(jù)進(jìn)而完成每一項(xiàng)的顯示,這樣我們就基本完成了程序的主體布局,實(shí)現(xiàn)效果圖如下:
2.功能實(shí)現(xiàn)
????????添加一個(gè)長按事件,并實(shí)例化一個(gè)窗口,接著根據(jù)switch語句分別設(shè)定四種選項(xiàng)——增添、修改、刪除以及取消,設(shè)置點(diǎn)擊事件,并引入AlertDialog對話框,這里對數(shù)據(jù)庫的操作也不同于往常的Dao設(shè)計(jì)模式,即將所有的數(shù)據(jù)庫執(zhí)行方法寫入一個(gè)Dao類中,而是通過增加一個(gè)SQLiteDatabase對象。
lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view,
final int position, long id) {
new AlertDialog.Builder(ManagerActivity.this) .setTitle("選擇操作")
.setItems(new String[] {"增添", "更新", "刪除", "取消" },
new DialogInterface.OnClickListener() { @Override
public void onClick(DialogInterface dialog, int which) { switch (which) { case 0: LayoutInflater inflater = getLayoutInflater();
final View layout = inflater.inflate(R.layout.dialog, null);
至此,該Android開發(fā)模擬Keep運(yùn)動健身管理系統(tǒng)的基本功能與界面展示完畢。如對您有所幫助,望留下寶貴一贊!謝謝!文章來源:http://www.zghlxwxcb.cn/news/detail-469479.html
????????需源碼、1w5報(bào)告 請私信?扣扣 1092644308文章來源地址http://www.zghlxwxcb.cn/news/detail-469479.html
到了這里,關(guān)于基于Android Studio的安卓課程設(shè)計(jì)(Keep運(yùn)動軟件)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!