基于Android日历及记事功能完整实现_第1页
基于Android日历及记事功能完整实现_第2页
基于Android日历及记事功能完整实现_第3页
基于Android日历及记事功能完整实现_第4页
基于Android日历及记事功能完整实现_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、移动通信程序设计课程设计题 目 基于andriod的记事功能的日历 院 系 专 业 学生姓名 学 号 二一四年六月九日目 录1概述12 总体设计23详细设计33.1、绘画基础53.2框架绘画53.3 核心技术103.4 触摸事件143.5 键盘操作164进行编码:184.1登录184.2事情记录204.3 对闹铃的设置214.4记事列表234.5 闹铃244.6 对记事的编辑255 结束语266参考文献27实现基于Android 的日历及记事功能系统摘要: Android 作为目前较为流行的智能手机操作系统已成为大多数人的首选。在美国乃至世界的很多地方的出货量已经超越Iphone, 成为世界上

2、最大智能手机操作系统。因此, 世界各地的程序员都跃跃欲试地想学习Android 的开发, 并希望从中捞得属于自己的第一桶金。在此给出一个基于Android 的日历系统的完整实现过程。关键词: Android; 日历; 记录; 提醒1概述在日常工作中,特别强调时间的重要性,需要完成的事情也越来越多,因此对日历的需求也是巨大的,由于在日常生活中我们不可能将随身携带,我们可以将软件做到移动终端,在此情形下,基于andriod的技术带有记事功能的日历就诞生。要实现的日历除了常规的日历功能外, 还可以显示与当前日期相关的信息, 如今天是今年的第几周等等。效果如图1、图2 所示。图1 在手机上所显示的日历

3、图标图2 日历的主界面2 总体设计对于andriod的开发的日历的应该一开始显示日历,然后登陆,进行记事,主要流程图如下:开始 日历界面是否记事 N Y是否首次登陆输入密码 N Y设置密码需要做的事情是否设置闹铃设置闹铃 Y N记事列表是否编辑 Y是否闹铃设置闹铃 Y是否删除 N删除 Y N退出结束3详细设计3.1、绘画基础由于实现的日历系统要涉及文本技术,因此, 要简单介绍Android 的文本技术。通常在Android.view.View 或其子类的onDraw 方法中进行。该方法的定义如下:protected void onDraw(Canvas canvas);其中Canvas 对象提

4、供了大量用于绘图的方法, 这些方法主要包括绘制像素点、直线、圆形、弧、文本, 这些都是组成复杂图形的基本元素。如果要画更复杂的图形, 可以采用组合这些图形基本元素的方式来完成,下面来看一下文本基本方法。绘制text 指定的文本方法是:public native void drawText (String text, float x, float y, Paintpaint);绘制text 指定的文本。文本中的每一个字符的起始坐标由pos 数组中的值决定方法是:public void drawPosText(String text, float pos, Paint paint);绘制text

5、指定的文本。text 中的每一个字符的起始坐标由pos 数组中的值决定。并且可以选择text 中的某一段连续的字符绘制的方法是:public void drawPosText(char text, int index, int count, float pos,Paint paint);参数的含义如下:(1) text: drawText 方法中的text 参数表示要绘制的文本。drawPostText 方法中的text 虽然也表示要绘制的文本, 但每一个字符的坐标需要单独指定。如果未指定某个字符的坐标, 系统会抛出异常。(2) x: 绘制文本的起始点的横坐标。(3) y: 绘制文本的起始点的

6、纵坐标。(4) index: 选定的字符集合在text 数组中的索引。(5) count: 选定的字符集中字符个数。3.2框架绘画从图2 可以看出, 日历的上部是3 行文字, 显示了当前日期的相关信息。下面来看看如何布局显示这些文字的组件。在日历主界面的上半部需要放置4 个组件, 1 个ImageView组件和3 个TextView 组件。其中ImageView 组件用于显示左上角的图像。3 个TextView 组件用于显示当前日期的信息。由于目前还没有当前日期的信息。因此, 这3 个TextView组件暂时设置了固定的信息。下面开始在main.xml 文件中设置这4 个组件。在修改main.

