タップのインターバルってどのぐらい?
前回の『タップ数でダイレクトにセレクトしたい…』で
タップインターバルを0.5秒としたが…
実際に0.5秒と明確に書いてあるものが無い…。(汗)
アップルのヘルプにも書いてないっぽい。
でもインターバルが分からん事には、ディレイの設定ができん…。
こっちには、0.5秒だとある。
説明に
「ダブルタップインターバルのデフォルトは、0.5でしょう。
0.2では、早すぎるし1.0では、遅すぎる。」
みたいな事が書いてある。
…
本当か?
それをどうしたら確認できる?
ゴロゴロ…
ゴロゴロ…
ゴロゴロ…
ピコン♪
タップをプログラムで発生させどのタイミングで
ダブルタップになるか測定する!
ってのは、どうだろう?
まずは、タッチをどう発生させるか…?
…
…
…
色々、大変そうなのでやめ…。(汗)
もっと簡単な方法は無いかなぁ~?
…
じゃあ、アトランダムにタップを行い
それを計測するのはどうだろう?
…
これなら簡単に出来そうだ…。
『touchesBegan』に来た時に時間を取得する。
次の『touchesBegan』に来た時の時間と比較する。
タップと認識している、していない時の時間を
ストックしていって最終的にこの辺りと
絞り込む処理を作成してみよう。
…
…
…
『GetTickCount』みたいな関数が無い…!?
タイマースレッドを立ち上げて自前でカウンターを作るのか!?
…
精度に難がありそうだけど…
取り合えずやってみる。
[TapTestViewController.h]
- ( void )touchesBegan:( NSSet* )touches withEvent:( UIEvent* )event;
[TapTestViewController.m]
...
NSTimer *timer;
unsigned int tmerCount;
-(void)timerFunc
{
tmerCount++;
}
...
- (void)viewDidLoad {
timer = [NSTimer scheduledTimerWithTimeInterval:0.001 target:self selector:@selector( timerFunc ) userInfo:nil repeats:YES];
[super viewDidLoad];
}
...
//******************************************************************************
// タッチ処理
//******************************************************************************
//**************************************
// Work
//**************************************
unsigned int countBackup;
unsigned int onTap;
unsigned int noTap = 10000;
//**************************************
// touchesBegan
//**************************************
- ( void )touchesBegan:( NSSet* )touches withEvent:( UIEvent* )event
{
unsigned int between;
int tap;
UITouch *touch = [touches anyObject];
between = tmerCount - countBackup;
countBackup = tmerCount;
tap = [touch tapCount];
if( tap > 1 )
{// 連続タップ
if( onTap < between )
onTap = between;
} else
{// 非連続タップ
if( noTap > between )
noTap = between;
}
char string[512];
sprintf( string, "taps:%2d\nget sec:%4d\non sec:%4d\nno sec:%4d", tap, between, onTap, noTap );
[infoTextView setText:[NSString stringWithUTF8String:string] ];
}
//******************************************************************************
// End
//******************************************************************************
で試しに動かしてみた…。
※シミュレータでの動作だけどね…。
でこんな感じになった。
…
あれ?
0.6秒を連続タップと認識するのか?
でも0.4秒をシングルタップって認識する?
…
もしかしてタップインターバルが変動している?
連続タップした時の間から次のタップインターバルを
算出しているのならインターバルの定数が無いのもうなずける。
早く連続タップすると次のシングルタップ判定の
インターバルが0.5を切るみたいだし…。
本当にそう言う処理をしているか謎だけどね。
単に精度が悪いって事もあるけどね…。
実記じゃなくシミュレータってのも多分に影響しているだろうし。
でも個人差をこう言う形で吸収しているのなら凄いかも…。
音楽ゲームやタイミングゲームでタップを主体にした
ものは、誤作動するかもしれないのでこの方式は取らない方が無難そうだ。
でもタップインターバルは、0.5秒辺りに収束するっぽいので
0.5秒で良いんじゃない?
で、結論は…
0.5秒って事にしよう♪
てす…。
PS.
試しにタップ回数ごとの時間を取ってみた。
他にソースをこんな感じに直して
ダブルタップ限定で時間を取得してみた。
if( tap == 2 )
{// 連続タップ
if( onTap < between )
onTap = between;
} else
if( tap == 1 )
{// 非連続タップ
if( noTap > between )
noTap = between;
}
まあ、0.5秒ぐらいが適当かと思う。
まあ、処理を間違えてないければ…
だけどね…。(汗)
サンプルは、こちら。
| 固定リンク
コメント