我们的一个自助服务终端应用程序缺少物理键盘,我们需要添加文本条目。由于它只附加了数字键盘,我们认为我们不妨使用旧的手机输入法。我已经能够发现它被称为multitap(go figure),但我找不到任何算法实现。有谁知道吗?
(我不能将输入限制为字典,所以我不能使用类似T9的方法)
答案 0 :(得分:1)
所以除零之外的每个按钮都以4的增量工作。因此,对某个小键盘数字的点击次数无关紧要,只需将其除以4并取余数,1 =数字,2 =首字母,3 =第二个字母,0 =第三个字母。然后,根据您希望用户使用的符号数量,您可以对键盘0及其符号使用相同的概念
1-A-B-C
2-d-E-F
3-G-H-I
4-J-K-L
5-M-N-O
6-P-Q-R
7-S-T-U
8-V-W-X
9-y-z-WhiteSpace
0 - 符号
答案 1 :(得分: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,将最后一个偶数时间设置为现在,并设置{{1刚刚按下的数字。这是一个更简单的案例。
如果有人试图输入'abc',我们需要知道何时区分第一个输入的结束和下一个输入的开始。为此,我们使用计时器。如果第一个水龙头和刚刚发生的水龙头之间的差异在一定限度内(可能是半秒或一秒),那么我们增加水龙头,如果它在它之外,我们决定他们从'a'开始到'b',此时我们经历与用户按下与上一个键不同的键时相同的输出过程,除非我们没有更改最后一个键的值,因为它没有改变。
lastNum
是值得讨论的最后一件事。这很简单,你可以为值2-9硬编码2D数组,使索引变得简单,我们将保留0和1但是将它们留空。
意思是,数组类似于;
GetLetter
这使索引更简单, '', '','', ''
'', '', '', ''
'2', 'a', 'b', 'c'
'3', 'd', 'e', 'f'
//ect
只返回GetLetter(2, 2)
,这是正确的'b'。
因为2键上的7次连续点击会产生'c',所以如果它大于3,则对值进行模拟4(因为4%4是0,因此我应该在索引0处产生数字本身)。现在values[2][2]
将返回GetLetter(6, 2)
,这是正确的'b'。
1是一个特例。为此,我们只使用一个具有多个值(可能是20或其他)的一维数组,并且我们对它的输入也做模数,但显然它是基于该数组的长度。我对这种情况的模数可能是错误的,但修复起来很简单。
答案 2 :(得分:0)
它实际上是四按,看着我的电话拨号盘上的字母。
我不知道是否有星号和英镑键的标准,但这些字母可以放在查询表中。
例如,
7 key, three taps, returns R
5 key, one tap, returns J
如果您确实需要这个号码,那就是额外的点击。
7 key, five taps, returns 7
我相信我的古老手机上的英镑钥匙从上到下移动,从下到上移动。还有一个标题案例,会产生一个大写字母并转移到小写字母。
星号键弹出一个标点符号表。您可以使用2,4,6和8键来导航表格并选择一个符号。