基于Android日历及记事功能完整实现.docx
- 文档编号:26901115
- 上传时间:2023-06-23
- 格式:DOCX
- 页数:39
- 大小:643.70KB
基于Android日历及记事功能完整实现.docx
《基于Android日历及记事功能完整实现.docx》由会员分享,可在线阅读,更多相关《基于Android日历及记事功能完整实现.docx(39页珍藏版)》请在冰豆网上搜索。
基于Android日历及记事功能完整实现
《移动通信程序设计》
课程设计
题目基于andriod的记事功能的日历
院系
专业
学生姓名
学号
二O一四年六月九日
实现基于Android的日历及记事功能系统
摘要:
Android作为目前较为流行的智能手机操作系统已成为大多数人的首选。
在美国乃至世界的很多地方的出货量已经超越Iphone,成为世界上最大智能手机操作系统。
因此,世界各地的程序员都跃跃欲试地想学习Android的开发,并希望从中捞得属于自己的第一桶金。
在此给出一个基于Android的日历系统的完整实现过程。
关键词:
Android;日历;记录;提醒
1概述
在日常工作中,特别强调时间的重要性,需要完成的事情也越来越多,因此对日历的需求也是巨大的,由于在日常生活中我们不可能将随身携带,我们可以将软件做到移动终端,在此情形下,基于andriod的技术带有记事功能的日历就诞生。
要实现的日历除了常规的日历功能外,还可以显示与当前日期相关的信息,如今天是今年的第几周等等。
效果如图1、图2所示。
图1在手机上所显示的日历图标
图2日历的主界面
2总体设计
对于andriod的开发的日历的应该一开始显示日历,然后登陆,进行记事,主要流程图如下:
N
Y
N
Y
Y
N
Y
Y
N
Y
N
3详细设计
3.1、绘画基础
由于实现的日历系统要涉及文本技术,因此,要简单介绍Android的文本技术。
通常在Android.view.View或其子类的onDraw方法中进行。
该方法的定义如下:
protectedvoidonDraw(Canvascanvas);
其中Canvas对象提供了大量用于绘图的方法,这些方法主要包括绘制像素点、直线、圆形、弧、文本,这些都是组成复杂图形的基本元素。
如果要画更复杂的图形,可以采用组合这些图形基本元素的方式来完成,下面来看一下文本基本方法。
绘制text指定的文本方法是:
publicnativevoiddrawText(Stringtext,floatx,floaty,Paintpaint);
绘制text指定的文本。
文本中的每一个字符的起始坐标由pos数组中的值决定方法是:
publicvoiddrawPosText(Stringtext,float[]pos,Paintpaint);
绘制text指定的文本。
text中的每一个字符的起始坐标由pos数组中的值决定。
并且可以选择text中的某一段连续的字符绘制的方法是:
publicvoiddrawPosText(char[]text,intindex,intcount,float[]pos,Paintpaint);
参数的含义如下:
(1)text:
drawText方法中的text参数表示要绘制的文本。
drawPostText方法中的text虽然也表示要绘制的文本,但每一
个字符的坐标需要单独指定。
如果未指定某个字符的坐标,系
统会抛出异常。
(2)x:
绘制文本的起始点的横坐标。
(3)y:
绘制文本的起始点的纵坐标。
(4)index:
选定的字符集合在text数组中的索引。
(5)count:
选定的字符集中字符个数。
3.2框架绘画
从图2可以看出,日历的上部是3行文字,显示了当前日期的相关信息。
下面来看看如何布局显示这些文字的组件。
在日历主界面的上半部需要放置4个组件,1个ImageView组件和3个TextView组件。
其中ImageView组件用于显示左上角的图像。
3个TextView组件用于显示当前日期的信息。
由于目前还没有当前日期的信息。
因此,这3个TextView组件暂时设置了固定的信息。
下面开始在main.xml文件中设置这4个组件。
在修改main.xml文件的内容之前,先复制一个calendar.png文件,作为日历的logo(修改AndroidManifest.xml文件中的应用程序图标)。
建立一个Calendar工程,并编写main.xml文件。
xmlversion="1.0"encoding="utf-8"?
>
android="http: //schemas.android. com/apk/res/android" android: orientation="vertical"android: layout_width=" fill_parent" android: layout_height="fill_parent"android: background=" @color/calendar_background"> --android: background=" @drawable/background"--> id="@+id/calHeader"android: layout_width="fill_parent" android: layout_height="70dp"> id="@+id/ivLogo"android: src="@drawable/calendar_bak" android: layout_width="@dimen/logo_size"android: layout_height="@dimen/logo_size" android: layout_margin="@dimen/margin"/> layout_width="fill_parent" android: layout_height="wrap_content"android: layout_toRightOf="@id/ivLogo" android: layout_marginTop="@dimen/margin" android: orientation="vertical"> id="@+id/tvMsg1"android: layout_width="fill_parent" android: layout_height="wrap_content" android: textColor="@color/text_color"/> id="@+id/tvMsg2" android: layout_width="fill_parent" android: layout_height="wrap_content" android: textColor="@color/text_color"/> id="@+id/tvMsg3"android: layout_width="fill_parent" android: layout_height="wrap_content" android: textColor="@color/text_color"/> 下面在Main类的Oncreate方法中编写代码装载main.xml: publicvoidonCreate(BundlesavedInstanceState) { super.onCreate(savedInstanceState); LinearLayoutmainLayout=(LinearLayout)getLayoutInflater(). inflate(R.layout.main,null); setContentView(mainLayout); //需要向mainLayout中加入日历网络 } 在绘制日历之前,要先介绍一下日历绘制的方法。 虽然从底层技术来看,绘制日历是在onDraw方法中完成的。 但在本系统中将要绘制的部分分成了很多块。 而这些要绘制的块都需要放在一个叫CalendarView的类中,代码如下: publicclassCalendarViewextendsView { privateActivityactivity; @Override protectedvoidonDraw(Canvascanvas) {} publicCalendarView(Activityactivity) { super(activity); this.activity=activity; } } 在编写完CalendarView类后,需要在Main类中定义该类的变量,并在onCreate方法中创建类的对象实例,代码如下: privateCalendarViewcalendarView; calendarView=newCalendarView(this); mainLayout.addView(calendarView); 在前面已经介绍过,在本系统中会将要绘制的日历分成若干块,而每一块都需要有同样的接口,以便统一绘制它们。 因此,这些块都要实现一个CalendarElement接口。 这些要绘制的块包括日历边框、网络、日历头等,而在CalendarElement接口中有一个draw方法。 在绘制日历元素时只需调用draw方法即可。 在后面的实现中会看到更多实现CalendarElement接口的类,下面先来编写CalendarElement接口。 packageproject.calendar.interfaces; importandroid.graphics.Canvas; publicinterfaceCalendarElement { publicvoiddraw(Canvascanvas); } packageproject.calendar.interfaces; importandroid.graphics.Canvas; publicinterfaceCalendarElement { publicvoiddraw(Canvascanvas); } 现在需要一个总的类来绘制上述的这些块。 这个功能由Calendar类来完成。 Calendar是一个总的日历元素类,在该类的draw方法中绘制了所有的日历元素。 Calendar是第一个实现CalendarElement接口的类,代码如下: publicclassCalendarextendsCalendarParent { //elements用于保存多功能日历中所有的日历元素 privateArrayList ArrayList publicCalendar(Activityactivity,Viewview) { super(activity,view); } @Override publicvoiddraw(Canvascanvas) { //在draw方法中通过扫描elements变量来获得所 //有日历元素的对象,并调用draw方法绘制这些日历元素 for(CalendarElementce: elements) ce.draw(canvas); } } 在CalendarView类中需要调用Calendar类来绘制日历,因此,需要在CalendarView类中创建Calendar类的对象实例,并调用draw进行绘制,代码如下: publicCalendarce; @Override protectedvoidonDraw(Canvascanvas) { ce.draw(canvas); } publicCalendarView(Activityactivity) { ce=newCalendar(activity,this); } 下面编写第一个绘制元素类: Border。 Border类用于绘制日历的边框,该类是日历元素类,需要实现CalendarElement接口,不过该类只要继承刚实现的CalendarParent类即可。 publicclassBorderextendsCalendarParent { publicBorder(Activityactivity,Viewview) { super(activity,view); //注意,一定要4个字节的颜色值,包括一个透明色 paint.setColor(0xFFFFFFFF); } @Override publicvoiddraw(Canvascanvas) { floatleft=borderMargin; floattop=borderMargin; floatright=view.getMeasuredWidth()-left; floatbottom=view.getMeasuredHeight()-top; canvas.drawLine(left,top,right,top,paint); canvas.drawLine(right,top,right,bottom,paint); canvas.drawLine(right,bottom,left,bottom,paint); canvas.drawLine(left,bottom,left,top,paint); Log.d("draw",String.valueOf(right)); } } Grid类用于绘制日历的网格,该类是日历元素类,需要继承CalendarParent类。 publicclassGridextendsCalendarParent { privatefloattop,left; @Override publicvoiddraw(Canvascanvas) { left=borderMargin; top=borderMargin+weekNameSize+weekNameMargin* 2+4; floatcalendarWidth=view.getMeasuredWidth()-left*2; floatcalendarHeight=view.getMeasuredHeight()-top- borderMargin; floatcellWidth=calendarWidth/7; floatcellHeight=calendarHeight/6; paint.setColor(0xFFFFFFFF); canvas.drawLine(left,top,left+view.getMeasuredWidth() -borderMargin*2,top,paint); paint.setColor(0xFF666666); //画横线 for(inti=1;i<6;i++) { canvas.drawLine(left,top+(cellHeight)*i,left+calendar- Width, top+(cellHeight)*i,paint); } //画竖线 for(inti=1;i<7;i++) { canvas.drawLine(left+cellWidth*i,top,left+cellWidth*i, view.getMeasuredHeight()-borderMargin,paint); }} publicGrid(Activityactivity,Viewview) { super(activity,view); //TODOAuto-generatedconstructorstub }} Week类用于显示日历网格上方的星期文本: publicclassWeekextendsCalendarParent { privateString[]weekNames=newString[] {"日","一","二","三","四","五","六"}; privateintweekNameColor; publicWeek(Activityactivity,Viewview) { super(activity,view); weekNameColor=Color.WHITE; paint.setTextSize(weekNameSize); } @Override publicvoiddraw(Canvascanvas) { floatleft=borderMargin; floattop=borderMargin; floateveryWeekWidth=(view.getMeasuredWidth()-borderMargin *2)/7; paint.setFakeBoldText(true); for(inti=0;i { if(i==0||i==weekNames.length-1) paint.setColor(sundaySaturdayColor); else paint.setColor(weekNameColor); left=borderMargin+everyWeekWidth*i +(everyWeekWidth-paint.measureText(weekNames[i]))/ 2; canvas.drawText(weekNames[i],left,top+paint.getTextSize ()+ weekNameMargin,paint); }}} 3.3核心技术 前面介绍了绘制日历的基本方法,现在将逐步接触到日历系统的核心技术。 首先来看一下日历中如何表示日期。 在Grid类中的days数组保存了42个数字。 这42个数字就是日历主界面中的6*7个方格中的数字。 这些数字分为两部分,中间的部分就是当前月中的天数。 这些天数最小是28天,最大是31天。 在这组数字的前后可以包含了上月的部分月末天数和下月部分月初天数。 当单击或触摸上月或下月的天数时,日历会跳到上月或下月。 这里内容在后面将详细介绍。 只介绍如何将这些数字绘制到这42个方格中。 为了区别这两类数字。 将在上月和下月的相应天数中加星号(*),代码如下: privateString[]days=newString[42]; publicintcurrentYear,currentMonth; publicintcurrentDay=-1,currentDay1=-1,currentDayIndex =-1; privatejava.util.Calendarcalendar=java.util.Calendar. getInstance(); 在Grid类的构造方法中初始化变量的代码如下: currentYear=calendar.get(calendar.YEAR); currentMonth=calendar.get(calendar.MONTH); 下面来编写一个getMonthDays方法,该方法用来获得指定月份的天数。 这个方法也是绘制指定月份的日历的基础,代码如下: privateintgetMonthDays(intyear,intmonth) { month++; switch(month) { case1: case3: case5: case7: case8: case10: case12: { return31; } case4: case6: case9: case11: { return30; } case2: { if(((year%4==0)&&(year%100! =0))||(year% 400==0)) return29; else return28; }} return0; } 下面到了关键时刻,需要基础出当前月的天数,以及上一月和下一月落在本月初和本月末的天数。 并将其放在days数组中。 代码如下: privatevoidcalculateDays() { //将当前日历设为指定月份的第一天 calendar.set(currentYear,currentMonth,1); //获得指定月份的第1天是当前周的第几天 intweek=calendar.get(calendar.DAY_OF_WEEK); intmonthDays=0; intprevMonthDays=0; //获得当前月有多少天 monthDays=getMonthDays(currentYear,currentMonth); //如果当前月是一年中的第一个月,则获得上一年最后一月 //(也就是12月)的天数 if(currentMonth==0) prevMonthDays=getMonthDays(currentYear-1,11); //否则,获得指定月上一月的天数 else prevMonthDays=getMonthDays(currentYear,current- Month-1); for(inti=week,day=prevMonthDays;i>1;i--,day--) { days[i-2]="*"+String.valueOf(day); } //设置指定月(在这里是当前月)的天数 for(intday=1,i=week-1;day<=monthDays;day++, i++) { days[i]=String.valueOf(day); if(day==currentDay) { //获得当前日在days数组中的索引 currentDayIndex=i; }} //设置下一月显示在本月日历后面的天数 for(inti=week+monthDay
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 Android 日历 记事 功能 完整 实现
![提示](https://static.bdocx.com/images/bang_tan.gif)