加速计(UIAccelerometer)是一个单例模式的类,所以需要通过方法sharedAccelerometer获取其唯一的实例。
加速计需要设置的主要有两个:
一个是设置其代理,用以执行获取
加速计信息的方法;
另一个是设置
加速计获取信息的频率。 最高支持每秒100次。
UIAccelerometer *accelerometer = [UIAccelerometersharedAccelerometer];
accelerometer.delegate =self;
accelerometer.updateInterval =1.0/30.0f;
下面是加速计的代理方法,需要符合协议<UIAccelerometerDelegate>.
-(void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{
// NSString *str = [NSString stringWithFormat:@"x:%g\ty:%g\tz:%g",acceleration.x,acceleration.y,acceleration.z];
// NSLog(@"%@",str);
//检测摇动, 1.5为轻摇,2.0为重摇
// if (fabsf(acceleration.x)>1.8||
// fabsf(acceleration.y)>1.8||
// fabsf(acceleration.z>1.8)) {
// NSLog(@"你摇动我了~");
// }
static NSInteger shakeCount = 0;
static NSDate *shakeStart;
NSDate *now = [[NSDate alloc]init];
NSDate *checkDate = [[NSDatealloc]initWithTimeInterval:1.5fsinceDate:shakeStart];
if ([now compare:checkDate] == NSOrderedDescending || shakeStart ==nil) {
shakeCount =0;
[shakeStart release];
shakeStart = [[NSDatealloc]init];
}
[now release];
[checkDate release];
if (fabsf(acceleration.x)>1.7||
fabsf(acceleration.y)>1.7||
fabsf(acceleration.z)>1.7) {
shakeCount ++;
if (shakeCount >4) {
NSLog(@"你摇动我了~");
shakeCount =0;
[shakeStartrelease];
shakeStart = [[NSDatealloc]init];
}
}
}
iphone静止时受到的地球引力为1g,这是加速计确定手机朝向的基础。分为三个轴x,y,z,如果手机以任何方式垂直水平放置,这1g的力将分布在一条轴上,如果设备倾斜,将分布在多条轴上。
首先在h文件中添加一个label 并property一下
在xib中连接好设置的控件,我们用label显示手机的位置情况
{
if(acceleration.x>0.5)
{
orientation.text=@"Right side";
}
else if(acceleration.x<-0.5)
{
orientation.text=@"left side";
}
else if(acceleration.y>0.5)
{
orientation.text=@"upsid down";
}
else if(acceleratrion.y<-0.5)
{
orientation.text=@"standing up";
}
else if(acceleration.z>.5)
{
orientation.text=@"facedown";
}
else if(acceleration.z<-0.5)
{
orientation.text=@"face up";
}
}
下面我在viewdidload中添加刚才上述的获取加速器的三步,就可以完成这个小实验了
下面我们来实现这个delegate的方法
-(void)accelerometer:(UIAcclerometer *)accelerometer
{
if(value>1.0){value=1.0}
colorView.alpha=value;
}
最后我们还是在viewdidload中加入开始提到的那三步。
{
if(acceleration.x>1.3)
{
colorView。backgroundcolor=[UIcolor greencolor];
}
else if(acceleration.x<-1.3)
{
colorVIew.backgroundcolor=[UIcolor orangecolor];
}
.....(此处略去其他方向的代码了)
}
-(void)accelerometer:(UIAcclerometer *)accelerometer
{
[self setbasecoulor:acceleration];
if(value>1.0){value=1.0}
colorView.alpha=value;
}
}
UIAccelerometer加速计是用来检测iphone手机在x.y.z轴三个轴上的加速度。要获得此类调用:
其他资料:
内置 加速计是iPhone和iPodTouch中最酷的特性之一,iPhone可以通过这个小设备知道用户握持手机的方式,以及用户是否移动了手机。iPhoneOS使用 加速计处理自动旋转,并且许多游戏都使用他做为控制机制。它还可以用于检测摇动和其他突发的运动。
通过感知特定方向的惯性力总量,加速计可以测量出加速度和重力。iPhone内的加速计是一个三轴加速计,这意味着他能够检测到三维空间中的运动或重力引力。因此,加速计不但可以指示握持电话的方式(如自动旋转功能),而且如果电话放在桌子上的话,还可以指示电话的正面朝下还是朝上。
加速计可以测量g引力,因此加速计返回值为1.0时,表示在特定方向上感知到1g。如果是静止握持iPhone而没有任何运动,那么地球引力对其施加的力大约为1g。如果是纵向竖直地握持iPhone,那么iPhone会检测并报告其y轴上施加的力大约为1g。如果是以一定角度握持iPhone,那么1g的力会分布到不同的轴上,这取决于握持iPhone的方式。在以45度角握持时,1g的力会均匀地分解到两个轴上。
如果检测到的加速计值远大于1g,那么即可以判断这是突然运动。正常使用时,加速计在任一轴上都不会检测到远大于1g的值。如果摇动、坠落或投掷iPhone,那么加速计便会在一个或多个轴上检测到很大的力。
iPhone加速计使用的三轴结构是:iPhone长边的左右是X轴(右为正),短边的上下是Y轴(上为正),垂直于iPhone的是Z轴(正面为正)。需要注意的是,加速计对y坐标轴使用了更标准的惯例,即y轴伸长表示向上的力,这与Quartz2D的坐标系相反。如果加速计使用Quartz 2D做为控制机制,那么必须要转换y坐标轴。使用OpenGL ES时则不需要转换。
UIAccelerometer类是单独存在的。要获取对此类的引用,请调用sharedAccelerometer方法:
UIAccelerometer *accelerometer=[UIAccelerometersharedAccelerometer];
从加速计获取信息与从CoreLocation获取信息相似。创建一个符合UIAccelerometerDelegate协议的类,执行可以获取加速计信息的方法。
在分配委托时,需要以秒指定更新间隔。iPhone的加速计支持最高以每秒100次的频率进行轮询,但无法保证真正达到这么多次更新,或者可以精确均匀分隔这些更新。要分配委托或指定轮询间隔为每秒60次,可以如下所示:
accelerometer.delegate=self;
accelerometer.updateInterval=1.0f/60.0f;
完成之后,剩余的事情是实现加速计用于更新委托的方法,accelerometer:didAccelerate:。第二个变量包含了来自加速计的真实数据,嵌入在类UIAcceleration的一个对象中。
如前所述,iPhone加速计可以检测3个轴上的加速度,并且对使用UIAcceleration类实例的委托提供此信息。每个UIAcceleration实例都有x、y和z的属性,分别有一个带符号的浮点值。值0表示加速计在此轴上没有检测到任何运动。正值或负值表示一个方向上的力。例如,y的负值表示感受到了向下的力,这可能表示电话是纵向竖直握持的。y的正值表示在向上的方向施加了某些力,这可能意味着电话是倒置的或者电话正在向下运动。(这里有点疑问?说反了吧?)
请在头脑中牢记图15-1的示意图,并查看加速计结果。注意,在现实生活中,几乎不可能获得如此精确的值,因为加速计非常敏感,可以感知非常微笑的运动,而我们通常只能感知立体空间3个轴上的某一个微小受力。这是现实世界中的物理,而不是高中物理实验室。
- (void)accelerometer:(UIAccelerometer *)accelerometerdidAccelerate:(UIAcceleration *)acceleration {
NSString *newText=[[NSString alloc] initWithFormat:@"Max: x:%g\ty:%g\tz:
%g",acceleration.x,acceleration.y,acceleration.z];
label.text=newText;
[newText release];
}
此方法可以在每次调用时更改界面上的标签,调用此方法的频率取决于以前指定的updateInterval的值。
1,检测摇动
加速计通常用于检测摇动。与手势相似,摇动可以作为应用程序输入的一种形式。例如,对于绘图程序GLPaint,iPhone的示例代码之一,用户可以通过摇动iPhone擦除绘图,就像Etch-a-Sketch一样。摇动检测功能相对来说是微不足道的,主需要检查某个轴上的绝对值是否大于阈值(yu)。在正常使用期间,3个轴之一所注册的值通常在1.3g左右,若要远高于此值,则需要刻意施加力量。加速计好像不能注册高于2.3g左右的值。因此,请勿将阈值设置得高于此值。
要检测摇动,请检查绝对值是否大于1.5(表示轻微摇动)和2.0(表示剧烈摇动),代码如下:
- (void)accelerometer:(UIAccelerometer *)accelerometerdidAccelerate:(UIAcceleration *)acceleration {
if (fbasf(acceleration.x)>2.0 ||fbasf(acceleration.y)>2.0 ||fbasf(acceleration.z)>2.0 ) {
//do something here...
}
}
上述方法可以检测到任一轴上任何超过2g力的运动。通过要求用户前后摇动一定次数才能注册为一次摇动,我们可以执行更复杂的摇动检测,代码如下:
- (void)accelerometer:(UIAccelerometer *)accelerometerdidAccelerate:(UIAcceleration *)acceleration {
static NSInteger shakeCount=0;
static NSDate *shakeStart;
NSDate *now=[[NSDate alloc] init];
NSDate *checkDate=[[NSDate alloc] initWithTimeInterval:1.5fsinceDate:shakeStart];
if ([now compare:checkDate]==NSOrderedDescending || shakeStart==nil) {
shakeCount=0;
[shakeStart release];
shakeStart=[[NSDate alloc] init];
}
[now release];
[checkDate release];
if (fbasf(acceleration.x)>2.0 ||fbasf(acceleration.y)>2.0 ||fbasf(acceleration.z)>2.0 ) {
shakeCount++;
if (shakeCount>4) {
//do something
shakeCount=0;
[shakeStart release];
shakeStart=[[NSDate alloc] init];
}
}
}
此方法可以查明加速计报告的值大于2的次数,如果在1.5s的时间内发送了4次,则注册为一次摇动。