旁观者 - 郑昀

软件开发这些年来,不断地遇到新领域新知识点,屡屡感受到新进入者的迷惑和彷徨,所以对遇到的每一个问题都详细记录问题现象、解决思路以及解决方案,并在blog中留下印迹,以备他日有心人google之而知之。你们的新手之痛,你们的新业务发展之初的思路混沌,我都感同身受,所以欢迎和我一起探讨这些话题,诸如文本挖掘/自然语言处理/Web3.0/J2ME/Web2.0/IVR/SMS/MMS/WAP/SIP/等等,知无不言言无不尽。

郑昀ID:zhengyun_ustc
1258982次访问,排名14好友5人,关注者75
.
zhengyun_ustc的文章
原创 564 篇
翻译 2 篇
转载 17 篇
评论 1520 篇
郑昀的公告
查看我的简历

google reader
订阅郑昀到鲜果
订阅郑昀到抓虾
联系我:





我的J2ME创意
{8.手机流媒体之实作}

{7.2.增强型二级菜单[SaltedFish]}

{7.1.二级菜单绘制演示-OperaMini风格}

{6.Bloglines手机伴侣-Online Rss Service Reader}
{5.手机玩转点对点MSN传情动漫}
{4.手机玩Podcasting, 无线播客新玩法!}
{3.手机看交通监视器实时录像}
{2.VideoCoolala-- [MobileWebCam]}
{ 1.RSSOwlMidlet (RSS无线阅读器)}

最近评论
微型化:如果说这位i预言家正确的预言过911等事件的话,那应该911之后,就应该看到如“911事件曾被***预言家曾被准确预言过等评论”,但实际未看到过呀!请问那位?在哪里?见到过?
微型化:预言一点不可信
kathy:不管他说的是真的还是假的,我们中国人就应该挺起胸膛,众志成城,一起去面对!!!
中国人是坚强的!!!
welco:@@ 这个sd有够乱的
welco:有点像Q币和rmb的关系 现在网上支付这么方便 为什么不直接用rmb买钻呢 非得费一步事rmb换成qb 再买钻呢 仅仅是历史遗留因素么
文章分类
收藏
相册
BlogPics
GrowGame
j2meStreaming
j2me二级菜单
我爱我车
我爱我家
我的玩聚
IT英才
Geek's Social Dialogue
OneJoo(RSS)
宝聚-股市风向标-中国第一家股市市场信心计算引擎
方军商业日记(RSS)
玩聚-智能语义聚合应用框架
存档
订阅我的博客
XML聚合  FeedSky

原创 [j2me]二级菜单演示 开源声明收藏

新一篇: 2月份《程序员》杂志之10佳技术Blog | 旧一篇: [j2me]二级菜单界面演练[四]

 

郑昀@ultrapower

产品名称

产品版本

Keyword: JavaME 二级菜单

MenuBarlet

1.0.20

 [J2ME]二级菜单演示

(MenuBarlet)

开源说明

 

我的资源:

http://www.cnblogs.com/Files/zhengyun_ustc/menubar-1.0.20-src.rar

这个1.0.20版本的j2me软件,能够在Nokia S60系列、索爱K700C和摩托罗拉Pebl U6手机上运行。

提请注意的是,由于本源代码思路来自于网友相助,并且引入了jmobilecore/bluegammon/等开放源代码库的一些类,所以我也遵循GPL协议,请看后面的“开源版权声明”。

http://www.cnblogs.com/Files/zhengyun_ustc/menubar-deployed.rar

Nokia S60系列安装程序,用数据线传menubar.jar到您的手机上即可安装。

 

摘要:

本文档给出MenuBarlet的开源说明。

1 简单描述MenuBarlet的功能和特别之处

2 描述调用MenuBarlet的开源版权声明

3 给出了 MenuBarlet的思路和设计细节

1背景、功能和特别之处

摘要:本章 简单描述MenuBarlet的背景、功能和特别之处。

 

1.1. 手机上的二级菜单

首先,我们来定义什么是“二级菜单”,就是类似于Microsoft Windows的开始菜单。2005年底看到ucfly制作的强大无线软件ucweb,他们的二级菜单风格让我顿生觑睨之心。后来Opera mini的推出,更让我看到此种风格界面须立即学习。尚无思路之时,恰逢朋友是这方面的强手,从而得窥门径。不敢独享,遂开放代码,希望借此抛砖引玉,使得国内无线Java软件能够百花齐放。

这里给出Opera Mini的界面,让你有一个主观的感受:
Google English   operaMiniMenu   
 

1.2. 二级菜单的功能

我们提供的功能有:

针对手机上以下几种按键,菜单会自动伸缩或响应命令:

l         KEY_SOFT_LEFTKEY_SOFT_RIGHT,代表高端手机的两个左右软键;

l         KEY_UPKEY_DOWNKEY_LEFTKEY_RIGHT,上下左右按键;

l         KEY_FIRE,代表高端手机的“Fire”键。

