有趣的日历

2024-09-06

有趣的日历(精选三篇)

有趣的日历 篇1

要实现的日历除了常规的日历功能外, 还可以显示与当前日期相关的信息, 如当前日期的农历日期、天干地支、节日等信息。下面先看看日历的绚丽界面, 如图1、图2所示。

2 绘画基础

由于实现的日历系统要涉及到大量的Android绘图技术, 因此, 要简单介绍Android的绘图技术。

绘制图形通常在Android.view.View或其子类的onDraw方法中进行。该方法的定义如下:

protected void onDraw (Canvas canvas) ;

其中Canvas对象提供了大量用于绘图的方法, 这些方法主要包括绘制像素点、直线、圆形、弧、文本, 这些都是组成复杂图形的基本元素。如果要画更复杂的图形, 可以采用组合这些图形基本元素的方式来完成。例如, 可以采用画3条直线的方式来画三角形。下面来看一下绘制图形基本元素的方法。

2.1 绘制像素点

参数的含义如下:

(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 绘制直线

参数的含义如下:

(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, Pain 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 绘制文本

参数的含义如下:

(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文件。

下面在Main类的Oncreate方法中编写代码装载main.xml:

在绘制日历之前, 要先介绍一下日历绘制的方法。虽然从底层技术来看, 绘制日历是在onDraw方法中完成的。但在本系统中将要绘制的部分分成了很多块。而这些要绘制的块都需要放在一个叫CalendarView的类中, 代码如下:

在编写完CalendarView类后, 需要在Main类中定义该类的变量, 并在onCreate方法中创建类的对象实例, 代码如下:

在前面已经介绍过, 在本系统中会将要绘制的日历分成若干块, 而每一块都需要有同样的接口, 以便统一绘制它们。因此, 这些块都要实现一个CalendarElement接口。

这些要绘制的块包括日历边框、网络、日历头等, 而在CalendarElement接口中有一个draw方法。在绘制日历元素时只需调用draw方法即可。在后面的实现中会看到更多实现CalendarElement接口的类, 下面先来编写CalendarElement接口。

现在需要一个总的类来绘制上述的这些块。这个功能由Calendar类来完成。Calendar是一个总的日历元素类, 在该类的draw方法中绘制了所有的日历元素。Calendar是第一个实现CalendarElement接口的类, 代码如下:

在CalendarView类中需要调用Calendar类来绘制日历, 因此, 需要在CalendarView类中创建Calendar类的对象实例, 并调用draw进行绘制, 代码如下:

下面编写第一个绘制元素类:Border。Border类用于绘制日历的边框, 该类是日历元素类, 需要实现CalendarElemen接口, 不过该类只要继承刚实现的CalendarParent类即可。

Grid类用于绘制日历的网格, 该类是日历元素类, 需要继承CalendarParent类。

Week类用于显示日历网格上方的星期文本:

4 核心技术

前面介绍了绘制日历的基本方法, 现在将逐步接触到日历系统的核心技术。首先来看一下日历中如何表示日期。

在Grid类中的days数组保存了42个数字。这42个数字就是日历主界面中的6*7个方格中的数字。这些数字分为两部分, 中间的部分就是当前月中的天数。这些天数最小是28天, 最大是31天。在这组数字的前后可以包含了上月的部分月末天数和下月部分月初天数。当单击或触摸上月或下月的天数时, 日历会跳到上月或下月。这里内容在后面将详细介绍。只介绍如何将这些数字绘制到这42个方格中。为了区别这两类数字。将在上月和下月的相应天数中加星号 (*) , 代码如下:

在Grid类的构造方法中初始化变量的代码如下:

下面来编写一个getMonthDays方法, 该方法用来获得指定月份的天数。这个方法也是绘制指定月份的日历的基础, 代码如下:

下面到了关键时刻, 需要基础出当前月的天数, 以及上一月和下一月落在本月初和本月末的天数。并将其放在days数组中。代码如下:

下面的代码是本例中最核心的部分, 在onDraw方法中绘制日历的主界面, 代码如下:

在ondraw方法中添加绘制日历的代码 (2) :

5 触摸事件

现在为日历添加一系列动画。首先需要添加的是日历的触摸事件。由于所实现的日历都是通过绘制完成的, 因此, 在触摸时必须要判断触摸的位置, 以确定触摸的是日历的哪一部分。例如, 触摸的是哪一天。

下面来看看如何为日历添加触摸事件。

首先添加两个变量, 用于保存当前触摸的坐标。默认值都是-1, 表示用户还未触摸:

private float cellX=-1, cellY=-1;

再加两个setter方法用来设置这个值:

下面来编写一个isBoundary方法, 用来判断用户是否触摸了非日历网络部分。

下面在CalendarView类中添加一个触摸事件方法

现在来修改Grid类, 在该类中需要获得农历信息, 这是一个现成的类库 (在文中提供的源代码中可以找到, Lunar类) , 可以直接使用。

由于系统中需要使用月份信息, 因此, 需要在resvalues目录中建立一个values.xml文件, 并输入要用到的月份信息。

下面继续修改Grid类, 在构造方法中添加如下代码:

在切换到相应的日期后, 需要在屏幕的正上方显示当前日期的信息。显示的内容如图1所示。这些功能由updateMsg方法实现, 代码如下:

6 键盘操作

介绍如何通过手机按键来操作日历, 也就是通过按建来移动日历。另外一个功能是当日历移动到上月或下月的日期时切换到上月或下月的日历。

下面看看如何通过按键来操作日历, 首先要在Grid类中添加几个变量, 用来控制当前的日历坐标。

在使用键盘来控制日历时, 当按下手机按键的上、下、左、右时, 会调用setCurrentRow、setCurrentCol方法来更新当前的坐标 (横、纵坐标) 。setCurrentRow方法的代码如下:

setCurrentCol方法的代码如下:

最后修改CalendarView类的代码, 加入键盘触摸事件, 代码如下:

7 显示当前日期

显示当前日期的详细信息是本系统的主要功能之一。这个功能也是将Web技术和Android相结合的典型案例。下面来看看是如何来实现这个功能的。首先来看看实现效果, 如图4所示。

虽然JavaScript有着丰富的函数库, 但仍然有很多无法完成的工作, 例如, 对硬件的访问。不过WebView为JavaScrip提供了一种强有力的扩展, 通过这种扩展, 可以在JavaScrip中象调用JavaScript函数一样调用Java代码。因此, JavaScrip也就拥有了同Java一样的能力。

通过WebView组件使JavaScript调用Java方法, 首先需要打开WebView的JavaScript支持, 代码如下:

建立一个空的OnMsgMenuItemClick, 代码如下:

下面来编写布局文件msg.xml。

下面需要使用一个Lunar类 (在前面曾使用过) 来获得当前日期的农历信息, 代码如下:

从图4看出在上方显示了与当前年相匹配的12天干。这个功能需要通过loadAnimal方法来完成。这个方法要通过Lunar类的getAnimalString方法获得当前年的天干, 然后通过比较来确定要显示哪正值天干的图像。loadAnimal方法的代码如下:

8 结语

给出基于Android的日历系统的核心代码。本系统全部的代码已放到文章中, 感兴趣的读者可以查看源代码。在这个系统中涉及了多项Android技术, 其中包括图形技术、Web技术、数据库技术等。通过深入研究本系统的技术可以实现更丰富多彩的Android应用程序。

摘要:Android作为目前较为流行的智能手机操作系统已成为大多数人的首选。在美国乃至世界的很多地方的出货量已经超越Iphone, 成为世界上最大智能手机操作系统。因此, 世界各地的程序员都跃跃欲试地想学习Android的开发, 并希望从中捞得属于自己的第一桶金。在此给出一个基于Android的日历系统的完整实现过程。

两套有趣的日历火花 篇2

我国最初的火花只是作为商标用于火柴的流通,多为单套单枚,后随着人们生活的变化和历史的进步,尤其是在新中国成立之后,火花成为人们讲述生活、记录历史、寄情寓怀的载体之一。于是,小小纸片变成了包罗万象的“小百科全书”—历史故事、时事政治、贤士名人、风光美景、花卉鱼虫、飞禽走兽、文物建筑、体育武术、戏剧舞蹈等,无不可在火花中找到其踪影。1958年7月,北京火柴厂推出了我国第一套成套火花,共分鸟类、风景、花卉三组,每组各十二枚,打破了以前单枚单套的设计模式。1979年后,改革开放的春风更使得火花艺术蓬勃发展、百花齐放,不仅在纸质、印刷、颜色、布局等方面都有了大的改观,表现形式也越来越丰富多彩,单枚套(见图2)、主题套(见图3)、连环套、联张套、套中套等各种形式琳琅满目、层出不穷。根据贴在火柴包装上位置的不同,火花还有了卡标、贴标、卷标、中标、箱标之分:贴在火柴外盒的一面且纸质较薄的为贴标(见图4);图案印在硬卡纸上,折叠后即为完整的火柴外盒的叫卡标(见图5);纸质较薄,大小同卡标,卷贴在火柴外盒表面的叫卷标;贴在一小包火柴包装上的较大贴标称为中标(见图6);贴在一大箱火柴包装箱上的大型贴标则被称为箱标(见图7、图8)。同时,许多独特的火花品种更是相继问世,如宾馆专用火花、纪念火花(见图9)、旅游火花、广告火花、灯谜火花等。

日历火花便是近期火花中将火花与日历“联姻”的独特品种,每套皆有十二枚,每枚上的主题图案多为当年生肖,副版处再配以当年日历。这种实用性与艺术性兼具的火花,自问世起便极受人们欢迎。河北省民俗博物馆就收藏有两套日历火花,两套皆为卡标。其中一套为1982年镇江火柴厂出品的《壬戌狗年》日历火花(见图10),全套十二枚,主图为十二只萌态十足的卡通狗,它们或站、或卧、或蹦、或跳、或娇羞、或惊愕、或怒目圆睁、或兴高采烈、或摇头摆尾、或翘首吐舌,拟人化的表现手法将小狗的顽皮淘气刻画得惟妙惟肖,观之让人顿生愉悦。副标上则印有1982年12个月的日历和“镇江火柴”的字样。据考这是我国首套生肖日历火花。

另外一套是1984年由福建侨乡火柴厂生产的《老鼠娶亲》日历卡标(见图11),全套共十二枚。有意思的是,若将整套火花排列在一起,上面的主题图案便会拼接成一个完整的故事—老鼠娶亲,犹如连环画一般。这样的套装形式是火花中不常见的连环套。细观整个画面,设计者共用了二十一只老鼠、一只猫、一只蟾蜍,来形象地表现老鼠娶亲的全过程:喜气洋洋的老鼠们各司其职,两只高擎着双喜大红灯笼在前边开路,两只手拿鞭炮放得不亦乐乎,两只扛旗,两只打鼓,一只在吹唢呐,一只在看热闹,还有几只在抬着花轿和彩礼……那隆重和热闹的劲头儿一点儿也不亚于人类的婚礼。美美的老鼠新娘坐在喜轿内,开心之余还带着些许娇羞,对即将到来的灾难全然不知晓。最后的两枚火花上则将故事的结果表现得淋漓尽致—猫新郎恶狠狠地扑在鼠新娘身上,原本兴高采烈的骑在蟾蜍身上的鼠爸爸被惊吓得飞落了脑袋上的礼帽……整个画面栩栩如生、诙谐又风趣。每枚火花上的画面下部是1984年的日历,中间脊背上则印有“老鼠娶亲”字样及白底阳文“侨乡火柴”印章。

浅谈日历的实验性设计 篇3

所谓日历设计在某种意义上, 可以看做是一种信息表格的设计。这些信息相对单纯且具有固定的制式, 这既为设计提供了条理清晰、结构明确的信息架构, 又在某种程度上易使设计陷入程式化的境地。日历所传达的信息绝不是毫无生气的冷冰冰的数据, 而是蕴含了具有人文气息的思想与情感, 日期的度过会让人自然而然地产生诸如时光易逝、岁月蹉跎的情愫, 而设计师往往会利用这些特性借题发挥生发出具有观念性的设计作品。同时日历作为一种日常用品, 无论是出现在家中、办公室还是别的什么场合, 它都以物化的形相存在, 依托于某一载体, 这就给设计带来了诸多的可能性。由于物的存在感和实用性使得日历无法避免的会对其介入的环境和人的行为产生影响, 因而日历设计在一定程度上就从对物的设计演变成了对人和对生活的设计, 这更是值得设计师深刻思考的问题。

一、特异图形、异态造型

传统的日历设计通常是由图形和信息两部分元素组成, 图形一般情况下只起到配饰的作用, 多为风景或人物摄影、绘画作品等, 其本身缺乏视觉创意的亮点, 存在于一种可有可无的暧昧状态之中。现代设计师充分注意到了这一点, 在图形的选择和视觉氛围的营造上下足了功夫。如图-1所示是高精度显示器制造商“EIZO”公司为答谢他们的客户——一批专业医疗从业人员而设计的日历。设计师BUTTER.认为性感女郎日历出现在他们的办公室里已经过时了, 必须使用一种新的视觉语言。于是他选择了这些医师们最熟悉的医学影像贴图即X光片效果来诠释这些美女模特, 图片中的女性形象完全抛弃了衣着、发型、妆容等外在的表象, 而仅保留了骨骼和由骨骼生发出的具有挑逗性的动作及一双性感的高跟鞋。这种赤裸裸的透视所造成的强烈的视觉冲击力远远超过了单纯的美女摄影图片, 这是一种时尚、前卫和具有观念意识的先锋视觉效果。

时下设计师们也在不断地探索信息的架构和日历形态之间的关系, 希望能够通过复杂而多变的纸结构将相对单一的日期信息变得更加丰富和具有视觉形式感。如图-2所示设计师Johann Volkmer设计的日历就采用了十分复杂的立体结构, 设计师希望利用处于不同空间层次的结构来将依附其上的信息进行有序地分层, 形成一个多视点共存的视觉状态。这一设计很巧妙地将相对固化的数据变成了相互交织又彼此独立的数据流。并且设计师所采用的几何化的形态结构, 使得整体的视觉效果充满现代感和科技感, 是一种概念性的表达方式。

二、互动参与、生活介入

互动参与是设计作品与受众或观者产生心理共鸣的一种最有效和直接的方式。所谓互动是一个具有双向作用的行为过程, 即受众的参与会改变设计作品的面貌或状态, 同时这种改变也会反作用于受众, 这种作用可能是生理上的也可能是心理上的。如图-3所示, 这个日历设计作品是采用编织的手法制作的, 每度过一天使用者都可以拉动下方的线头, 于是这一天所在的位置就会随着线的脱落而消失, 这就意味着日历的形态在不断地发生着变化。长此以往, 当一年365天都过完的时候, 这个作品就由一块平展的织物变成了一团杂乱的线——一个形态消失了, 另一个形态出现了。这一切是由设计师设计, 而最终由使用者完成的。在这个变化的过程中, 使用者会自然而然地产生出一种时光流逝、物是人非的感慨。

日历对应的是以“天”为单位的功能属性, 可以说它与我们每天的生活都能够建立某种特定的关系。如图-4所示设计师Dominic Wilcox就将日历与人们每日的身体健康做了一个富有创意的链接。他的日历设计作品就像是一个放大的药板, 将日历上的每个日期都对应的放入一颗鱼肝油胶囊。这样日历的拥有者就再也不会忘记每天要给自己补充营养素了。我们暂且不考虑这一设计对有特殊服药要求的人是否适用, 但是它的设计初衷确实是为了简化人们的行为方式, 方便我们的日常生活。这种设计对生活是一种直接的介入, 这种介入需采用温和的姿态, 是一种善意提醒的方式, 而非强制的压迫感。

三、概念移植、本体迷失

有一部分日历设计作品在一定程度上消解了日历的实用功能, 即其呈现的数据不再具有记录日期的效用。日历转而成为了一个单纯的设计话题, 被赋予一种观念性的含义, 一种趣味性的视觉, 亦或是一个具有特定语义的变化过程等。如图-5所示, 这个名为“Ink Calendar” (墨迹日历) 的设计作品, 使用不同色彩的墨水对应不同的季节, 将白色的吸水纸做成相互连通的日历数字的形象, 吸水纸的起始端浸入墨水瓶中, 通过一定的物理作用, 吸水纸就会慢慢地吸取墨水, 继而相互连通的数字就会一点点的由原来的白色变成墨水的颜色, 数字就会自然而然地从白色的背景上显现出来。这个日历, 就其视觉形象而言, 有着极大的偶发性特征, 即设计者无法精确地控制墨水的行进速度, 无法保证数字的显现能够在它对应的一天中完成。因而日历的功能性价值消失了, 但却给观者留下了一个更加单纯的思考空间, 其精神含义得以彰显——那是时间留下的痕迹所引发的思考。

日历的实验性设计给我们带来了如此丰富多姿的视觉景观, 它借助这种特殊的载体介入我们的生活和行为方式, 更为设计师的创意与巧思提供了无限广阔的发挥空间。日子度过了, 但优秀的日历设计作总会在人们心中留下点“什么”, 而这点“什么”正是设计师应该深刻思考的问题!

参考文献

[1]赖声川.赖声川的创意学[M].广西师范大学出版社, 2011.

上一篇:骆驼评级体系下一篇:西北五省