实用第一智慧密集
2011. 05
实现基于Android 的日历系统
摘要: Android 作为目前较为流行的智能手机操作系统已成为大多数人的首选。在美国乃至世界
的很多地方的出货量已经超越Iphone, 成为世界上最大智能手机操作系统。因此, 世界各地的程yomi
序员都跃跃欲试地想学习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 offt, 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) offt: drawPoints 方法可以取pts 数组中的一部分连
续元素作为像素点的坐标, 因此, 需要通过offt 参数来指定
取得数组中连续元素的第一个元素的位置, 也就是元素偏移
量, 从0 开始。例如, 要从第3 个元素开始取数组元素, 那么
offt 参数值就是2。
(6) count: 要获得的数组元素个数negatives, count 必须为偶数
(两个数组元素为一个像素点的坐标)。
要注意的是, offt 可以从任意一个元素开始取值, 例如,
offt 可以为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 offt, int count,
Paint paint); // 画多条直线
public void drawLines(float[] pts, Paint paint);
// 画多条直线
参数的含义如下:
(1) startX: 直线开始端点的横坐标。
(2) startY: 直线开始端点的纵坐标。
(3) stopX: 直线结束端点的横坐标。
(4) stopY: 直线结束端点的纵坐标。
(5) pts: 绘制多条直线时的端点坐标集合。4 个数组元素
(两个为开始端点的坐标, 两个为结束端点的坐标) 为1 组,
表示一条直线。例如few怎么读, 画两条直线, pts 数组就应该有8 个元
素。前4 个数组元素为第1 条直线两个端点的坐标, 后4 个数
voa听力下载
组元素为第2 条直线的两个端点的坐标。
(6) offt: pts 数组中元素的偏移量。
(7) count: 取得pts 数组中元素的个数。该参数值需为4
的整数倍。
2.3 绘制圆形
public void drawCircle (float cx, float cy, float radius, Paint
paint);
参数的含义如下:
(1) cx: 圆心的横坐标。
(2) cy: 圆心的纵坐标。
(3) radius:utilizing 圆的半径。
2.4 绘制弧
public void drawArc (RectF oval, float startAngle, float
sweepAngle, boolean uCenter, Paint paint);
参数的含义如下:
(1) oval: 弧的外切矩形的坐标。需要设置该矩形的左上
角和右下角的坐标, 也就是oval.left、p、oval.right 和
oval.bottom。
(2) startAngle: 弧的起始角度。
(3) sweepAngle: 弧的结束角度。如果sweepAngle - startAngle
的值大于等于360, drawArc 画的就是一个圆或椭圆(如
果oval 指定的坐标画出来的是长方形, drawArc 画的就是椭圆)。
(4) uCenter: 如果该参数值为true, 在画弧时弧的两个端
点会连接圆心。如果该参数值为fal, 则只会画弧。效果如图3
所示。前两个弧未设置填充状态, 后两个弧设置了填充状态。
2.5 绘制文本
2016大学排名
// 绘制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 reply过去式绘制日历的框架
从图1 可以看出, 日历的上部是3 行文字, 显示了当前日
期的相关信息。下面来看看如何布局显示这些文字的组件。
在日历主界面的上半部需要放置4 个组件, 1 个ImageView
组件和3 个TextView 组件。其中ImageView 组件用于
显示左上角的图像。3 个TextView 组件用于显示当前日期的信
息。由于目前还没有当前日期的信息。因此, 这3 个TextView
组件暂时设置了固定的信息。
下面开始在l 文件中设置这4 个组件。在修改
l 文件的内容之前, 先复制一个calendar.png 文件, 作
为日历的logo (修改l 文件中的应用程序图
标)。建立一个Calendar 工程, 并编写l 文件。
<?xml version="1.0" encoding="utf-8"?>
<LinearLay out xmlns:android = "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: