iOS开发-CoreMotion框架(加速计和陀螺仪)
来源:互联网 发布:淘宝立即购买是灰色的 编辑:程序博客网 时间:2024/05/17 16:56
CoreMotion是一个专门处理Motion的框架,其中包含了两个部分加速度计和陀螺仪,在iOS4之前加速度计是由UIAccelerometer类来负责采集数据,现在一般都是用CoreMotion来处理加速度过程,不过由于UIAccelerometer比较简单,同样有人在使用。加速计由三个坐标轴决定,用户最常见的操作设备的动作移动,晃动手机(摇一摇),倾斜手机都可以被设备检测到,加速计可以检测到线性的变化,陀螺仪可以更好的检测到偏转的动作,可以根据用户的动作做出相应的动作,iOS模拟器无法模拟以上动作,真机调试需要开发者账号。
加速计
加速计的x,y,z三个方向,参考下图:
如果只需要知道设备的方向,不需要知道具体方向矢量角度,那么可以使用UIDevice进行操作,还可以根据方向就行判断,具体可以参考一下苹果官网代码:
-(
void
) viewDidLoad {
// Request to turn on accelerometer and begin receiving accelerometer events
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[
NSNotificationCenter
defaultCenter] addObserver:
self
selector:
@selector
(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:
nil
];
}
- (
void
)orientationChanged:(
NSNotification
*)notification {
// Respond to changes in device orientation
}
-(
void
) viewDidDisappear {
// Request to stop receiving accelerometer events and turn off accelerometer
[[
NSNotificationCenter
defaultCenter] removeObserver:
self
];
[[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];
}
当用户晃动设备的时候,系统会通知每一个在用的设备,可以使本身成为第一响应者:
- (
BOOL
)canBecomeFirstResponder {
return
YES
;
}
- (
void
)viewDidAppear:(
BOOL
)animated {
[
self
becomeFirstResponder];
}
处理Motion事件有三种方式,开始(motionBegan),结束(motionEnded),取消(motionCancelled):
- (
void
)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event
NS_AVAILABLE_IOS
(3_0);
- (
void
)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
NS_AVAILABLE_IOS
(3_0);
- (
void
)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event
NS_AVAILABLE_IOS
(3_0);
motionEnded方法中处理:
- (
void
)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event {
if
(motion == UIEventSubtypeMotionShake)
{
// FlyElephant http://www.cnblogs.com/xiaofeixiang
[[
NSNotificationCenter
defaultCenter] postNotificationName:@
"FlyElephant"
object:
self
];
}
}
CoreMotion在处理加速计数据和陀螺仪数据的时是一个非常重要的框架,框架本身集成了很多算法获取原生的数据,而且能很好的展现出来,CoreMotion与UIKit不同,连接的是UIEvent而不是事件响应链。CoreMotion相对于接收数据只是更简单的分发motion事件。
CMMotionManager类能够使用到设备的所有移动数据(motion data),Core Motion框架提供了两种对motion数据的操作方式:
pull方式:能够以CoreMotionManager的只读方式获取当前任何传感器状态或是组合数据;
push方式:是以块或者闭包的形式收集到想要得到的数据并且在特定周期内得到实时的更新;
pull处理方式:
//判断加速计是否可用
if
([_motionManager isAccelerometerAvailable]) {
// 设置加速计采样频率
[_motionManager setAccelerometerUpdateInterval:1 / 40.0];
[_motionManager startAccelerometerUpdates];
}
else
{
NSLog
(@
"博客园-FlyElephant"
);
}
触摸结束:
-(
void
)touchesEnded:(
NSSet
*)touches withEvent:(UIEvent *)event{
CMAcceleration acceleration=_motionManager.accelerometerData.acceleration;
NSLog
(@
"%f---%f---%f"
,acceleration.x,acceleration.y,acceleration.z);
}
push处理方式:
@property
(strong,
nonatomic
) CMMotionManager *motionManager;
@property
(strong,
nonatomic
)
NSOperationQueue
*quene;
_motionManager=[[CMMotionManager alloc]init];
//判断加速计是否可用
if
([_motionManager isAccelerometerAvailable]) {
// 设置加速计频率
[_motionManager setAccelerometerUpdateInterval:1 / 40.0];
//开始采样数据
[_motionManager startAccelerometerUpdatesToQueue:_quene withHandler:^(CMAccelerometerData *accelerometerData,
NSError
*error) {
NSLog
(@
"%f---%f"
,accelerometerData.acceleration.x,accelerometerData.acceleration.y);
}];
}
else
{
NSLog
(@
"博客园-FlyElephant"
);
}
时间设置频率:
陀螺仪
陀螺仪其实主要方法和方式和加速计没有区别,先看张陀螺仪旋转的角度图片:
陀螺仪更新数据也有两种方式,pull方式(startGyroUpdates),push方式(startGyroUpdatesToQueue):
static
const
NSTimeInterval
gyroMin = 0.01;
- (
void
)startUpdatesWithSliderValue:(
int
)sliderValue {
// Determine the update interval
NSTimeInterval
delta = 0.005;
NSTimeInterval
updateInterval = gyroMin + delta * sliderValue;
// Create a CMMotionManager
CMMotionManager *mManager = [(APLAppDelegate *)[[UIApplication sharedApplication] delegate] sharedManager];
APLGyroGraphViewController * __weak weakSelf =
self
;
// Check whether the gyroscope is available
if
([mManager isGyroAvailable] ==
YES
) {
// Assign the update interval to the motion manager
[mManager setGyroUpdateInterval:updateInterval];
[mManager startGyroUpdatesToQueue:[
NSOperationQueue
mainQueue] withHandler:^(CMGyroData *gyroData,
NSError
*error) {
[weakSelf.graphView addX:gyroData.rotationRate.x y:gyroData.rotationRate.y z:gyroData.rotationRate.z];
[weakSelf setLabelValueX:gyroData.rotationRate.x y:gyroData.rotationRate.y z:gyroData.rotationRate.z];
}];
}
self
.updateIntervalLabel.text = [
NSString
stringWithFormat:@
"%f"
, updateInterval];
}
- (
void
)stopUpdates{
CMMotionManager *mManager = [(APLAppDelegate *)[[UIApplication sharedApplication] delegate] sharedManager];
if
([mManager isGyroActive] ==
YES
) {
[mManager stopGyroUpdates];
}
}
作者:FlyElephant
出处:http://www.cnblogs.com/xiaofeixiang
- iOS开发-CoreMotion框架(加速计和陀螺仪)
- iOS开发-CoreMotion框架(加速计和陀螺仪)
- iOS开发-CoreMotion框架(加速计和陀螺仪)
- iOS开发-CoreMotion框架(加速计和陀螺仪)
- 加速计和陀螺仪(CoreMotion框架)
- iOS加速计和陀螺仪
- IOS -- 加速计、陀螺仪
- iOS 陀螺仪 加速计
- ios中的陀螺仪和加速计
- iOS学习-加速计和陀螺仪
- iOS学习-加速计和陀螺仪
- iOS学习新知识-加速计和陀螺仪
- iOS学习笔记 加速计和陀螺仪
- iOS 加速计和陀螺仪 简介
- iOS内置加速计(UIAccelerometer/CoreMotion)
- iOS内置加速计(UIAccelerometer/CoreMotion)
- iOS学习笔记34-加速计和陀螺仪
- CoreMotion iOS陀螺仪使用
- js 计算中英文字符串长度
- Android 4.4从图库选择图片并裁剪,由于系统版本不同导致Uri的bug的简单解决方式
- iOS AES128 CBC No Padding加密解密
- 页面重定向
- zabbix客户端安装dat
- iOS开发-CoreMotion框架(加速计和陀螺仪)
- C语言开发总结(二十)
- SendMessageTimeOut函数你使用过吗?
- 关于linux内核模块Makefile的解析
- Httpclient 和jsoup结和提取网页内容(某客学院视频链接)
- 软件看板之父David Anderson:使用看板方法进行项目管理
- 欢迎使用CSDN-markdown编辑器
- Android 开源项目分类汇总
- hoj1848 Sg函数博弈