7、xml 文件的内容之前, 先复制一个calendar.png 文件, 作为日历的logo (修改AndroidManifest.xml 文件中的应用程序图标)。建立一个Calendar 工程, 并编写main.xml 文件。下面在Main 类的Oncreate 方法中编写代码装载main.xml:public void onCreate(Bundle savedInstanceState)super.onCreate(savedInstanceState);LinearLayout mainLayout = (LinearLayout) getLayoutInflater().inflate(

8、R.layout.main, null);setContentView(mainLayout);/ 需要向mainLayout 中加入日历网络在绘制日历之前, 要先介绍一下日历绘制的方法。虽然从底层技术来看, 绘制日历是在onDraw 方法中完成的。但在本系统中将要绘制的部分分成了很多块。而这些要绘制的块都需要放在一个叫CalendarView 的类中, 代码如下:public class CalendarView extends Viewprivate Activity activity;Overrideprotected void onDraw(Canvas canvas)public C

9、alendarView(Activity activity)super(activity);this.activity = activity;在编写完CalendarView 类后, 需要在Main 类中定义该类的变量, 并在onCreate 方法中创建类的对象实例, 代码如下:private CalendarView calendarView;calendarView = new CalendarView(this);mainLayout.addView(calendarView);在前面已经介绍过, 在本系统中会将要绘制的日历分成若干块, 而每一块都需要有同样的接口, 以便统一绘制它们。因

10、此, 这些块都要实现一个CalendarElement 接口。这些要绘制的块包括日历边框、网络、日历头等, 而在CalendarElement 接口中有一个draw 方法。在绘制日历元素时只需调用draw 方法即可。在后面的实现中会看到更多实现CalendarElement接口的类, 下面先来编写CalendarElement 接口。package erfaces;import android.graphics.Canvas;public interface CalendarElementpublic void draw(Canvas canvas);p

11、ackage erfaces;import android.graphics.Canvas;public interface CalendarElementpublic void draw(Canvas canvas);现在需要一个总的类来绘制上述的这些块。这个功能由Calendar 类来完成。Calendar 是一个总的日历元素类, 在该类的draw 方法中绘制了所有的日历元素。Calendar 是第一个实现CalendarElement 接口的类, 代码如下:public class Calendar extends CalendarParent/

12、elements 用于保存多功能日历中所有的日历元素private ArrayList elements = newArrayList();public Calendar(Activity activity, View view)super(activity, view);Overridepublic void draw(Canvas canvas)/ 在draw 方法中通过扫描elements 变量来获得所/有日历元素的对象,并调用draw 方法绘制这些日历元素for (CalendarElement ce : elements)ce.draw(canvas);在CalendarView 类

13、中需要调用Calendar 类来绘制日历,因此,需要在CalendarView 类中创建Calendar 类的对象实例, 并调用draw 进行绘制, 代码如下:public Calendar ce;Overrideprotected void onDraw(Canvas canvas)ce.draw(canvas);public CalendarView(Activity activity)ce = new Calendar(activity, this);下面编写第一个绘制元素类: Border。Border 类用于绘制日历的边框, 该类是日历元素类, 需要实现CalendarElement

14、接口, 不过该类只要继承刚实现的CalendarParent 类即可。public class Border extends CalendarParentpublic Border(Activity activity, View view)super(activity, view);/ 注意,一定要4 个字节的颜色值,包括一个透明色paint.setColor(0xFFFFFFFF);Overridepublic void draw(Canvas canvas)float left = borderMargin;float top = borderMargin;float right = vi

