您的位置:首页 > 编程语言

软键盘设计的实现与代码分享(TP900掌机)

2017-12-21 13:50 176 查看
一个项目需要。需要在2天时间里在振中掌机上添加一个软键盘,用于输入掌机本身不支持的字符。

接到这个任务后,便开始构思怎么实现,毕竟软键盘的显示与切换没有一个好的算法,用起来会有很多的问题。思来想去,最后确定了方案,开始着手实现。

关于代码的实现思想

其实实现起来不是很难,字符的输入与显示便是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的可发挥空间更大,两者相比见仁见智吧,适合项目的就是最好的,你觉得呢?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息