目标手机软件
程序显示 随环境而变
模仿功能:环境模块
模仿对象:手机QQ 2008
模仿进度:第三期
开发平台:Java平台
设计手机程序,要考虑手机使用的特殊性,可以像手机QQ 2008那样,程序显示的亮度、背景色等根据时间和环境不同而变化。
环境模块功能设计思路
环境模块功能是一种贴心的设计,该功能使得手机软件在不同的场景下都获得良好的界面效果,从而使手机软件可以适应不同的环境。环境模块共有3种模式,夜间模式、室内模式和户外模式。其中室内模式和户外模式是在白天起作用。
白天的户外,光线比较强,所以比较适合使用比较亮的背景色以及比较暗的文字颜色;
白天的室内,软件处于正常的环境中,只需要设置成普通的状态即可(一般的手机软件只实现了室内模式的界面);夜晚的光线比较弱,需要比较暗的背景色和比较亮的文字颜色,以及比较暗的屏幕亮度。总之,就是通过变化颜色以及屏幕亮度,使得软件界面能够适应当前的环境。环境模块功能设计流程图如图1所示。
三种模式的切换
在程序中,存储了这三种模式相关的数值信息,主要是前景颜色、背景颜色和手机屏幕亮度的数值。在任何时候只能看到一种效果,类似于一个人有三套衣服,这个人可以根据需要穿其中的任何一套。
在程序中进行切换时,有两种切换方式:自动切换和手动切换。自动切换是在夜间模式和室内模式(白天使用)之间切换。模块中包含一个自动的线程,每隔1分钟获得一下当前时间,如果当前时间为18:00~07:00之间,则设置为夜间模式。手动切换是在室内模式和户外模式之间切换。当程序启动以后,按下手机键盘上的数字键0,如果当前模式是室内模式,则切换到户外模式。
变量foreColor用来存储前景颜色的数值,0x0是前景颜色的预设值,变量backColor用来存储背景颜色的数值,0xffffff是背景颜色预设值,变量screenBright用来存储屏幕亮度的数值,100是屏幕亮度预设值。
小知识:颜色在程序中也采用RGB体系,也就是说所有的颜色都由Red(红色)、Green(绿色)和Blue(蓝色)三种颜色混合而成。在程序中表达时可以使用三个0~255之间的数字,也可以使用一个16进制的数字进行表达,格式为0x00RRGGBB,也就是使用int数值中的一个字节表达一种颜色,最左侧的一个字节可以是任意的数值。
环境模块功能实现步骤
第一步:创建项目
启动Eclipse环境,选择“File→New→J2ME MIDlet Suit”,设置项目名称为“DreamScene”,并一路选择“Next”, 完成项目的建立。然后新建一个J2ME入口类,选择“File→New→J2ME MIDlet”,并设置名称为“DreamSceneMIDlet”,点击“Finish”。创建项目的代码下载地址是http://www.shudoo.com/bzsoft。
第二步:设计界面
选择“File→New→Class”,并设置名称为“DreamSceneCanvas”,点击“Finish”完成界面类的创建。接着,开始初始化界面。关键码如下所示(完整代码下载地址:http://www.shudoo.com/bzsoft):
//绘制背景
g.setColor(backColor);
g.fillRect(0, 0, width, height);
//绘制界面
g.setColor(foreColor);
g.drawString(modeStr[currMode], width/2, height/2, HCENTERBASELINE);
//绘制退出按钮
g.drawString(quitStr, width, height, RIGHTBOTTOM);
第三步:设置切换键
在上面的界面类中,编写事件处理的代码,实现按手机键盘上的“0”键在室内、户外两种模式之间依次切换。核心代码如下所示(完整代码下载地址:http://www.shudoo.com/bzsoft):
:
public void keyPressed(int keyCode){
if(keyCode == KEY_NUM0){//数字键0
changeMode(); //改变模式
setMode(); //根据模式值设置颜色和亮度
}
if(keyCode == -7){//右软键
DreamSceneMIDlet.quitApp();
isRun = false; //关闭线程
}
repaint(); //重绘
第四步:根据时间自动切换模式
按照时间变化自动切换夜间模式和室内模式,规则为:18:00~07:00之间为夜间模式,其他时间段切换为室内模式。核心代码如下所示(完整代码下载地址:http://www.shudoo.com/bzsoft):
//延时
Thread.sleep(60000);
//根据时间改变逻辑
logic();
//重画屏幕
repaint();
//获得当前时间
Calendar c = Calendar.getInstance();
//获得小时数
int hours = c.get(Calendar.HOUR_OF_DAY);
//18:00-07:00时间段设置为夜间模式
if((hours >= 18) || (hours < 7)){
currMode = NIGHT_MODE;
第五步:运行程序
在Eclipse主界面左侧的“Package Explorer”中,选中项目源代码DreamSceneMIDlet.java,单击鼠标右键,选择“Run As→Emulated J2ME Midlet”即可运行程序(图2)。
户外模式 夜间模式
读者反馈
开发QQ群:为什么我下载的Nokia S40模拟器不支持中文显示呢?
小编:在Nokia的官方网站上,可以下载Nokia S40系列的专用模拟器,其下载地址为:
http://www.forum.nokia.com/info/sw.nokia.com/id/cc48f9a1-f5cf-447b-bdba-c4d41b3d05ce/Series_40_Platform_SDKs.html。但是如果只安装该SDK的话,是无法显示中文的,需要再专门下载语言包,选择模拟器中的“Tool-Preferences”中的“Download languages”下载并安装语言包,然后重启启动模拟器,在相同的位置设置“Current language:”为“Chinese_simplified”即可。
开发QQ群:看了上期文章,想问一下,流量统计功能会不会给手机运行增加负担?会不会影响程序运行?
小编:在流量统计功能中,需要计算网络操作中发送数字的字节数以及接收到的信息的字节数字,这些计算对于程序本身的逻辑没有什么帮助,的确会增加手机的负担。但是由于这些计算需要的时间比较短,几乎可以忽略,所以对于手机软件程序的性能影响十分有限。在手机运行速度上看不出明显的变化。
开发QQ群:我平时一般使用NetBeans进行开发,请问Eclipse的项目如何在NetBeans中打开呢?
小编:一般不同的集成开发工具的项目格式都是不同的,也没有专门的工具实现不同项目格式直接的转换。但是可以通过如下的方式实现:在NetBeans中新建一个项目,然后将Eclipse项目中的程序源代码和资源文件复制到NetBeans项目中的对应文件夹即可。另外,还需要设置一下项目中的相关配置信息。
开发QQ群:我下载了流量统计模块代码,但为什么无法在Eclipse中运行?
小编:首先要确认开发环境已经安装并配置好,开发环境需要Eclipse、EclipseMe、WTK,然后在Eclipse中点击的“File→Import→General-Existing Projects into workspaces”,导入模块。导入后,选择项目名称,点击鼠标右键,打开项目属性菜单,选择“J2ME”,再选择Devices中从“Group”后的下拉列表中选择已经集成好的SDK,选择“OK”按钮确定即可。
读者问题:我想用Socket方式穿越CMWAP网关,但是CMWAP网关只支持HTTP方式通信,请问有解决方法吗?
高手 无望峰:我来回答这个问题吧。中国移动在手机网络接入时,设计了两个网关:CMNET和CMWAP,其中CMNET支持所有的网络协议,CMWAP只支持HTTP协议,也就是说CMWAP网关的实质是一个HTTP代理服务器。
其实使用Socket方式也可以连接CMWAP网关,但是如果需要通过CMWAP发送数据时,则使用Socket方式发送的实体数据部分只需要符合HTTP协议的数据格式即可,即在发送时添加请求行和头部数据即可。
读者问题:弱弱的问一下,如何在手机程序中添加读取手机电话簿的功能,希望高手给我指点迷津。
你是手机编程的高手吗?你能解答上面这位读者的疑问吗?不要犹豫,来我们这里展示一下你的风采吧,来信请发到pcw-chendx@vip.sina.com(也可以给我们发送问题)。
第三个QQ群: 81341158,第四个QQ群: 9822280,验证码:手机开发,欢迎对手机编程感兴趣的朋友加入。
(河南 陈跃峰)