「フリック操作が行われたか?」は、タッチ開始からタッチ終了までの時間と距離で判断する。
インスタンス変数の宣言
1 2 3 4 5 |
@implementation TestFlick { NSTimeInterval timestampBegan_; CGPoint pointBegan_; } |
タッチ開始時のタイムスタンプと位置を保存するための変数を用意する。
タッチ開始
1 2 3 4 5 6 |
- (void) ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [touches anyObject]; timestampBegan_ = event.timestamp; pointBegan_ = [touch locationInView:[touch view]]; } |
タイムスタンプとタッチされた位置を保存しておく。
タッチ終了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
- (void) ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [touches anyObject]; CGPoint pointEnded = [touch locationInView:[touch view]]; NSInteger distanceHorizontal = abs(pointEnded.x - pointBegan_.x); NSInteger distanceVertical = abs(pointEnded.y - pointBegan_.y); if (distanceHorizontal < 10 && distanceVertical < 10) { return; } NSTimeInterval timeBeganToEnded = event.timestamp - timestampBegan_; if (timeBeganToEnded < 0.3) { NSString *message; if (distanceHorizontal > distanceVertical) { if (pointEnded.x > pointBegan_.x) { message = @"右フリック検知"; } else { message = @"左フリック検知"; } } else { if (pointEnded.y > pointBegan_.y) { message = @"下フリック検知"; } else { message = @"上フリック検知"; } } NSLog(@"%@ h:%d v:%d t:%.3f", message, distanceHorizontal, distanceVertical, timeBeganToEnded); } } |
座標とタイムスタンプを取得し、保存しておいたタッチ開始時の値との差を求める。
タッチ開始から終了までの距離の差が10未満の場合は、フリックとは認めない(任意の距離で判定)。
タッチ開始から終了までの時間の差が0.3秒未満の場合、フリックとは認めない(任意の秒数で判定)。
垂直方向と水平方向の移動距離の大きさから、フリックの方向(上下左右)を判断する。
必要に応じて、距離と時間から速度を求める。
コメントを残す
コメントを投稿するにはログインしてください。