15、ew.getMeasuredWidth() - left;float bottom = 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(rig

16、ht);Grid 类用于绘制日历的网格, 该类是日历元素类, 需要继承CalendarParent 类。public class Grid extends CalendarParentprivate float top, left;Overridepublic void draw(Canvas canvas)left = borderMargin;top = borderMargin + weekNameSize + weekNameMargin *2 + 4;float calendarWidth = view.getMeasuredWidth() - left * 2;float cale

17、ndarHeight = view.getMeasuredHeight () - top -borderMargin;float cellWidth = calendarWidth / 7;float cellHeight = calendarHeight / 6;paint.setColor(0xFFFFFFFF);canvas.drawLine(left, top, left + view.getMeasuredWidth()- borderMargin * 2, top, paint);paint.setColor(0xFF);/ 画横线for (int i = 1; i 6; i+)c

18、anvas.drawLine (left, top + (cellHeight) * i, left + calendar-Width,top + (cellHeight) * i, paint);/ 画竖线for (int i = 1; i 7; i+)canvas.drawLine(left + cellWidth * i, top, left + cellWidth * i,view.getMeasuredHeight() - borderMargin, paint);public Grid(Activity activity, View view)super(activity, vie

19、w);/ TODO Auto-generated constructor stubWeek 类用于显示日历网格上方的星期文本:public class Week extends CalendarParentprivate String weekNames = new String 日, 一, 二, 三, 四, 五, 六 ;private int weekNameColor;public Week(Activity activity, View view)super(activity, view);weekNameColor = Color.WHITE;paint.setTextSize(wee

20、kNameSize);Overridepublic void draw(Canvas canvas)float left = borderMargin;float top = borderMargin;float everyWeekWidth = (view.getMeasuredWidth () - borderMargin* 2) / 7;paint.setFakeBoldText(true);for (int i = 0; i 1; i-, day-)daysi - 2 = * + String.valueOf(day);/ 设置指定月(在这里是当前月)的天数for (int day =

21、 1, i = week - 1; day = monthDays; day+,i+)daysi = String.valueOf(day);if (day = currentDay)/ 获得当前日在days 数组中的索引currentDayIndex = i;/ 设置下一月显示在本月日历后面的天数for (int i = week + monthDays - 1, day = 1; i days.length;i+, day+)daysi = * + String.valueOf(day);下面的代码是本例中最核心的部分, 在onDraw 方法中绘制日历的主界面, 代码如下:/ 填充days

22、 数组calculateDays();java.util.Calendar calendar = java.util.Calendar.getInstance();int day = calendar.get(calendar.DATE);int myYear = calendar.get(calendar.YEAR),Int myMonth = calendar.get(calendar.MONTH);calendar.set(myYear, myMonth,1);int week = calendar.get(calendar.DAY_OF_WEEK);boolean flag = fal

