软键盘设计的实现(TP900掌机)

简介: 软键盘设计的实现(TP900掌机)

一个项目需要。需要在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代表空字符。
下图为完成后的键盘阵列显示。
image.png

有了数组编好了,那么该如何显示呢,这就需要考虑阵列的显示算法了。

阵列显示算法

阵列显示主要思想便是在第一行显示前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的可发挥空间更大,两者相比见仁见智吧,适合项目的就是最好的,你觉得呢?

相关文章
|
2天前
|
Android开发
Android 12修改usb tp触摸唤醒
Android 12修改usb tp触摸唤醒
14 0
|
2天前
|
XML 存储 Android开发
Android系统 添加动态控制USB TP触摸方向、触摸唤醒
Android系统 添加动态控制USB TP触摸方向、触摸唤醒
34 0
|
2天前
|
存储 Android开发
Android 解决USB TP驱动中触摸卡顿和防抖动问题
Android 解决USB TP驱动中触摸卡顿和防抖动问题
26 1
|
2天前
[MFC] Edit控件上的数据(可控固定位数)显示
[MFC] Edit控件上的数据(可控固定位数)显示
47 0
ViewPager如何区分自动切换和手势滑动切换
ViewPager是一个很常见的组件,不仅支持收拾滑动切换页面,我们还可以通过`viewPager.setCurrentItem(index)`来切换到指定的页面,那么他们如何区分呢? 我们知道ViewPager可以添加`ViewPager.OnPageChangeListener`监听器,可以监听切换的状态。通过观察`ViewPager.OnPageChangeListener#onPageScrollStateChanged(int state)`方法中state的输出,发现了手势切换和自动切换的规律。
|
前端开发 调度 Android开发
从显示 Tap 位置的原理窥探 Android Input 系统
从显示 Tap 位置的原理窥探 Android Input 系统
从显示 Tap 位置的原理窥探 Android Input 系统
|
消息中间件 缓存 算法
Android GPU呈现模式原理及卡顿掉帧浅析
Android GPU呈现模式原理及卡顿掉帧浅析
867 0
Android GPU呈现模式原理及卡顿掉帧浅析
减小TabLayout高度而不影响每个tab展示的几种方法
在Support Design库中有一个新的组件TabLayout,配合TabItem实现tab页面的形式。 但是图标和文字组合的tab的默认情况下,TabLayout中的tab太高,占据太多布局。 但是如果直接将TabLayout高度改小,很容易出现图标显示不全的情况,因为图标和字体及两者的间距没有跟着改变。 这时可以从几个方面处理:
241 0
|
Android开发 数据格式 XML
Android dispatchTouchEvent检测多点触摸事件是否落入在某一个View区域内
Android dispatchTouchEvent检测多点触摸事件是否落入在某一个View区域内 检测发生在Android设备屏幕上到的点击事件是否发生在某一个View的区域内,重点方法是touchEventInView,该方法进行具体的检测,如果返回true,则表明该事件是发生在当前的参数view范围内,返回false则不是。
2329 0