-1

我们的信息亭应用程序之一缺少物理键盘,我们需要向其添加文本输入。由于它只有一个数字键盘,我们认为我们不妨使用旧的手机输入方法。我已经能够发现它被称为 multitap (go figure),但我找不到任何算法实现。有人知道吗?

(我不能将输入限制为字典,所以我不能使用类似 T9 的方法)

4

3 回答 3

1

因此,除零之外的每个按钮都以 4 为增量工作。因此,无论单击某个键盘数字多少次,只需将其除以 4 并取余数,1=数字,2=第一个字母,3=第二个字母, 0 = 第三个字母。然后根据您希望允许用户使用多少个符号,您可以对键盘 0 及其符号使用相同的概念

1-ABC

2-def

3-ghi

4-jkl

5-mno

6-pqr

7-stu

8-vwx

9-yz-空白

0-符号

于 2012-12-13T00:09:00.423 回答
1

我会结合使用计时器和 int 来计算水龙头。这是纯伪代码,但会给出基本概念。

long lastEvent = 0;
int lastNum = 0;
int taps = 0;


eventListener(KeyEventArgs e)
{
    if (e.Value == lastNum)
    {
         if ((DateTime.Now.ToFileTimeUtc() - lastEvent) < AppropriateTimeLimit)
         {
              taps++;
         }
         else
         {
              GetLetter(taps, lastNum);
              lastEvant = DateTime.Now.ToFileTimeUtc();
              taps = 0;
         }
    }
    else
    {
              GetLetter(taps, lastNum);
              lastEvant = DateTime.Now.ToFileTimeUtc();
              taps = 0;
              lastNum = e.Value;
    }
}

char GetLetter(int taps, int num)
{
     if (num == 1)
         return punctuationVals[taps % length -1];
     else if (num == 0)
         return ' '; //from what I remember 0 was for spaces on most phones
     else
     {
         int val;
         if (taps > 3)
             val = taps % 4; // old phones wrap around back to the first char if I press the key 5 times
         else 
             val = taps;
          return values[num][val];
     }

}

char[][] values = new char[9][4]; // statically code all of your chars in these arrays
char[] punctuationVals = new char[idkHowMany];

所以这里是设计概述。首先,我们有一个事件监听器来处理所有的输入事件。我们知道点击序列在以下两种情况之一下完成 1) 时间已过(如果您记得在旧手机上打字,如果我想输入“abc”,我必须按 2 一次,等一秒钟左右,按 2两次 再等一秒钟,按 2 三次)或 2) 按下了一个新键。

在任何一种情况下,我们都需要知道最后按下的键是什么,以便我们跟踪它。如果键输入与最后按下的键不匹配,那么我们可以安全地输出最后按下的键,因此我们调用GetLetter,将抽头重置为 0,将最后一个偶数时间设置为现在,并将 设置lastNum为刚刚按下的数字。这是更简单的情况。

如果有人尝试输入“abc”,我们需要知道何时区分第一个输入的结束和下一个输入的开始。为此,我们使用计时器。如果第一次轻拍和刚刚发生的轻拍之间的差异在某个限制内(可能是半秒或一秒),那么我们增加轻拍,如果它在它之外,我们决定它们已经从“a”移动到'b',此时我们会经历与用户按下与上一个不同的键时相同的输出过程,除了我们不更改最后按下的键的值,因为它没有改变。

GetLetter是最后值得讨论的事情。这相当简单,您为值 2-9 硬编码一个 2D 数组,为了简化索引,我们将保留 0 和 1,但将它们留空。

意思是,数组类似于;

  '', '','', ''
  '', '', '', ''
  '2', 'a', 'b', 'c' 
  '3', 'd', 'e', 'f'
  //ect

这使得索引更简单,GetLetter(2, 2)只需返回values[2][2]正确的'b'。

因为在 2 键上连续敲击 7 次会产生“c”,如果它大于 3,我们会对值进行 mod 4(三个因为 4 % 4 是 0,这应该产生我在索引 0 处拥有的数字本身)。现在GetLetter(6, 2)将返回values[2][2]正确的'b'。

1是特例。为此,我们只使用具有许多值(可能是 20 或其他值)的一维数组,并且我们也对其输入进行取模,但显然它基于该数组的长度。我在这种情况下的模数可能是错误的,但修复起来很简单。

于 2012-12-13T00:41:04.433 回答
0

它实际上是四次轻击,查看我电话拨号盘上的字母。

我不知道星号和井号键是否有标准,但这些字母可以放在查找表中。

例如,

7 key, three taps, returns R
5 key, one tap, returns J

如果你真的需要这个号码,那是一个额外的水龙头。

7 key, five taps, returns 7

我相信我古代手机上的井号键从大写变为小写,从小写变为大写。还有一个标题大小写,它将产生一个大写字母并转换为小写字母。

星号键弹出标点符号表。您可以使用 2、4、6 和 8 键来导航表格并选择一个符号。

于 2012-12-11T18:44:04.580 回答