iPhoneのセンサの数値を滑らかにする
メディア系で加速度センサなどの値を扱う場合、値を滑らかにするというか間引くことがよくあります。
内部処理では0.5秒ごとに数値を吐き出す必要があるけど、出力する数値は1秒ごとがいいとかそういう感じのものです。
iPhoneの場合、NSTimeを使います。
あ、数値を平均して何秒ごとに出力する方法もありますが、ここではそれには触れていません。
以下の例では加速度センサの値は0.5秒ずつ取っていますが、UILabelで表示されている数値は1秒ごとに表示されています。
分かりやすいように1秒ごとに数値が増えるタイマーも同時に表示しておきました。これで1秒ごとに数値が更新されているのが分かると思います。
UILabelの線の接続をお忘れなく。
ソースはこちらから。
ViewController.h
#import <UIKit/UIKit.h> //加速度センサ使うよ宣言の<UIAccelerometerDelegate> @interface ViewController : UIViewController <UIAccelerometerDelegate> { IBOutlet UILabel *sensorValueX; IBOutlet UILabel *sensorValueY; IBOutlet UILabel *sensorValueZ; //加速度センサの値出力用変数 double x,y,z; //タイマー用ラベル IBOutlet UILabel *time; } @end
ViewController.m
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. //加速度センサ設定、updateIntervalは何秒ごとに値を出力するか UIAccelerometer *kasokudo = [UIAccelerometer sharedAccelerometer]; kasokudo.updateInterval = 0.5; kasokudo.delegate = self; //加速度センサの値を間引く用(1秒ごと) [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(valueLabel:) userInfo:nil repeats:YES]; //タイマー設定 [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerLabel:) userInfo:nil repeats:YES]; } //タイマー動作 - (void)timerLabel:(NSTimer *)timer { int currentTime = [time.text intValue]; int newTime = currentTime + 1; time.text = [NSString stringWithFormat:@"%d",newTime]; } //加速度センサを起動してどうするか - (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration { x = acceleration.x; y = acceleration.y; z = acceleration.z; } //加速度センサの値を表示 - (void)valueLabel:(NSTimer *)timer { sensorValueX.text = [NSString stringWithFormat:@"x = %f",x]; sensorValueY.text = [NSString stringWithFormat:@"y = %f",y]; sensorValueZ.text = [NSString stringWithFormat:@"z = %f",z]; } ...