实用第一智慧密集2011. 05实现基于Android 的日历系统摘要: Android 作为目前较为流行的智能手机操作系统已成为大多数人的首选。
在美国乃至世界的很多地方的出货量已经超越Iphone,成为世界上最大智能手机操作系统。
因此,世界各地的程序员都跃跃欲试地想学习Android 的开发,并希望从中捞得属于自己的第一桶金。
在此给出一个基于Android 的日历系统的完整实现过程。
关键词: Android;日历;绘画;农历;记录;提醒1 引言要实现的日历除了常规的日历功能外,还可以显示与当前日期相关的信息,如当前日期的农历日期、天干地支、节日等信息。
下面先看看日历的绚丽界面,如图1、图2 所示。
主要功能2 绘画基础由于实现的日历系统要涉及到大量的Android 绘图技术,因此,要简单介绍Android 的绘图技术。
绘制图形通常在Android.view.View 或其子类的onDraw 方法中进行。
该方法的定义如下:protected void onDraw(Canvas canvas);其中Canvas 对象提供了大量用于绘图的方法,这些方法主要包括绘制像素点、直线、圆形、弧、文本,这些都是组成复杂图形的基本元素。
如果要画更复杂的图形,可以采用组合这些图形基本元素的方式来完成。
例如,可以采用画3 条直线的方式来画三角形。
下面来看一下绘制图形基本元素的方法。
2.1 绘制像素点public native void drawPoint(float x, float y, Paint paint);// 画一个像素点public native void drawPoints(float[] pts, int offset, int count, Paint paint); // 画多个像素点public void drawPoints(float[] pts, Paint paint);// 画多个像素点参数的含义如下:(1) x:像素点的横坐标。
(2) y:像素点的纵坐标。
(3) paint:描述像素点属性的Paint 对象。
可设置像素点的大小、颜色等属性。
绘制其他图形元素的Paint 对象与绘制像素点的Paint 对象的含义相同。
在绘制具体的图形元素时可根据实际的情况设置Paint 对象。
(4) pts: drawPoints 方法可一次性画多个像素点。
pts 参数表示多个像素点的坐标。
该数组元素必须是偶数个,两个一组为一个像素点的坐标。
(5) offset: drawPoints 方法可以取pts 数组中的一部分连续元素作为像素点的坐标,因此,需要通过offset 参数来指定取得数组中连续元素的第一个元素的位置,也就是元素偏移量,从0 开始。
例如,要从第3 个元素开始取数组元素,那么offset 参数值就是2。
(6) count:要获得的数组元素个数, count 必须为偶数(两个数组元素为一个像素点的坐标)。
要注意的是, offset 可以从任意一个元素开始取值,例如,offset 可以为1,然后count 为4。
2.2 绘制直线public void drawL ine (float startX, float startY, float stopX, float stopY,Paint paint);// 画一条直线public native void drawLines(float[] pts, int offset, int count, Paint paint); // 画多条直线public void drawLines(float[] pts, Paint paint);// 画多条直线参数的含义如下:(1) startX:直线开始端点的横坐标。
(2) startY:直线开始端点的纵坐标。
(3) stopX:直线结束端点的横坐标。
(4) stopY:直线结束端点的纵坐标。
(5) pts:绘制多条直线时的端点坐标集合。
4 个数组元素(两个为开始端点的坐标,两个为结束端点的坐标)为1 组,表示一条直线。
例如,画两条直线, pts 数组就应该有8 个元素。
前4 个数组元素为第1 条直线两个端点的坐标,后4 个数组元素为第2 条直线的两个端点的坐标。
(6) offset: pts 数组中元素的偏移量。
(7) count:取得pts 数组中元素的个数。
该参数值需为4的整数倍。
2.3 绘制圆形public void drawCircle (float cx, float cy, float radius, Paint paint);参数的含义如下:(1) cx:圆心的横坐标。
(2) cy:圆心的纵坐标。
(3) radius:圆的半径。
2.4 绘制弧public void drawArc (RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint);参数的含义如下:(1) oval:弧的外切矩形的坐标。
需要设置该矩形的左上角和右下角的坐标,也就是oval.left、oval.top、oval.right 和oval.bottom。
(2) startAngle:弧的起始角度。
(3) sweepAngle:弧的结束角度。
如果sweepAngle - startAngle的值大于等于360, drawArc 画的就是一个圆或椭圆(如果oval 指定的坐标画出来的是长方形, drawArc 画的就是椭圆)。
(4) useCenter:如果该参数值为true,在画弧时弧的两个端点会连接圆心。
如果该参数值为false,则只会画弧。
效果如图3所示。
前两个弧未设置填充状态,后两个弧设置了填充状态。
2.5 绘制文本// 绘制text 指定的文本public native void drawText (String text, float x, float y, Paint paint);// 绘制text 指定的文本。
文本中的每一个字符的起始坐标由//pos 数组中的值决定。
public void drawPosText(String text, float[] pos, Paint paint); // 绘制text 指定的文本。
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:绘制文本的起始点的纵坐标。
(4) index:选定的字符集合在text 数组中的索引。
(5) count:选定的字符集中字符个数。
3 绘制日历的框架从图1 可以看出,日历的上部是3 行文字,显示了当前日期的相关信息。
下面来看看如何布局显示这些文字的组件。
在日历主界面的上半部需要放置4 个组件, 1 个ImageView组件和3 个TextView 组件。
其中ImageView 组件用于显示左上角的图像。
3 个TextView 组件用于显示当前日期的信息。
由于目前还没有当前日期的信息。
因此,这3 个TextView组件暂时设置了固定的信息。
下面开始在main.xml 文件中设置这4 个组件。
在修改main.xml 文件的内容之前,先复制一个calendar.png 文件,作为日历的logo (修改AndroidManifest.xml 文件中的应用程序图标)。
建立一个Calendar 工程,并编写main.xml 文件。
<?xml version="1.0" encoding="utf-8"?><LinearLay out xmlns: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" --><RelativeLayout android:id = "@ +id/calHeader" android: layout_width="fill_parent"android:layout_height="70dp"><ImageView android: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" /><LinearLayout android:layout_width="fill_parent"android:layout_height = "wrap_content" android:layout_toRightOf="@id/ivLogo"android:layout_marginTop = "@dimen/margin"android:orientation="vertical" ><TextView android:id = "@ +id/tvMsg1" android:layout_width="fill_parent"android:layout_height = "wrap_content"android:textColor="@color/text_color" /><TextView android:id = "@ +id/tvMsg2"android:layout_width="fill_parent"android:layout_height = "wrap_content"android:textColor="@color/text_color" /><TextView android:id = "@ +id/tvMsg3" android:layout_width="fill_parent"android:layout_height = "wrap_content"android:textColor="@color/text_color" /></LinearLayout></RelativeLayout></LinearLayout>下面在Main 类的Oncreate 方法中编写代码装载main.xml:public void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);LinearLayout mainLayout = (LinearLayout) getLayoutInflater().inflate(yout.main, null);setContentView(mainLayout);// 需要向mainLayout 中加入日历网络}在绘制日历之前,要先介绍一下日历绘制的方法。