iPhone 端末を振る動作(シェイクジェスチャー)検知方法 2009 年 8 月 19 日

iPhone端末を振った時に、シェイクアクションを検知して、アプリ内で様々なアクションに割り当てる方法がないかググりながら探ってみた。

まずはiPhone Reference Libraryからサンプルコード
iPhone Dev Center > iPhone Reference Library > Topics > Data Management: Device Information >
AccelerometerGraph※要ログイン

ちょっと複雑すぎて。。
もちっとシンプルなコードはないもんかとググる。

そのものずばりじゃないけど、これがシンプルなコードでよさそう。
iPhone Tutorial - Reading the Accelerometer

まずは上記のX,Y,Zの値が取得できるかを実機で動作確認をして、それから以下のブログから加速度を検知する部分を持ってきて、組み合わせてみた。

加速度センサ サンプルCommentsAdd Star
iPhone を振ったのを検知する方法

TestViewController.h

C
#import <UIKit/UIKit.h>
@interface TestViewController : UIViewController <UIAccelerometerDelegate> {
	UIAccelerometer *accelerometer;
}
@property (nonatomic, retain) UIAccelerometer *accelerometer;
@end

TestViewController.m

C
#import "TestViewController.h"
@implementation HeViewController
@synthesize accelerometer;
- (void)viewDidLoad {
    [super viewDidLoad];

	//シェイクジェスチャー検知準備
	self.accelerometer = [UIAccelerometer sharedAccelerometer];
	self.accelerometer.updateInterval = 0.1;
	self.accelerometer.delegate = self;

	//音の再生準備
	NSString *path = [[NSBundle mainBundle] pathForResource:@"he" ofType:@"caf"];
	NSURL *url = [NSURL fileURLWithPath:path];
	AudioServicesCreateSystemSoundID((CFURLRef)url, &soundID);
}

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
	const float violence = 1.5;
	static BOOL beenhere;
	BOOL shake = FALSE;	

	if (beenhere) return;
	beenhere = TRUE;

	if (acceleration.x > violence || acceleration.x < -1*violence)
	{
		shake = TRUE;
	}
	if (acceleration.y > violence || acceleration.x < -1*violence)
	{
		shake = TRUE;
	}
	if (acceleration.z >violence || acceleration.z < -1*violence)
	{
		shake = TRUE;
	}
	if (shake)
	{
		//self.ここに処理を入れる;
	}
	beenhere = FALSE;
}
以下省略

関連する記事:

Leave a Reply