绘制的部分有四种:

l         主菜单,即第一级菜单;

l         子菜单,即第二级菜单;

l         屏幕下方的状态栏或者左右软键示意按钮;

l         整个屏幕的背景。

 

下图标明了手机上的按键:

 

下图给出了绘制部分的区域划分:

 
 

1.3. 特别之处

左右软按钮:

我们按照bluegammon的行事方式,将绘制底边左右软按钮封装到了SoftButtonControl类里面。这样,通过一个标志,可以设定两种不同的绘制风格。

其一如下所示:


 

其二:


第二种风格中,绘制的按钮矩形会自动随着左右软按钮的标题而伸缩。

 

不同机器键值不同:

如若要发布到不同厂商的机器上,需要根据不同机器的按键值而修改。即,因为同样是KEY_FIRE键,Nokia平台下定义的数值为-5,而摩托罗拉的v80/220/300/400/500/600则声明为20

所以,你在发布的时候,必须针对此,选择用源代码中

MenuBar\src\com\ultrapower\canvas目录下的不同PlatformCanvas代码。比如要发布到Nokia手机上,则不用修改PlatformCanvas.java;发布到摩托罗拉手机上,则使用PlatformCanvas.motov文件中的代码替换PlatformCanvas.java;发布到三星手机上,则使用PlatformCanvas.samsung文件中的代码替换PlatformCanvas.java

2 开源版权声明

由于我这个版本的 MenuBarlet 思路和部分代码来自于朋友,也是混合了bluegammon/jmobilecore基础代码整合而来的,所以决定遵照GPL协议的大意开放源代码,您可以自由传播和修改,在遵照下面的约束条件的前提下:

 

条件1

只要你在MenuBarlet每一副本上明显和恰当地出版版权声明,保持此许可证的声明和没有担保的声明完整无损,并和程序一起给每个其他的程序接受者一份许可证的副本,你就可以用任何媒体复制和发布你收到的原始的程序的源代码。你可以为转让副本的实际行动收取一定费用,但必须事先得到郑昀的同意。

 

条件2

你可以修改MenuBarlet程序的一个或几个副本或程序的任何部分,以此形成基于程序的作品。只要你同时满足下面的所有条件,你就可以按前面第一款的要求复制和发布这一经过修改的程序或作品。

 

a

你必须在修改的文件中附有明确的说明:你修改了这一文件及具体的修改日期。

 

b

你必须使你发布或出版的作品(它包含程序的全部或一部分,或包含由程序的全部或部分衍生的作品)允许第三方作为整体按许可证条款免费使用。

 

c

如果修改的程序在运行时以交互方式读取命令,你必须使它在开始进入常规的交互使用方式时打印或显示声明:包括适当的版权声明和没有担保的声明(或者你提供担保的声明);用户可以按此许可证条款重新发布程序的说明;并告诉用户如何看到这一许可证的副本。(例外的情况:如果原始程序以交互方式工作,它并不打印这样的声明,你的基于程序的作品也就不用打印声明)。

 

这样,您就可以自由使用并传播本源代码,当然请您原封不动地保留原作者信息

3 思路

摘要:本章给出了 MenuBarlet的思路和设计细节。

 

画图主方法中,判断是否画菜单,然后执行:

u       每次都事先清理屏幕,以防止某些区域不更新;

u       绘制背景图片在屏幕正中间;

u       画菜单;

u       画左右软键(抑或是状态栏)的菜单文字。

 

对于画二级菜单,我们则使用MenuBarCanvasdrawMenuBarandItem方法:

n         让当前所选的菜单索引值始终保持在菜单集合内;

n         画子菜单;

n         画主菜单。

至于具体画菜单,则由MenuBarCanvasdrawMenu方法完成:

l         圈定特定区域,也就是整个屏幕;

l         逐个菜单绘制边框和背景色;

l         绘制菜单标题。

那么,菜单项由MenuItem类来封装,并通过MenuBarCanvasupdateMenuItemCoordinate方法来计算每一个菜单项的偏移坐标。

响应按键,均由keyPressedMenuKeyPressed来处理。

具体情况,请看MenuBarCanvas代码,注释非常详细,应该是一望即知。

 

编写者

日期

关键词

郑昀@ultrapower

2006-02-16

Mobile

二级菜单,Canvas

Opera Mini

JavaJ2ME

 

修改历史

 

发表于 @ 2006年02月17日 17:44:00|评论(loading...)|编辑

新一篇: 2月份《程序员》杂志之10佳技术Blog | 旧一篇: [j2me]二级菜单界面演练[四]

评论

#Just Another Place for Me 发表于2006-02-23 18:01:00  IP: 210.52.223.*
TrackBack来自《二级菜单演示 开源声明 - [zt]》

转二级菜单演示 开源声明 - [原创]
模拟mini opera 作的一个二级菜单的实现,很pp,估计会在以后的软件设计中大量的使用,要研究一下以后自己的东西里面也要加入这些pp的东西