23、se;在ondraw 方法中添加绘制日历的代码(2):for (int i = 0; i days.length; i+)today = false;int row = i / 7;int col = i % 7;String text = String.valueOf(daysi);/ 如果日历是周日、周六,并且是上一月和下一月的周六和周/日if (i % 7 = 0 | (i - 6) % 7 = 0) & text.startsWith(*)paint.setColor(0xFF);else if (i % 7 = 0 | (i - 6) % 7 = 0)paint.setColor(s

24、undaySaturdayColor);else if (text.startsWith(*) / 非周六周日,但为上一月的日期paint.setColor(0xFF);elsepaint.setColor(0xFFFFFFFF); / 普通日历/ 去掉上月一下月日期前的星号text = text.startsWith(*) ? text.substring(1) : text;paint.setTextSize(15);float textLeft = left + cellWidth * col+ (cellWidth - paint.measureText(text) / 2;float

25、 textTop = top + cellHeight * row+ (cellHeight - paint.getTextSize() / 2 + 11;/ 绘制方格中的文字canvas.drawText(text, textLeft, textTop, paint);/ 会战表示当前日历的图像if (myYear = currentYear & myMonth = currentMonth& i = todayIndex)paint.setColor(Color.RED);Bitmap bitmap = BitmapFactory.decodeResource(activity.getRe

26、sources(), R.drawable.day);Rect src = new Rect();src.left = 0;src.top = 0;src.right = bitmap.getWidth();src.bottom = bitmap.getHeight();Rect dst = new Rect();dst.left = (int) (left + cellWidth * col);dst.top = (int) (top + cellHeight * row);dst.bottom = (int) (dst.top + cellHeight + 1);dst.right = (

27、int) (dst.left + cellWidth + 1);/ 绘制表示当前日期的图像canvas.drawBitmap(bitmap, src, dst, paint);3.4 触摸事件现在为日历添加一系列动画。首先需要添加的是日历的触摸事件。由于所实现的日历都是通过绘制完成的, 因此, 在触摸时必须要判断触摸的位置, 以确定触摸的是日历的哪一部分。例如, 触摸的是哪一天。下面来看看如何为日历添加触摸事件。首先添加两个变量, 用于保存当前触摸的坐标。默认值都是-1, 表示用户还未触摸:private float cellX = -1, cellY = -1;再加两个setter 方法用来

28、设置这个值:public void setCellX(float cellX)this.cellX = cellX;public void setCellY(float cellY)this.cellY = cellY;下面来编写一个isBoundary 方法, 用来判断用户是否触摸了非日历网络部分。public boolean inBoundary()/ 判断边界if (cellX (view.getMeasuredWidth() - borderMargin)| cellY (view.getMeasuredHeight() - borderMargin)return false;else

29、return true;下面在CalendarView 类中添加一个触摸事件方法public boolean onTouchEvent(MotionEvent motion)ce.grid.setCellX(motion.getX();ce.grid.setCellY(motion.getY();if (ce.grid.inBoundary()this.invalidate();return super.onTouchEvent(motion);现在来修改Grid 类, 在该类中需要获得农历信息, 这是一个现成的类库(在文中提供的源代码中可以找到, Lunar类), 可以直接使用。privat

30、e Lunar lunar = new Lunar();private int today;/ 保存月的名称(一至十二月)private String monthNames = new String12;private TextView tvMsg1;private TextView tvMsg2;private TextView tvMsg3;由于系统中需要使用月份信息, 因此, 需要在resvalues目录中建立一个values.xml 文件, 并输入要用到的月份信息。一月二月三月四月五月六月七月八月九月十月十一月十二月下面继续修改Grid 类, 在构造方法中添加如下代码:today =

31、currentDay;tvMsg1 = (TextView) activity.findViewById(R.id.tvMsg1);tvMsg2 = (TextView) activity.findViewById(R.id.tvMsg2);tvMsg3 = (TextView) activity.findViewById(R.id.tvMsg3);/ 装载刚才定义的资源monthNames = activity.getResources().getStringArray(R.array.month_name);在切换到相应的日期后, 需要在屏幕的正上方显示当前日期的信息。显示的内容如图1 所

32、示。这些功能由updateMsg 方法实现, 代码如下:private void updateMsg(boolean today)String monthName = monthNamescurrentMonth;String dateString = ;SimpleDateFormat sdf = new SimpleDateFormat (yyyy年m 月d 日);java.util.Calendar calendar = java.util.Calendar.getInstance();calendar.set(currentYear, currentMonth, currentDay)

33、;dateString = sdf.format(calendar.getTime();String lunarStr = ;lunar.setDate(calendar.getTime();lunarStr = lunar.getAnimalString() + 年(;lunarStr += lunar.getCyclicaYear() + 年);lunarStr += lunar.getLunarMonthString() + 月;lunarStr += lunar.getLunarDayString();String term = lunar.getTermString();if (!

34、.equals(term)term += ;monthName += 本月第 + calendar.get(java.util.Calendar.WEEK_OF_MONTH)+ 周;tvMsg1.setText(monthName);if (today)dateString += (今天);dateString += 本年第 + calendar.get(java.util.Calendar.WEEK_OF_YEAR)+ 周;tvMsg2.setText(dateString);tvMsg3.setText(term + lunarStr);3.5 键盘操作介绍如何通过手机按键来操作日历, 也

35、就是通过按建来移动日历。另外一个功能是当日历移动到上月或下月的日期时切换到上月或下月的日历。下面看看如何通过按键来操作日历, 首先要在Grid 类中添加几个变量, 用来控制当前的日历坐标。private int currentRow, currentCol;private boolean redrawForKeyDown = false;在使用键盘来控制日历时, 当按下手机按键的上、下、左、右时, 会调用setCurrentRow、setCurrentCol 方法来更新当前的坐标(横、纵坐标)。setCurrentRow 方法的代码如下:public void setCurrentRow(in

36、t currentRow)redrawForKeyDown = true;cellX = -1;cellX = -1;if (currentRow = 0 & currentRow 6)this.currentRow = currentRow;setCurrentCol 方法的代码如下:public void setCurrentCol(int currentCol)redrawForKeyDown = true;cellX = -1;cellX = -1;if (currentCol 0)this.currentCol = 6;setCurrentRow(-currentRow);elset

37、his.currentCol = 0;else if (currentCol 6)this.currentCol = 0;setCurrentRow(+currentRow);elsethis.currentCol = currentCol;最后修改CalendarView 类的代码, 加入键盘触摸事件,代码如下:Overridepublic boolean onKeyDown(int keyCode, KeyEvent event)switch (keyCode)case KeyEvent.KEYCODE_DPAD_UP:ce.grid.setCurrentRow(ce.grid.getCu

38、rrentRow() - 1);break;case KeyEvent.KEYCODE_DPAD_DOWN:ce.grid.setCurrentRow(ce.grid.getCurrentRow() + 1);break;case KeyEvent.KEYCODE_DPAD_LEFT:ce.grid.setCurrentCol(ce.grid.getCurrentCol() - 1);break;case KeyEvent.KEYCODE_DPAD_RIGHT:ce.grid.setCurrentCol(ce.grid.getCurrentCol() + 1);break;invalidate

39、();return true;4进行编码:4.1登录进入一天记事的功能,在一开始设置密码,达到的保护个人的隐私的效果。我们先看看效果是怎么样的,如图3所示:图3 设置密码将获取的密码进行匹配,只有在两次密码相同才能跳转到记事页面,否则提出错误的信息:主要代码如下:public void onCreate(Bundle bundle)super.onCreate(bundle);db = new DBOper(this);setContentView(R.layout.password_manage);et1 = (EditText)findViewById(R.id.new_password)

40、;et2 = (EditText)findViewById(R.id.repeat_password);button = (Button)findViewById(R.id.save_password);button.setOnClickListener(new Button.OnClickListener()public void onClick(View v) String new_pwd = et1.getText().toString();String repeat_pwd = et2.getText().toString();if(new_pwd=null|new_pwd.equal

41、s()Toast.makeText(PasswordManage.this, R.string.password_is_null, Toast.LENGTH_LONG).show();elseif(new_pwd.equals(repeat_pwd)if(db.getPwd().equals()db.insertPwd(new_pwd);Toast.makeText(PasswordManage.this, R.string.password_set_success, Toast.LENGTH_LONG).show();toNoteList();elsedb.updatePwd(new_pwd

42、);Toast.makeText(PasswordManage.this, R.string.password_change_success, Toast.LENGTH_LONG).show();PasswordManage.this.setResult(CHANGE_PWD_SUCCESS);PasswordManage.this.finish();elseToast.makeText(PasswordManage.this, R.string.password_isnot_equal, Toast.LENGTH_LONG).show(););4.2事情记录在登录成功,需要进行对当天的事情进行记载:效果为:如图4所示图4 对当天日程记录主要代码如下:public void onCreate(Bundle bun

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论