软键盘设计的实现与代码分享(TP900掌机)
2017-12-21 13:50
176 查看
一个项目需要。需要在2天时间里在振中掌机上添加一个软键盘,用于输入掌机本身不支持的字符。
接到这个任务后,便开始构思怎么实现,毕竟软键盘的显示与切换没有一个好的算法,用起来会有很多的问题。思来想去,最后确定了方案,开始着手实现。
下面是构造了一个简单的ASCII码数组:
这个码表显示的是我挑选的需要用来输入的字符,共27个字符,组成了3行 x 9列的键盘阵列。最后一个字符的ASCII码为0代表空字符。
下图为完成后的键盘阵列显示。
有了数组编好了,那么该如何显示呢,这就需要考虑阵列的显示算法了。
下面是显示码表源代码。
这个还是比较好实现的。
在完成显示之后,下面要做的便是如何通过上下左右键改变选用的数组索引,并实时刷新键盘显示。
下面是详细代码。
上面便是基于振中掌机实现的软键盘的核心代码,使用它的时候配合自己的应用层程序,可以在需要软键盘的时候调用,不需要的时候关闭,方便高效。
比如我设置一个字符串数组
ASCII[] = {‘A’,”’,’!’};
我想显示三个字符分别为“A”,“ ’”,和“!”。但是编译的时候就会报出在第二个字符单引号的时候编译出错。
所以为了不必要的麻烦,改用了zzdBASE语言。
但后来一想,其实完全可以用ASCII源码代替字符显示,没必要这样,但是既然选择了ZZDbase语言,就用了。相较与c语言,zzdbase语言有一个优点在于代码写起来更容易理解,读起来也更顺畅。因为没有没有指针的概念,所以有些地方实现起来是有困难,但是总体代码流畅度更高。当然c的可发挥空间更大,两者相比见仁见智吧,适合项目的就是最好的,你觉得呢?
接到这个任务后,便开始构思怎么实现,毕竟软键盘的显示与切换没有一个好的算法,用起来会有很多的问题。思来想去,最后确定了方案,开始着手实现。
关于代码的实现思想
其实实现起来不是很难,字符的输入与显示便是ASCII码,只要把ASCII码按照自己想要排列的键盘样式编好数组,然后通过上下左右键实现不同ASCII码的选择与切换即可。关于数组实现
因为我这次是基于振中掌机去做的软键盘,所以选用了振中掌机的zzdBase语言进行编写。下面是构造了一个简单的ASCII码数组:
ASCData{1,1} = 126 ASCData{2,1} = 33 ASCData{3,1} = 64 ASCData{4,1} = 35 ASCData{5,1} = 36 ASCData{6,1} = 37 ASCData{7,1} = 94 ASCData{8,1} = 38 ASCData{9,1} = 44 ASCData{10,1} = 92 ASCData{11,1} = 61 ASCData{12,1} = 60 ASCData{13,1} = 62 ASCData{14,1} = 63 ASCData{15,1} = 91 ASCData{16,1} = 93 ASCData{17,1} = 123 ASCData{18,1} = 125 ASCData{19,1} = 95 ASCData{20,1} = 124 ASCData{21,1} = 96 ASCData{22,1} = 39 ASCData{23,1} = 32 ASCData{24,1} = 34 ASCData{25,1} = 59 ASCData{26,1} = 58 ASCData{27,1} = 0
这个码表显示的是我挑选的需要用来输入的字符,共27个字符,组成了3行 x 9列的键盘阵列。最后一个字符的ASCII码为0代表空字符。
下图为完成后的键盘阵列显示。
有了数组编好了,那么该如何显示呢,这就需要考虑阵列的显示算法了。
阵列显示算法
阵列显示主要思想便是在第一行显示前9个字符,按顺序显示,第2行显示第10~18个字符,最后一行显示第19-27个字符。因为我要把键盘显示在屏幕的第7-第9行,所以我的首行设为7。下面是显示码表源代码。
Procedure 显示ASCII码表 clear 7,3 SET INTENSITY ON @7,0 say SPACE(20) @8,0 say SPACE(20) @9,0 say SPACE(20) /* 绘制坐标 */ LINE 0,111,159,111 LINE 0,110,159,110 LINE 0,109,159,109 LINE 0,108,159,108 LINE 0,107,159,107 LINE 0,106,159,106 i=1 Do While i <= 27 L1 = ASCData{i,1} if i<=9 .AND. i>=1 L2 = i*2-1 IF i = INDEX SET INTENSITY OFF // 设置屏幕反显 白色高亮选中 @7,L2+1 say CHR(L1) SET INTENSITY ON // 恢复屏幕常显 黑色等待选中 @7,L2 say SPACE(1) Else SET INTENSITY ON @7,L2+1 say CHR(L1) @7,L2 say SPACE(1) EndIf EndIf if i<=18 .AND. i>=10 L2 = (i-9)*2-1 IF i = INDEX SET INTENSITY OFF @8,L2+1 say CHR(L1) SET INTENSITY ON @8,L2 say SPACE(1) Else SET INTENSITY ON @8,L2+1 say CHR(L1) @8,L2 say SPACE(1) EndIf EndIf if i<=27 .AND. i>=19 L2 = (i-18)*2-1 IF i = INDEX SET INTENSITY OFF @9,L2+1 say CHR(L1) SET INTENSITY ON @9,L2 say SPACE(1) Else SET INTENSITY ON @9,L2+1 say CHR(L1) @9,L2 say SPACE(1) EndIf EndIf i=i+1 EndDo SET INTENSITY OFF return Endpro
这个还是比较好实现的。
在完成显示之后,下面要做的便是如何通过上下左右键改变选用的数组索引,并实时刷新键盘显示。
键盘显示刷新
因为我排列好了键盘,因此只需要做到在键盘上按下“上”键时,索引-9,按下“左”键时,索引-1,同样按下“右”键索引+1,按下“下”键索引+9,但是要考虑索引越界的情况,当按“上”键索引-9之后,如果索引小于零,此时应+27保证索引变为最后一行的对应列。下面是详细代码。
Procedure 软键盘输入 INDEX = 1 /* 数组索引,默认选择第一个,即“~” */ Do 显示ASCII码表 Do while .T. Wait "" To HitKey if Asc(HitKey) = 11 && 左移 INDEXTEM = INDEX // 索引暂存缓冲 INDEX = INDEX - 1 if INDEX < 1 INDEX = 27 EndIf EndIf if Asc(HitKey) = 12 && 右移 INDEXTEM = INDEX INDEX = INDEX + 1 if INDEX > 27 INDEX = 1 EndIf EndIf if Asc(HitKey) = 14 && 下 INDEXTEM = INDEX INDEX = INDEX + 9 if INDEX > 27 INDEX = INDEX - 27 EndIf EndIf if Asc(HitKey) = 17 && 上 INDEXTEM = INDEX INDEX = INDEX - 9 if INDEX < 1 INDEX = INDEX + 27 EndIf EndIf if INDEX>=1 .AND. INDEX <=9 // 新的选中的键 坐标索引 L3 = 7 L2 = INDEX*2 EndIf if INDEX>=10 .AND. INDEX <=18 L3 = 8 L2 = (INDEX-9)*2 EndIf if INDEX>=19 .AND. INDEX <=27 L3 = 9 L2 = (INDEX-18)*2 EndIf if INDEXTEM>=1 .AND. INDEXTEM <=9 //上一个选中的键索引 L4 = 7 L5 = INDEXTEM*2 EndIf if INDEXTEM>=10 .AND. INDEXTEM <=18 L4 = 8 L5 = (INDEXTEM-9)*2 EndIf if INDEXTEM>=19 .AND. INDEXTEM <=27 L4 = 9 L5 = (INDEXTEM-18)*2 EndIf L1 = ASCData{INDEXTEM,1} L9 = ASCData{INDEX,1} SET INTENSITY OFF // 刷新新键键盘显示 @L3,L2 say CHR(L9) SET INTENSITY ON @L4,L5 say CHR(L1) // 刷新上一个键键盘显示 SET INTENSITY OFF //以上为键盘刷新,以下为应用层操作 if Asc(HitKey) = 13 && 确认 i=1 Do while i < 33 L3 = TempString32{i,1} if L3 = 0 TempString32{i,1} = ASCData{INDEX,1} Do 刷新APN Exit endif i=i+1 Enddo EndIf if Asc(HitKey) = 92 .or. Asc(HitKey) = 24 clear 7,3 Exit EndIf if Asc(HitKey) = 8 && 删除 i=1 Do while i < 33 L3 = TempString32{i,1} if L3 = 0 TempString32{i-1,1} = 0 Do 刷新APN Exit endif i=i+1 Enddo EndIf EndDo return Endpro
上面便是基于振中掌机实现的软键盘的核心代码,使用它的时候配合自己的应用层程序,可以在需要软键盘的时候调用,不需要的时候关闭,方便高效。
写在后面
其实最开始是想用C语言去做这个事情,但是用C写到一半的时候,发现ASCII码在设置大数组的时候,有些符号会当做特殊字符编译,很是烦人。比如我设置一个字符串数组
ASCII[] = {‘A’,”’,’!’};
我想显示三个字符分别为“A”,“ ’”,和“!”。但是编译的时候就会报出在第二个字符单引号的时候编译出错。
所以为了不必要的麻烦,改用了zzdBASE语言。
但后来一想,其实完全可以用ASCII源码代替字符显示,没必要这样,但是既然选择了ZZDbase语言,就用了。相较与c语言,zzdbase语言有一个优点在于代码写起来更容易理解,读起来也更顺畅。因为没有没有指针的概念,所以有些地方实现起来是有困难,但是总体代码流畅度更高。当然c的可发挥空间更大,两者相比见仁见智吧,适合项目的就是最好的,你觉得呢?
相关文章推荐
- Java设计模式之代理模式原理及实现代码分享
- Hibernate一对多关联双向关联代码实现分享
- javascript伸缩菜单栏实现代码分享
- TabHost ----使用1(用代码来实现功能但没有将界面设计和代码分开)
- 设计模式----状态模式UML和实现代码
- Control Study -> 键盘模拟鼠标(实现用键盘操作鼠标光标)(示例代码下载)
- Asp.net 2.0 GridView的几个事件(如实现: 行的双击/单击/捕捉键盘按键/鼠标悬浮/移出效果)(示例代码下载)
- Android实现消水果游戏代码分享
- 以金山界面库(openkui)为例思考和分析界面库的设计和实现——代码结构(完)
- java计划任务调度框架quartz结合spring实现调度的配置实例代码分享
- js实现类似MSN提示的页面效果代码分享
- php单链表实现代码分享
- 设计模式----职责链模式UML和实现代码
- 通过gpfdist unload 与load java 代码设计和实现
- JavaScript中实现无缝滚动、分享到侧边栏实例代码
- 《第一行代码Java》接口实现代理设计模式(Proxy)笔记与代码
- 【字符串处理算法】将输入字符串中的各个单词反序的算法设计及C代码实现
- Angular实现下载安装包的功能代码分享