上一篇博文介绍的是摇一摇的检测方法,也提过了可以使用加速度传感器来实现,加速度传感器可以捕捉更加高级的加速度动作。而且使用方法也比较简单,有木有!
加速度传感器,就是俗称的重力感应,其实不仅仅可以检测到对重力的感应,它可以捕捉到三个维度的加速度信息。
把iOS设备正面朝上放到桌面上,加速度传感器的默认原点在手机的物理重心位置,x,y,z轴分别穿过这个原点,x轴向右为正方向,y轴朝手机顶部为正方向,z轴朝上为正方向,可以通过代理方法来获取相应方向的加速度具体数值。
加速度传感器使用步骤如下:
①召唤UIAccelerometer这个单例;
②设置UIAccelerometer的updateInterval属性,就是设置通知间隔;
③向UIAccelerometer的delegate属性中设置负责具体处理的委托类;
④实现委托方法accelerometer:didAccelerate:以接受加速度的通知;
⑤从accelerometer:didAccelerate:方法的第二个参数UIAcceleration实例的相关属性中获取加速度。
accelerometer:didAccelerate:方法的第二个参数UIAcceleration实例中,分别拥有代表x轴、y轴、z轴方向加速度的属性。
下面是一个使用加速度传感器demo。
程序运行之后,在屏幕中央显示一个绿色小方块,倾斜手机时,方块将向着倾斜的方向运动,碰撞到屏幕顶部后将反弹回来。
//屌丝牌
ViewController
@interface
DSViewController :
UIViewController
<UIAccelerometerDelegate
>
{
//我们用一个label来表示随加速度方向运动的小方块
UILabel
*_label;
//x轴方向的速度
UIAccelerationValue
_speedX;
//y轴方向的速度
UIAccelerationValue
_speedY;
}
@end
@implementation
DSViewController
- (
void
)viewDidLoad
{
[
super
viewDidLoad
];
self
.
view
.
backgroundColor
= [
UIColor
yellowColor
];
CGRect
winRect = [
UIScreen
mainScreen
].
applicationFrame
;
//实例化 随加速度方向运动的小方块(label)
_label
= [[
UILabel
alloc
]
initWithFrame
:
CGRectMake
(
0
,
0
,
80
,
80
)];
_label
.
center
=
CGPointMake
(winRect.
size
.
width
*
0.5
, winRect.
size
.
height
*
0.5
);
_label
.
text
=
@"Droid"
;
_label
.
textAlignment
=
UITextAlignmentCenter
;
_label
.
backgroundColor
= [
UIColor
greenColor
];
[
self
.
view addSubview
:
_label
];
[
_label release
];
}
-(
void
)viewWillAppear:(
BOOL
)animated
{
[
super
viewWillAppear
:animated];
//召唤加速度传感器
UIAccelerometer
*accelerometer = [
UIAccelerometer
sharedAccelerometer
];
//设置加速度传感器的 接收加速度通知的时间间隔
//设置为1.0/60.0表示一秒接收60次,可根据实际需求调整
accelerometer.
updateInterval
=
1.0
/
60.0
;
//下面这个不设置,代理方法就不会调用
accelerometer.
delegate
=
self
;
}
-(
void
)viewWillDisappear:(
BOOL
)animated
{
[
super
viewWillDisappear
:animated];
//不要忘了停止传感器的工作
//结束加速度传感器的工作
_speedX
=
_speedY
=
0
;
UIAccelerometer
*accelerometer = [
UIAccelerometer
sharedAccelerometer
];
accelerometer.
delegate
=
nil
;
}
-(
void
)accelerometer:(
UIAccelerometer
*)accelerometer didAccelerate:(
UIAcceleration
*)acceleration
{
//获得的加速度要考虑到加速度传感器的原点是物理重心,而不是屏幕右上角
//x轴方向的速度加上x轴方向获得的加速度
_speedX
+= acceleration.
x
;
//y轴方向的速度加上y轴方向获得的加速度
_speedY
+= acceleration.
y
;
//小方块将要移动到的x轴坐标
CGFloat
posX =
_label
.
center
.
x
+
_speedX
;
//小方块将要移动到的y轴坐标
CGFloat
posY =
_label
.
center
.
y
-
_speedY
;
//碰到屏幕边缘反弹
if
(posX <
0.0
) {
posX =
0.0
;
//碰到屏幕左边以0.4倍的速度反弹
_speedX
*= -
0.4
;
}
else
if
(posX >
self
.
view
.
bounds
.
size
.
width
){
posX =
self
.
view
.
bounds
.
size
.
width
;
//碰到屏幕右边以0.4倍的速度反弹
_speedX
*= -
0.4
;
}
if
(posY <
0.0
) {
posY =
0.0
;
//碰到屏幕上边不反弹
_speedY
=
0.0
;
}
else
if
(posY >
self
.
view
.
bounds
.
size
.
height
){
posY =
self
.
view
.
bounds
.
size
.
height
;
//碰到屏幕下边以1.5倍的速度反弹
_speedY
*= -
1.5
;
}
//移动小方块
_label
.
center
=
CGPointMake
(posX, posY);
}
@end