Popularity: unra...
#郑昀 发表于2006-03-20 18:21:00  IP: 211.100.21.*
TrackBack来自《[J2ME]增强型二级菜单(AdvdMenuBar)》

对比上个版本的改进之处:
可以根据屏幕计算菜单的长宽和位置,这样所有java手机都可以显示二级菜单,还有悬浮菜单。

菜单项目多的话,可以在屏幕上只绘制适合当前手机屏幕显示的那部分菜单,剩余部分可以用上下按键滚动显示。
#exce4 发表于2006-02-21 18:51:00  IP: 211.103.78.*
menubar-1.0.20-src 源码存在问题,编译时正常,运行的时候,报错如下:
Project settings saved
Building "MenuBarlet"
Build complete
Running with storage root DefaultColorPhone
Running with locale: Chinese_People's Republic of China.936
Enter MenuBarCanvas(Display)!
Error getting resource img background.png>>null
java.io.IOException
at javax.microedition.lcdui.ImmutableImage.getImageFromStream(+15)
at javax.microedition.lcdui.ImmutableImage.<init>(+20)
at javax.microedition.lcdui.Image.createImage(+8)
at MenuBarCanvas.getImage(+51)
at MenuBarCanvas.<init>(+381)
at MenuBarCanvas.getInstance(+15)
at MenuBarlet.startApp(+7)
at javax.microedition.midlet.MIDletProxy.startApp(+7)
at com.sun.midp.midlet.Scheduler.schedule(+270)
at com.sun.midp.main.Main.runLocalClass(+28)
at com.sun.midp.main.Main.main(+116)
Enter addMenu(MenuItem)!mi.menuid=0
Enter addMenu(MenuItem)!mi.menuid=1
Enter addMenu(MenuItem)!mi.menuid=2
Enter addMenu(MenuItem)!mi.menuid=3
Enter updateMenuItemCoordinate!计算各个菜单项的坐标
菜单个数:4
没有parent
计算菜单绘制偏移数值.menuitem.offx=5;menuitem.offy=231
没有parent
计算菜单绘制偏移数值.menuitem.offx=5;menuitem.offy=209
没有parent
计算菜单绘制偏移数值.menuitem.offx=5;menuitem.offy=187
没有parent
计算菜单绘制偏移数值.menuitem.offx=5;menuitem.offy=165
SoftButton::init!
SoftButton::recalcTransparantBuffer>>m_statusbarWidth=240;m_fontHeight=20
创建按钮的透明背景色rgb缓冲区!
End
#zhengyun 发表于2006-02-22 10:19:00  IP: 218.249.90.*
我看到你的输出中有"Error getting resource img background.png>>null ",
显然是工程中的MenuBar\res\icons文件夹下的background.png没有被成功加载。所以请你确定这个图片存在。如果你使用的IDE确实已经加载到了background.png,那么请尝试修改MenuBarCanvas.java的函数:
public static synchronized Image getImage(int id),其中
原文为
img = Image.createImage("/res/icons/" + IMGNAME_MAP[id]);
你可以修改为
img = Image.createImage("/icons/" + IMGNAME_MAP[id]);
不妨试试看。
你所遇到的问题仅仅是你的编译环境下图像加载问题。
#exce4 发表于2006-02-23 00:10:00  IP: 211.103.78.*
原文的
img = Image.createImage("/res/icons/" +IMGNAME_MAP[id]);
修改为
img = Image.createImage("/icons/" + IMGNAME_MAP[id]);
可以了。自己粗心了,上面有注意提示的,没有看到。
谢谢。
#shiyonggang 发表于2006-02-23 12:23:00  IP: 222.70.182.*
有问题,我在eclipse下编译都不通过,是不是有问题啊

Running with storage root SonyEricsson_K700
java.lang.Error: Unresolved compilation problem:
The method setFullScreenMode(boolean) is undefined for the type MenuBarCanvas

at com.ultrapower.canvas.MenuBarCanvas.<init>(+9)
at com.ultrapower.canvas.MenuBarCanvas.getInstance(+15)
at com.ultrapower.midlet.MenuBarlet.startApp(+7)
at javax.microedition.midlet.MIDletProxy.startApp(+7)
at com.sun.midp.midlet.Scheduler.schedule(+270)
at com.sun.midp.main.Main.runLocalClass(+28)
at com.sun.midp.main.Main.main(+116)
Execution completed.
#zhengyun 发表于2006-02-23 12:57:00  IP: 218.249.90.*
setFullScreenMode函数是midp2.0才有的,所以如果你用midp1.0编译肯定不行。
#fnwyq 发表于2008-05-20 10:47:39  IP: 211.143.168.*
PlatformCanvas.moto和PlatformCanvas.motov这两个应该都是针对moto的手机吧,那么如何区分moto的这两类手机?
PlatformCanvas.wtk是不是针对模拟器的按键定义?
发表评论  


登录
Csdn Blog version 3.1a
Copyright © 郑昀