20172305 暑假作业 之 TimeCalculate & Save Iron Man

TimeCalculate

项目介绍

  • 项目名称:

    • TimeCalculate
  • 项目简介:
    • 本项目基于Java语言和Anroid Studio软件,便于计算与年龄相关的内容,解决有些人群在计算他人年龄或是生肖、星座等问题的尴尬。
  • 使用说明:
    • 本款APP通过输入人的年、月、日或是年龄来计算相关的出生日期、生肖、星座、以及生辰八字等相关年龄的问题。

需求分析

  • 本款产品是基于特定人群的开发,当遇到有关年龄的相关计算,存在粗心算错或是或是忽略了时间计算的特殊而导致的尴尬的问题。譬如,在问过对方的生肖之后就应该会判断出他的年龄,而如果多算了一轮生肖恐怕气氛会有些尴尬。所以,本款产品就是为此而设计的。

  • 产品图标

相关过程分析

  • 本项目分为Java代码部分和Android 界面部分

  • Java代码部分:该部分编写了相关年龄的计算,有利用年、月、日算出的出生日期、生肖、星座、生辰八字和年龄算出的出生年份。
    • 计算出生日期(阴历)和生肖
    public class Bazi {private int year;private int month;private int day;private boolean leap;Date baseDate = null;final static String chineseNumber[] = {"正", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "腊"};public final static String[] Gan = {"甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"};public final static String[] Zhi = {"子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"};static SimpleDateFormat chineseDateFormat = new SimpleDateFormat("yyyy-MM-dd");final static long[] lunarInfo = new long[]{0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2,0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ada2, 0x095b0, 0x14977,0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970,0x06566, 0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7, 0x0c950,0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557,0x06ca0, 0x0b550, 0x15355, 0x04da0, 0x0a5d0, 0x14573, 0x052d0, 0x0a9a8, 0x0e950, 0x06aa0,0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0,0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b5a0, 0x195a6,0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46, 0x0ab60, 0x09570,0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, 0x055c0, 0x0ab60, 0x096d5, 0x092e0,0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0, 0x0cab5,0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930,0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530,0x05aa0, 0x076a3, 0x096d0, 0x04bd7, 0x04ad0, 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45,0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0};public String getMonth() {return chineseNumber[month- 1] ;}public String getYear() {return getYearStr(year);}public int getnumberYear() {return year;}public int getnumbermonth() {return month;}public int getYearindex() {return (year - 4) % 12;}public String getDay() {return getChinaDayString(day);}public static final String[] jiazhi = {"甲子", "乙丑", "丙寅", "丁卯", "戊辰", "己巳", "庚午", "辛未", "壬申", "癸酉","甲戌", "乙亥", "丙子", "丁丑", "戊寅", "己卯", "庚辰", "辛巳", "壬午", "癸未","甲申", "乙酉", "丙戌", "丁亥", "戊子", "己丑", "庚寅", "辛卯", "壬辰", "癸巳","甲午", "乙未", "丙申", "丁酉", "戊戌", "己亥", "庚子", "辛丑", "壬寅", "癸卯","甲辰", "乙巳", "丙午", "丁未", "戊申", "己酉", "庚戌", "辛亥", "壬子", "癸丑","甲寅", "乙卯", "丙辰", "丁巳", "戊午", "己未", "庚申", "辛酉", "壬戌", "癸亥"};private Calendar cal;public String getYearGanZhi(int hour) {int idx = (year - 1864) % 60;String y = jiazhi[idx];String m="";String d="";String h="";idx = idx % 5;int idxm=0;idxm=(idx+1)*2;if(idxm==10) idxm=0;m=Gan[(idxm+month-1)%10]+Zhi[(month+2-1)%12];int offset = (int) ((cal.getTime().getTime() - baseDate.getTime()) / 86400000L);offset=(offset+40)%60;d=jiazhi[offset];offset=(offset % 5 )*2;h=Gan[(offset+hour)%10]+Zhi[hour];return y+"\n"+m+"\n"+d+"\n"+h;}public String getShichenFromDay(int offset){return null;}//====== 传回农历 y年的总天数final private static int yearDays(int y) {int i,  sum = 348;for (i = 0x8000; i > 0x8; i >>= 1) {if ((lunarInfo[y - 1900] & i) != 0) {sum += 1;}}return (sum + leapDays(y));}//====== 传回农历 y年闰月的天数final private static int leapDays(int y) {if (leapMonth(y) != 0) {if ((lunarInfo[y - 1900] & 0x10000) != 0) {return 30;} else {return 29;}} else {return 0;}}//====== 传回农历 y年闰哪个月 1-12 , 没闰传回 0final private static int leapMonth(int y) {return (int) (lunarInfo[y - 1900] & 0xf);}//====== 传回农历 y年m月的总天数final private static int monthDays(int y, int m) {if ((lunarInfo[y - 1900] & (0x10000 >> m)) == 0) {return 29;} else {return 30;}}/**** @return 传回农历 y年的生肖*/final public String animalsYear() {final String[] Animals = new String[]{"鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪"};return Animals[(year - 4) % 12];}//====== 传入 月日的offset 传回干支, 0=甲子final private static String cyclicalm(int num) {return (Gan[num % 10] + Zhi[num % 12]);}//====== 传入 offset 传回干支, 0=甲子final public String cyclical() {int num = year - 1900 + 36;return (cyclicalm(num));}/*** 传出y年m月d日对应的农历.* yearCyl3:农历年与1864的相差数 ?* monCyl4:从1900年1月31日以来,闰月数* dayCyl5:与1900年1月31日相差的天数,再加40 ?** @param cal* @return*/public Bazi(Calendar cal) {this.cal=cal;int yearCyl,  monCyl,  dayCyl;int leapMonth = 0;try {baseDate = chineseDateFormat.parse("1900-1-31");} catch (ParseException e) {e.printStackTrace(); //To change body of catch statement use Options | File Templates.}//求出和1900年1月31日相差的天数int offset = (int) ((cal.getTime().getTime() - baseDate.getTime()) / 86400000L);dayCyl = offset + 40;monCyl = 14;//用offset减去每农历年的天数// 计算当天是农历第几天//i最终结果是农历的年份//offset是当年的第几天int iYear,  daysOfYear = 0;for (iYear = 1900; iYear < 2050 && offset > 0; iYear++) {daysOfYear = yearDays(iYear);offset -= daysOfYear;monCyl += 12;}if (offset < 0) {offset += daysOfYear;iYear--;monCyl -= 12;}//农历年份year = iYear;yearCyl = iYear - 1864;leapMonth = leapMonth(iYear); //闰哪个月,1-12leap = false;//用当年的天数offset,逐个减去每月(农历)的天数,求出当天是本月的第几天int iMonth,  daysOfMonth = 0;for (iMonth = 1; iMonth < 13 && offset > 0; iMonth++) {//闰月if (leapMonth > 0 && iMonth == (leapMonth + 1) && !leap) {--iMonth;leap = true;daysOfMonth = leapDays(year);} else {daysOfMonth = monthDays(year, iMonth);}offset -= daysOfMonth;//解除闰月if (leap && iMonth == (leapMonth + 1)) {leap = false;}if (!leap) {monCyl++;}}//offset为0时,并且刚才计算的月份是闰月,要校正if (offset == 0 && leapMonth > 0 && iMonth == leapMonth + 1) {if (leap) {leap = false;} else {leap = true;--iMonth;--monCyl;}}//offset小于0时,也要校正if (offset < 0) {offset += daysOfMonth;--iMonth;--monCyl;}month = iMonth;day = offset + 1;}public static String getChinaDayString(int day) {String chineseTen[] = {"初", "十", "廿", "卅"};int n = day % 10 == 0 ? 9 : day % 10 - 1;if (day > 30) {return "";}if (day == 10) {return "初十";} else {return chineseTen[day / 10] + chineseNumber[n];}}@Overridepublic String toString() {return getYearStr(year) + "年" + (leap ? "闰" : "") + chineseNumber[month - 1] + "月" + getChinaDayString(day);}public String getYearStr(int year) {String[] chineseword = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"};String ys = "";int index = year / 1000;ys += chineseword[index];year = year % 1000;index = year / 100;ys += chineseword[index];year = year % 100;index = year / 10;ys += chineseword[index];year = year % 10;index = year;ys += chineseword[index];return ys;}public static String getSixtyDay() {String temp = "";for (int i = 0; i < 60; i++) {temp += ",/" + cyclicalm(i) + "/";}return temp;}
    }
    • 计算星座
    public class Age {public String years(int num1, int num2, int num3){LocalDate dateA = LocalDate.of(num1, num2, num3);LocalDate dateB = LocalDate.now();Period period = Period.between(dateA,dateB);return "" + period.getYears();}public String constellation(int num1, int num2, int num3){LocalDate date = LocalDate.of(num1, num2, num3);int day, months = 0;//平年if(leap(date.getYear())){switch(date.getMonthValue()){case 1:months = 0;break;case 2:months = 31;break;case 3:months = 60;break;case 4:months = 91;break;case 5:months = 121;break;case 6:months = 152;break;case 7:months = 182;break;case 8:months = 213;break;case 9:months = 244;break;case 10:months = 274;break;case 11:months = 305;break;case 12:months = 335;break;}}else{switch(date.getMonthValue()){case 1:months = 0;break;case 2:months = 31;break;case 3:months = 59;break;case 4:months = 90;break;case 5:months = 120;break;case 6:months = 151;break;case 7:months = 181;break;case 8:months = 212;break;case 9:months = 243;break;case 10:months = 273;break;case 11:months = 304;break;case 12:months = 334;break;}}day = months + date.getDayOfMonth();if(leap(date.getYear())){if((day >= 20) && (day <= 49))return "星座: Aquarius \n水瓶座 \n01月20日--02月18日 \n构成元素:空气 \n颜色:黑\n  泼墨吹烛,\n我自赏遍红尘蒹葭,  \n点笔寒桠,\n为你温纸入画。";else if((day >= 50) && (day <= 80))return "星座: Pisces \n双鱼座 \n02月19日--03月20日 \n构成元素:\n水 \n颜色:蓝\n浮生幻化,\n犹记当年月下,\n红线千匝眉笔朱砂,\n如今,别后她嫁。";else if((day >= 81) && (day <= 111))return "星座: Aries \n白羊座 \n03月21日--04月20日 \n构成元素:火 \n颜色:红\n我且逍遥山水人家,\n  闲话桑麻。\n听一曲琵琶,\n曲终后,再无牵挂。";else if((day >= 112) && (day <= 141))return "星座: Taurus \n金牛座 \n04月21日--05月20日 \n构成元素:土 \n颜色:绿\n花前饮茶,\n镜前遗留的是谁的白发?\n梦里却再无她,\n入土为安也罢,\n弹指不过一霎。";else if((day >= 142) && (day <= 173))return "星座: Gemini \n双子座 \n05月21日--06月21日 \n构成元素:空气 \n颜色:黄\n金堂玉马,玉人风华,\n不于我浪迹天涯,\n遍看朝夕烟霞。";else if((day >= 174) && (day <= 204))return "星座: Cancer \n巨蟹座 \n06月22日--07月22日 \n构成元素:水 \n颜色:白\n江山如画,山河戎马。\n我逐鹿天下,\n守你盛世容华。";else if((day >= 205) && (day <= 235))return "星座: Leo \n狮子座 \n07月23日--08月22日 \n构成元素:火 \n颜色:橙\n策马飞沙,风云叱咤。\n纵这江山崩塌,寄人篱下,\n也护你一步一莲华。";else if((day >= 236) && (day <= 266))return "星座: Virgo \n处女座 \n08月23日--09月22日 \n构成元素:土 \n颜色:灰\n我拱手天下,许你两袖烟花,\n那,\n若我化土为沙,\n你可会为我祭酒扫茶?";else if((day >= 267) && (day <= 296))return "星座: Libra \n天秤座 \n09月23日--10月22日 \n构成元素:空气 \n颜色:淡红\n雪落窗纱,佳人韶华。\n谁能覆我秒音高寡,叶桥佛刹?";else if((day >= 297) && (day <= 326))return "星座: Scorpio \n天蝎座 \n10月23日--11月21日 \n构成元素:水 \n颜色:深红\n明月无暇,城池暗哑。\n你说君临天下,\n维我一方繁华,\n再见后却是风流飒沓,生死无话。";else if((day >= 327) && (day <= 356))return "星座: Sagittarius \n射手座 \n11月22日--12月21日 \n构成元素:火 \n颜色:紫红\n当时醉卧桃花,\n见你琴瑟饮茶,\n梦我一世相思入画,\n明眸刹那。";elsereturn "星座: Capricom \n摩羯座 \n12月22日--01月19日 \n构成元素:土 \n颜色:黑\n草庐为家,我愿半生换作浮华,\n一缕炊烟披霞,一件清酒词话。";}else{if((day >= 20) && (day <= 49))return "星座: Aquarius \n水瓶座 \n01月20日--02月18日 \n构成元素:空气 \n颜色:黑\n  泼墨吹烛,\n我自赏遍红尘蒹葭,  \n点笔寒桠,\n为你温纸入画。";else if((day >= 50) && (day <= 79))return "星座: Pisces \n双鱼座 \n02月19日--03月20日 \n构成元素:\n水 \n颜色:蓝\n浮生幻化,\n犹记当年月下,\n红线千匝眉笔朱砂,\n如今,别后她嫁。";else if((day >= 80) && (day <= 110))return "星座: Aries \n白羊座 \n03月21日--04月20日 \n构成元素:火 \n颜色:红\n我且逍遥山水人家,\n  闲话桑麻。\n听一曲琵琶,\n曲终后,再无牵挂。";else if((day >= 111) && (day <= 140))return "星座: Taurus 金牛座 \n04月21日--05月20日 \n构成元素:土 \n颜色:绿\n花前饮茶,镜前遗留的是谁的白发?梦里却再无她,入土为安也罢,弹指不过一霎。";else if((day >= 141) && (day <= 172))return "星座: Gemini \n双子座 \n05月21日--06月21日 \n构成元素:空气 \n颜色:黄\n金堂玉马,玉人风华,\n不于我浪迹天涯,\n遍看朝夕烟霞。";else if((day >= 173) && (day <= 203))return "星座: Cancer \n巨蟹座 \n06月22日--07月22日 \n构成元素:水 \n颜色:白\n江山如画,山河戎马。\n我逐鹿天下,\n守你盛世容华。";else if((day >= 204) && (day <= 234))return "星座: Leo \n狮子座 \n07月23日--08月22日 \n构成元素:火 \n颜色:橙\n策马飞沙,风云叱咤。\n纵这江山崩塌,寄人篱下,\n也护你一步一莲华。";else if((day >= 235) && (day <= 265))return "星座: Virgo \n处女座 \n08月23日--09月22日 \n构成元素:土 \n颜色:灰\n我拱手天下,许你两袖烟花,\n那,\n若我化土为沙,\n你可会为我祭酒扫茶?";else if((day >= 266) && (day <= 295))return "星座: Libra \n天秤座 \n09月23日--10月22日 \n构成元素:空气 \n颜色:淡红\n雪落窗纱,佳人韶华。\n谁能覆我秒音高寡,叶桥佛刹?";else if((day >= 296) && (day <= 325))return "星座: Scorpio \n天蝎座 \n10月23日--11月21日 \n构成元素:水 \n颜色:深红\n明月无暇,城池暗哑。\n你说君临天下,\n维我一方繁华,\n再见后却是风流飒沓,\n生死无话。";else if((day >= 326) && (day <= 355))return "星座: Sagittarius \n射手座 \n11月22日--12月21日 \n构成元素:火 \n颜色:紫红\n当时醉卧桃花,\n见你琴瑟饮茶,\n梦我一世相思入画,\n明眸刹那。";elsereturn "星座: Capricom \n摩羯座 \n12月22日--01月19日 \n构成元素:土 \n颜色:黑\n草庐为家,我愿半生换作浮华,\n一缕炊烟披霞,一件清酒词话。";}}private boolean leap(int years){if(((years%100 != 0) && (years%4 == 0)) || (years%400 == 0)) {return true;}else {return false;}}
    }
  • Android 界面部分:该部分共分为5个界面,有登录界面、选择界面、三个填写信息的界面

  • 登陆界面 MainActivity, 界面的跳转和弹出对话框两个部分

    public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Toast toast = Toast.makeText(this,"触屏进入",Toast.LENGTH_SHORT);toast.show();ImageView imageview = (ImageView)findViewById(R.id.imageview);imageview.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {new AlertDialog.Builder(MainActivity.this).setTitle("程序提示").setMessage("计算有风险,仅供参考与娱乐。").setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Intent intent = new Intent(MainActivity.this,SecondActivity.class);startActivity(intent);}}).setNegativeButton("退出", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();finish();}}).show();}});}
    }
  • 选择界面 SecondActivity,用来确定是填写“年月日”来计算,还是填写“今年年龄”来计算。利用弹出的对话框来进行选择,不同的选择将会开启不同的活动界面。与登陆界面类似,同样都是利用跳转和对话框两部分。

    public class SecondActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_second);MediaPlayer player = MediaPlayer.create(this,R.raw.sevenyears);player.start();Toast toast = Toast.makeText(this, "欢迎使用时间计算器,\n  请点击右下方按钮。", LENGTH_LONG);toast.show();// 进行选择是已知年龄还是出生日期Button button = (Button) findViewById(R.id.button);button.setOnClickListener(new myButtonListener());}public class myButtonListener implements View.OnClickListener{@RequiresApi(api = Build.VERSION_CODES.O)@Overridepublic void onClick(View v) {new AlertDialog.Builder(SecondActivity.this).setTitle("程序提示").setMessage("根据需要进行选择").setPositiveButton("已知出生日期", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Intent intent1 = new Intent(SecondActivity.this, ThridActivity.class);startActivity(intent1);}}).setNegativeButton("已知现在年龄", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Intent intent2 = new Intent(SecondActivity.this, ForthActivity.class);startActivity(intent2);}}).show();}}
    }
  • 填写信息界面 ThridActivity ForthActivity FifthActivity,三个界面利用到之前编写的Java代码,将根据用户填写的信息,进行确定相关信息宾显示在界面上。其中ThridActivity是根据“年月日”来确定相关内容的,显示出的内容有用户的出生日期(阴历)和生肖以及今年是否过生日了;ForthActivity是根据“今年年龄”来确定相关内容,比如他的出生年份,因为只知道他的岁数,所以其他的算不了;FifthActivity是在此基础上再用一个出生时间来计算用户的生辰八字(此部分是用网上的算法,所以准确性有待真正的会算的人检验)

    public class ThridActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_thrid);ImageButton button1 = (ImageButton)findViewById(R.id.imageButton);button1.setOnClickListener(new myButtonListener1());Button button2 = (Button)findViewById(R.id.button);button2.setOnClickListener(new myButtonListener2());}public class myButtonListener1 implements View.OnClickListener{@RequiresApi(api = Build.VERSION_CODES.O)@Overridepublic void onClick(View v) {EditText editText1 =(EditText) findViewById(R.id.editText1);EditText editText2 = (EditText)findViewById(R.id.editText2);EditText editText3 = (EditText)findViewById(R.id.editText3);int nian = Integer.parseInt(editText1.getText().toString());int yue = Integer.parseInt(editText2.getText().toString());int ri = Integer.parseInt(editText3.getText().toString());Age age = new Age();String nianling = age.years(nian,yue,ri);SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");Calendar cal = Calendar.getInstance();String baizi = nian + "-" + yue + "-" + ri;try {cal.setTime(sdf.parse(baizi));} catch (ParseException e) {e.printStackTrace();}Bazi lunar = new Bazi(cal);String yinli = lunar.toString();//判断是否今年生日已经过去LocalDate localdate1 = LocalDate.of(LocalDate.now().getYear(),yue,ri);LocalDate localdate2 = LocalDate.now();Period period = Period.between(localdate1,localdate2);if(localdate1.isAfter(localdate2)) {TextView textView = (TextView)findViewById(R.id.textView1);textView.setText("年龄:" + nianling + "岁\n阴历日期:" +  yinli +"\n今年生日未过,距离过生日还有" + period.getMonths() + "月" + period.getDays() + "天");} else{TextView textView = (TextView)findViewById(R.id.textView1);textView.setText("年龄:" + nianling + "岁\n阴历日期:" +  yinli + "\n今年生日已过" + period.getMonths() + "月" + period.getDays() + "天");Toast toast = Toast.makeText(ThridActivity.this, "想算你的星座和生辰八字么?\n  点击右上方的按钮,快来吧!", LENGTH_LONG);toast.show();}}}public class myButtonListener2 implements View.OnClickListener{@RequiresApi(api = Build.VERSION_CODES.O)@Overridepublic void onClick(View v){Intent intent = new Intent(ThridActivity.this,FifthActivity.class);startActivity(intent);}}
    }
    public class ForthActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_forth);ImageButton imagebutton1 = (ImageButton)findViewById(R.id.imageButton1);imagebutton1.setOnClickListener(new myButtonListener1());Button button = (Button)findViewById(R.id.button);button.setOnClickListener(new myButtonListener2());}public class myButtonListener1 implements View.OnClickListener{@RequiresApi(api = Build.VERSION_CODES.O)@Overridepublic void onClick(View v){EditText editText = (EditText)findViewById(R.id.editText);LocalDate csnian = LocalDate.now().minusYears(Integer.valueOf(editText.getText().toString()));EditText editText4 = (EditText)findViewById(R.id.editText4);editText4.setText(String.valueOf(csnian.getYear()));Toast toast = Toast.makeText(ForthActivity.this,  "想算你的星座和生辰八字么?\n  点击右上方的按钮,快来吧!", LENGTH_LONG);toast.show();}}public class myButtonListener2 implements View.OnClickListener{@RequiresApi(api = Build.VERSION_CODES.O)@Overridepublic void onClick(View v){Intent intent = new Intent(ForthActivity.this,FifthActivity.class);startActivity(intent);}}
    }
    public class FifthActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_fifth);Toast toast = Toast.makeText(this,"点击奇异博士,让他给你算算!",Toast.LENGTH_LONG);toast.show();ImageButton imagebutton = (ImageButton)findViewById(R.id.imageButton2);imagebutton.setOnClickListener(new myButtonListener());}public class myButtonListener implements View.OnClickListener{@RequiresApi(api = Build.VERSION_CODES.O)@Overridepublic void onClick(View v) {final ImageView imageView = (ImageView)findViewById(R.id.imageView4);imageView.setVisibility(View.VISIBLE);Animation animation = new AlphaAnimation(1.0f, 0.0f);animation.setDuration(1000);animation.setFillAfter(false);animation.setAnimationListener(new Animation.AnimationListener() {@Overridepublic void onAnimationStart(Animation animation) {// TODO Auto-generated method stub}@Overridepublic void onAnimationEnd(Animation animation) {// TODO Auto-generated method stubimageView.setVisibility(View.GONE);}@Overridepublic void onAnimationRepeat(Animation animation) {// TODO Auto-generated method stub}});imageView.startAnimation(animation);EditText editText5 =(EditText) findViewById(R.id.editText5);EditText editText6 = (EditText)findViewById(R.id.editText6);EditText editText7 = (EditText)findViewById(R.id.editText7);EditText editText8 = (EditText)findViewById(R.id.editText8);int nian = Integer.parseInt(editText5.getText().toString());int yue = Integer.parseInt(editText6.getText().toString());int ri = Integer.parseInt(editText7.getText().toString());int tian = Integer.parseInt(editText8.getText().toString());ShiChen shichen = new ShiChen();int hours = shichen.shichen(tian);//星座Age age = new Age();String xingzuo = age.constellation(nian,yue,ri);//生辰八字SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");Calendar cal = Calendar.getInstance();String baizi = nian + "-" + yue + "-" + ri;try {cal.setTime(sdf.parse(baizi));} catch (ParseException e) {e.printStackTrace();}Bazi lunar = new Bazi(cal);String bazi = lunar.getYearGanZhi(hours);TextView textView2 = (TextView)findViewById(R.id.textView2);TextView textView3 = (TextView)findViewById(R.id.textView3);textView2.setText(xingzuo);textView3.setText(bazi);}}
    }

Save Iron Man

项目介绍

  • 项目名称:

    • Save Iron Man
  • 项目简介:
    • 本项目基于Java语言和Anroid Studio软件,一款复仇者联盟版的打地鼠游戏。
  • 使用说明:
    • 本款APP通过建立相关故事情节,模拟打地鼠游戏机制,将复仇者联盟与打地鼠游戏相关结合,创造出一款“Save Iron Man”的单机游戏。

需求分析

  • 本款产品是一款基于打地鼠开发出的致敬钢铁侠经典桥段的小游戏,由于开发者是一个钢铁侠迷,所以整个打地鼠游戏全部是钢铁侠风格。本款游戏从复仇者联盟1和复仇者联盟3的经典片段中进行截取,创意设想将钢铁侠融入得到打地鼠角色当中,为钢铁侠迷提供一款怀念的小游戏。

  • 产品图标

相关过程分析

  • 本项目共5个活动界面,登陆界面、情节界面、游戏界面、情节界面、付费界面

  • 登陆界面 MainActivity,该界面放了一张我PS过的图片,用来提高游戏感觉,用到的是跳转和对话框两部分。

    public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Toast toast = Toast.makeText(MainActivity.this,"触屏开始",Toast.LENGTH_SHORT);toast.show();ImageView imageview1 = (ImageView)findViewById(R.id.imageView1);imageview1.setOnClickListener (new View.OnClickListener() {@Overridepublic void onClick(View v) {new AlertDialog.Builder(MainActivity.this).setTitle("程序提示").setMessage("本产品为休闲类游戏,仅供娱乐。").setPositiveButton("开始", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Intent intent = new Intent(MainActivity.this,SecondActivity.class);startActivity(intent);}}).setNegativeButton("退出", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();finish();}}).show();}});}
    }
  • 情节界面 SecondActivity ForthActivity 这两个部分一个是玩游戏之前的故事情节和玩游戏之后的故事情节,两部分用到了帧动画的形式进行一帧一帧的播放动画。此外,在点击结束动画弹出的对话框中将退出和不退出都将会跳转到付费界面进行付费。

    public class SecondActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_second);LinearLayout ll = (LinearLayout)findViewById(R.id.ll);final AnimationDrawable anim = (AnimationDrawable)ll.getBackground();anim.setOneShot(true);anim.start();ll.setOnClickListener(new View.OnClickListener(){@Overridepublic void onClick(View v){Intent intent = new Intent(SecondActivity.this,ThirdActivity.class);startActivity(intent);}});}
    }
    public class ForthActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_forth);LinearLayout l = (LinearLayout)findViewById(R.id.ff);final AnimationDrawable animtion = (AnimationDrawable)l.getBackground();animtion.setOneShot(true);animtion.start();l.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {new AlertDialog.Builder(ForthActivity.this).setTitle("程序提示").setMessage("退出程序").setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Intent intent = new Intent(ForthActivity.this,FifthActivity.class);startActivity(intent);}}).setNegativeButton("退出", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Intent intent = new Intent(ForthActivity.this,FifthActivity.class);startActivity(intent);}}).show();}});}
    }
  • 游戏界面 ThirdActivity,这部分是最为主要的部分,我通过其他程序确定了图片上每个洞口的位置,并存入一个数组内进行随机出现,这就可以随机产生“出洞”的效果,我们还添加了一个背景音乐的,和提示动画,此外我们在内部机制中进行预判当打到20只的时候就会自动跳转到结束界面,无需用户手动跳转就可实现。但是,在跳转的过程中一直 不是很流畅,所以显示的很僵硬的感觉。

    public class ThirdActivity extends AppCompatActivity {private int i = 0;private ImageView gangtiexia;private Handler handler;public int[][] position = new int[][]{{963,365},{1308,337},{1544,413},{1009,445},{1456,541},{971,621},{793,518},{445,474}};private boolean isPause = false;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_third);final ImageView imageView = (ImageView)findViewById(R.id.imageView4);imageView.setVisibility(View.VISIBLE);Animation animation = new AlphaAnimation(1.0f, 0.0f);animation.setDuration(5000);animation.setFillAfter(false);animation.setAnimationListener(new Animation.AnimationListener() {@Overridepublic void onAnimationStart(Animation animation) {// TODO Auto-generated method stub}@Overridepublic void onAnimationEnd(Animation animation) {// TODO Auto-generated method stubimageView.setVisibility(View.GONE);}@Overridepublic void onAnimationRepeat(Animation animation) {// TODO Auto-generated method stub}});imageView.startAnimation(animation);gangtiexia = (ImageView)findViewById(R.id.imageView3);gangtiexia.setOnTouchListener(new View.OnTouchListener() {public boolean onTouch(View v, MotionEvent event){v.setVisibility(View.INVISIBLE);i++;Toast toast=Toast.makeText(ThirdActivity.this,"捕捉到" + i + "只钢铁侠!", Toast.LENGTH_LONG);showMyToast(toast,10*10);if (i == 20){Intent intent = new Intent(ThirdActivity.this,ForthActivity.class);startActivity(intent);}return false;}});handler = new Handler(){@Overridepublic void handleMessage(Message msg){int index = 0;if(msg.what == 0x101){index = msg.arg1;gangtiexia.setX(position[index][0]);gangtiexia.setY(position[index][1]);gangtiexia.setVisibility(View.VISIBLE);}super.handleMessage(msg);}};Thread t = new Thread(new Runnable() {@Overridepublic void run() {int index = 0;while (!Thread.currentThread().isInterrupted()){index = new Random().nextInt(position.length);Message m = handler.obtainMessage();m.arg1 = index;m.what = 0x101;handler.sendMessage(m);try{Thread.sleep(new Random().nextInt(500) + 500);}catch (InterruptedException e) {e.printStackTrace();}}}});t.start();final MediaPlayer player = MediaPlayer.create(this,R.raw.something);Button button = (Button)findViewById(R.id.button);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if(player.isPlaying()&&!isPause){player.pause();isPause = true;((Button)v).setText("背景音乐播放");}else{player.start();((Button)v).setText("背景音乐暂停");isPause = false;}}});}public void showMyToast(final Toast toast, final int cnt) {final Timer timer =new Timer();timer.schedule(new TimerTask() {@Overridepublic void run() {toast.show();}},0,3000);new Timer().schedule(new TimerTask() {@Overridepublic void run() {toast.cancel();timer.cancel();}}, cnt );}protected void onResume() {if (getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);}super.onResume();}
    }
  • 付费界面 FifthActivity,该界面只是添加了一张二维码的图片供玩家进行付费支持的。

总结

  • 学习到的相关内容:

    • 帧动画 属性动画 时间类的学习 对话框 音乐 按钮和背景图 PS图片
  • 在尝试做暑假作业的时候,我并没有准备做游戏的APP,但是在做完时间计时器之后发现做的有些过于LOW,所以尝试这做了一款游戏。其实这款游戏的制作过程,不仅是在完成作业,更是满足我作为一个钢铁侠迷的热爱和致敬。两款APP的界面设计图片都是我用PS进行修改或是再加工的,在学习Android开发的同时,我也学习了一定的PS的知识。在整个编写的过程,做一款游戏的难度要远远高于应用程序的难度,尤其是调试的阶段,快要炸了也找不到错误所在。总体来说,满是心酸泪。。。

-因版权所限,未附相关APP程序图片,想体验的同学可以找我。

转载于:https://www.cnblogs.com/sanjinge/p/10164402.html

20172305 暑假作业 之 TimeCalculate Save Iron Man相关推荐

  1. 20172303 20172322 2017-2018-2 暑假作业 结对编程项目-舒尔特方格(及获小黄衫感想)...

    20172303 20172322 2017-2018-2 暑假作业 结对编程项目-舒尔特方格(及获小黄衫感想) 项目介绍 结对伙伴 姓名:张昊然 学号:20172322 舒尔特方格简介 舒尔特方格是 ...

  2. c语言暑假作业,暑假作业的答案

    2016年的暑假过去一半咯,同学们还记得有暑假作业这回事吗?下面有应届毕业生小编整理的暑假作业的.答案,欢迎借鉴! 第2页 欣喜若狂.满怀期待.浮想联翩 衰落 蓑衣 瞻仰 屋檐 灵魂 瑰宝 沙漠 寂寞 ...

  3. 20172321 20172333 2017-2018 暑假作业APP

    20172321 20172333 2017-2018 暑假作业APP 项目介绍 项目成员 吴恒佚 20172321 严域俊 20172333 项目简介 从理论上来说,这是一个贪吃蛇游戏. <贪 ...

  4. 00后写个暑假作业,被监控成这笔样

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 羿阁 萧箫 发自 凹非寺 量子位 | 公众号 QbitAI 乍一看, ...

  5. web大作业介绍自己的家乡_四年级暑假作业

    四 年 级 天净沙 宅家 读书 写字 画画 洗衣 拖地 浇花 观影 听歌 玩耍 日积月累学语文 写给同学们: 亲爱的同学们: 席卷全球的新冠疫情,让我们度过了一个特殊的学期.疫情改变了我们的学习方式, ...

  6. compiti delle vacanze 暑假作业

    www.baoguozoom.xunzai.com      包国工作室  2012.06.06               compiti delle vacanze 1.metti l" ...

  7. 20172303 20172322 2017-2018-2 暑假作业 结对编程项目-舒尔特方格(增补:计时器的加入与页面优化)...

    增补:计时器的加入. 增补计时器的原因及动机 app本身过于简单,在课上展示过后显得过于单薄. 学姐提出了一些建议. 想多加分. 添加过程 因为我们之前在做app的时候就已经想到加入计时器,但由于当时 ...

  8. 续·给大侄子写个暑假作业开心【并不】网之从0开始获取题目数据

    经过层层努力还是失败了..TMD实在是有懒得找格式统一的题目的网站了. 但是,段某人眉头一皱发现事情还可以更加复杂 于是百度下了一份word,标题是小学语文选择题100道,寻思,哎?还挺好.下载.文档 ...

  9. 80×60长40米的地笼,80×60长40米的地笼_暑假作业:毫米、厘米、分米、米和千米的计算专项练习,附答案......

    孩子二年级开始学习长度单位米和厘米,三年级开始接触毫米.分米和千米,这几个长度单位是小学阶段最常考的长度单位. 在图形周长和路程问题中,常常用用到单位 计算和转换. 下面这份练习主要针对的就是这五个长 ...

  10. java暑假_Java暑假作业

    ##一.<大护法>观影有感 ...![](https://imgsa.baidu.com/forum/w%3D580/sign=fcd46a0838adcbef01347e0e9cae2e ...

最新文章

  1. 第1关:求1000以内所有的水仙花数
  2. VC++在对话框中加入属性页
  3. 数据结构源码笔记(C语言):线性表的单链表示
  4. 【Linux网络编程】原始套接字编程
  5. java利用intellij进行类型推断
  6. iOS的推送证书过期的处理
  7. 【牛客 - 181B】送分题(另类求解a+b,二分)
  8. Log4j2进阶使用(按大小时间备份日志)
  9. js detect the type of device
  10. 济南python工资一般多少-2020年济南学python好点的学校
  11. Python中报错:系统找不到指定的文件;浏览器似乎在未打开之前就已经退出解决方法...
  12. SLAM_ORB-SLAM3回环检测是怎么做的?
  13. php生成excel完整实例代码,PHP输出Excel实例代码
  14. ECO生态币官网blog.sina.com.cn/ecocoin
  15. 微信小程序demo汇总
  16. 勘测定界坐标交换格式文本文件转换成 shapefile 格式
  17. python 道生一,一生二,二生三,三生万物
  18. Android的权限声明
  19. 【Python】pandas的使用——CSV文件、Excel文件、TXT文件之间的转换
  20. 计算机图形学矩形_《交互式计算机图形学》读书笔记 —— 第一章、图形系统和模型...

热门文章

  1. SQLAlchemy黄金体验
  2. laravel中提供DB facade(原始查找)、查询构造器、Eloquent ORM三种操作数据库方式
  3. 95后,我们一起看过的剧
  4. 京东联盟的开放平台的Python客户端封装
  5. js 生成20内加减法(大概率是用于验证码)
  6. 数据结构-学习笔记整理
  7. 读《春秋》有感之十九:晋之霸业衰落
  8. 推荐双11书单,我们一起共读 36 + 1 本书
  9. 密立根油滴实验的c语言程序,密立根油滴实验数据处理程序c++
  10. python爬取58同城二手房信息_动手写爬虫(2):爬取58同城二手物品信息