キオスク アプリケーションの 1 つに物理キーボードがなく、テキスト入力を追加する必要があります。テンキーしか付いていないので、昔ながらの携帯電話の入力方法を使ったほうがいいのではないかと考えました。それがマルチタップと呼ばれていることを知ることができましたが(図を参照)、アルゴリズムの実装が見つかりません。誰か知っていますか?
(辞書への入力を制限できないため、T9 のようなアプローチは使用できません)
したがって、ゼロを除く各ボタンは 4 の増分で機能します。そのため、特定のキーパッド番号を何回クリックしても問題ありません。それを 4 で割って余りをとります。1=数字、2=最初の文字、3=2 番目の文字、 0 = 3 番目の文字。次に、ユーザーに使用を許可する記号の数に応じて、キーパッド 0 とその記号に同じ概念を使用できます
1-abc
2-デフ
3ギ
4-jkl
5分
6pqr
7-stu
8-vwx
9-yz-ホワイトスペース
0 シンボル
タイマーを 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];
というわけで、デザイン概要です。まず、すべての入力イベントを処理するイベント リスナーがあります。タップ シーケンスは 2 つの条件のいずれかで完了することがわかっています。 2 回、さらに 1 秒待って、2 を 3 回押します) または 2) 新しいキーが押されました。
どちらの場合も、最後に押されたキーが何であったかを知る必要があるため、それを追跡します。キー入力が最後に押されたキーと一致しない場合は、最後に押されたキーを安全に出力できます。したがって、 を呼び出しGetLetter
、タップを 0 にリセットし、最後の偶数時間を現在に設定し、lastNum
をちょうど押された番号に設定します。これはより単純なケースです。
誰かが「abc」を入力しようとした場合、最初の入力の終わりと次の入力の開始をいつ区別するかを知る必要があります。これにはタイマーを使用します。最初のタップと発生したばかりのタップの差が制限内 (おそらく 0.5 秒または 1 秒) の場合、タップをインクリメントし、それが範囲外の場合は、「a」から移動したと判断します。この時点で、ユーザーが最後とは異なるキーを押したときと同じ出力プロセスを実行しますが、最後に押されたキーの値は変更されていないため変更されません。
GetLetter
議論する価値のある最後のことです。これは非常に単純です。値 2 ~ 9 の 2D 配列をハード コードします。インデックス付けを単純にするために、0 と 1 を保持しますが、空白のままにします。
つまり、配列は次のようなものです。
'', '','', ''
'', '', '', ''
'2', 'a', 'b', 'c'
'3', 'd', 'e', 'f'
//ect
これにより、インデックス付けが簡単になり、正しい 'b' をGetLetter(2, 2)
返すだけです。values[2][2]
2 キーを 7 回連続してタップすると 'c' が生成されるため、値が 3 より大きい場合は mod 4 を実行します (4 % 4 は 0 であり、インデックス 0 にある数値自体を生成する必要があるため 3 です)。これで、正しくは 'b'GetLetter(6, 2)
が返されます。values[2][2]
1は特殊なケースです。そのためには、多くの値 (おそらく 20 か何か) を持つ 1 次元配列を使用するだけで、その入力に対してモジュラスも実行しますが、明らかにその配列の長さに基づいています。この場合のモジュラスは間違っているかもしれませんが、簡単に修正できます。
電話のダイヤルパッドの文字を見ると、実際にはクワッドタップです。
アスタリスクとポンドキーの標準があるかどうかはわかりませんが、文字をルックアップテーブルに入れることができます。
例えば、
7 key, three taps, returns R
5 key, one tap, returns J
実際に番号が必要な場合は、追加のタップでした。
7 key, five taps, returns 7
私の古代の携帯電話のポンドキーは大文字から小文字に、そして小文字から大文字にシフトしたと思います。大文字を生成して小文字にシフトするタイトルケースもありました。
アスタリスクキーは句読点記号テーブルをポップアップしました。2、4、6、および8キーを使用して、テーブルをナビゲートし、記号を選択できます。