Objective-C 加速计的详细使用(一)

我们先简单了解一下,加速计可以用来干嘛。我们下次有时间再继续讲解陀螺仪的使用,以下,我们只能使用真机测试,系统提供的模拟器无法支持这些操作

补充: 简单来说,测试的时候,手机的三维坐标,那个轴的正方向朝下,重力加速度方向就在朝下的那个合力上,这个可能理解就简单了


  1. 确定设备的朝向
  2. 确定设备是否在移动
  3. 检测设备是否倾斜

既然是加速计,那就自然和重力无法脱离关系,iOS系统中提供了这么一套机制,CoreMotion.framework 框架,我们可以以通过加速计来检测摇动手势,目前我知道一些支持摇动频率的SDK基本上都是使用了加速计来做的,我们接下来开始一步步学习如何在应用中获取设备朝向、加速、旋转的使用,在当前下的设备,基本上都可以以使用加速计检测到运动。


加速计基础

了解:
加速计的度量单位是g ,这个是重力(gravity)的简称。1g 是物体在地球的海平面上受到的下拉力(9.8m/s²)。那么1g 的力到底是多大呢,可以举个简单的例子,我们坐电梯急速下落时(当然很少见)、还有做过山车时您有没有什么感觉呢,为什么在最高处下落您会尖叫呢,这里我们开个玩笑,我们在过山车的移动过程中,在最低处我们的的下拉力是超过1g 的,在最高处,我们是低于1g 所以我们最高处总感觉要飞出来,这就是负重力在起作用。

  • 加速计 是以相对于自由落体的方式度量加速度。如果我们将iOS设备从100层大楼自由落体下去,下落过程中,其加速度理想情况应该是0g ,另一方面,放在桌面上的设备,其加速度应该是1g ,且方向朝上
    ,原理想必都明白吧。
  • 假如设备静止是受到的地球牵引力为1g ,这是加速度用于确定设备朝向的基础,加速计可以同时测量3个轴的值(x、y、z),通过感知特定方向的惯性总量,加速计可以测量出加速度和重力,iPhone的加速计是一个三轴加速计 这意味着我们使用iOS可以检测到三维空间中德运动或者重力引力。因此,加速计不但可以检测握持电话的方式(自动旋转功能),而且如果电话放在桌子上的话,还可以指示电话的正面朝下还是朝上,加速计可以测量g引力.
  1. 如果加速计返回值为1.0时,表示在特定方向上感知到1g
  2. 如果是静止握持iPhone手机没有任何运动,那么地球引力对其施加的力大约为1g
  3. 如果是纵向垂直握持iPhone,那么iPhone会检测并报告其Y轴上施加的力大约为1g
  4. 如果是以一定角度握持iPhone手机,那么1g 的力会均匀的分布到不同的轴上,这个取决于iPhone的握持方式
  5. 如果以45°角握持时,1g 的力会均匀的分解到两个轴上

下面我们看下坐标系,和iOS内部坐标系一致

重力坐标系.001.jpg

整体来说还算清晰的对吧,我们就是根据这么一套逻辑来处理加速计的不同方向的分量的。


注意点: 如果我们检测到的加速计大于1g ,那么可以判断这是突然运动,正常使用时,加速计在任何一轴的都不会检测到大于1g 的值,如果摇动、坠落、投掷iPhone,那么加速计便会在一个或者多个轴上检测到很大的力,iPhone的加速计使用的是三轴结构:垂直于屏幕正面的是z轴,从屏幕上方到home键称为y轴,x轴,根据图片,我们也猜测到是宽度向右为正,加速计对y轴使用了更标准的惯例,既 y轴伸长表示向上的力,与Quart2D的坐标系相反,如果使用Quart2D作为控制机制,那么柏旭要转换y轴坐标 使用OpenGL ES则不需要转换。


下面我们开始进入正轨,iOS中德加速计类 UIAccelerometer 是一个单利模式类, 可以通过方法 sharedAccelerometer 获取其唯一的实例。
加速计需要设置如下两点:

  1. 设置其代理,用以获取加速计信息的方法
  2. 设置加速计获取信息的频率。最高支持每秒100次。

接下来我们新建工程,真机测试一下:

NS_CLASS_DEPRECATED_IOS(2_0, 5_0, "UIAccelerometer has been replaced by the CoreMotion framework") __TVOS_PROHIBITED 主意这个类的使用截止系统支持到iOS5 系统,系统已经明确告诉我们,后续使用CoreMotion

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    /**
     *  获取到加速计的单利对象
     */
    UIAccelerometer * accelertometer = [UIAccelerometer sharedAccelerometer];
    /**
     *  设置加速计的代理
     */
    accelertometer.delegate = self;
    /**
     *  updateInterval  刷新频率,一秒更新30次
     */
    accelertometer.updateInterval = 1.0/1.0;
    
    
    UIButton * button =({
        UIButton * btn = [UIButton buttonWithType:UIButtonTypeCustom];
        [btn setTitle:@"我是加速计" forState:UIControlStateNormal];
        btn.backgroundColor = [UIColor blueColor];
        [self.view addSubview:btn];
        btn.frame = CGRectMake(10, 20, 100, 50);
        
        
        
        btn;
    });
    self.btn = button;
    
}

我们只要遵循其代理方法就可以使用真机进行检测了,这个我们今天就说这么多,下次我们再继续

#pragma mark --UIAccelerometerDelegate
static NSInteger shakeCount = 0;
static NSDate * shakeStart;
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration{
    
    NSString * strinfo = [NSString stringWithFormat:@"x:%g \t y:%g \t z :%g",acceleration.x,acceleration.y,acceleration.z];
    NSLog(@"str - %@",strinfo);
    //检测摇动 1.5 为轻摇 。2.0 为重摇
    if (fabs(acceleration.x)>1.8 || abs(acceleration.y>1.8)||abs(acceleration.z>1.8)) {
        NSLog(@"你摇动我了");
    }
    self.btn.frame = CGRectMake(fabsf(acceleration.x) *100, fabsf(acceleration.y) *100, 100, 40);
    
   
    NSDate * now = [[NSDate alloc]init];
    NSDate * checkDate = [[NSDate alloc]initWithTimeInterval:1.5f sinceDate:shakeStart];
    if ([now compare:checkDate] ==NSOrderedDescending || shakeStart ==nil) {
       
        shakeStart = [NSDate date];
        
    }
    if (fabs(acceleration.x)>1.7 || abs(acceleration.y>1.7)||abs(acceleration.z>1.7)) {
        shakeCount++;
        if (shakeCount>2) {
             NSLog(@"你已经把我摇动了");
            shakeCount = 0;
            shakeStart = [NSDate date];
            
        }
        
       
    }
}

通过以上的方法我们可以稍微真机测试一下加速计的摇动频率了,设置我们的摇一摇的频率大小,如有问题,请咨询 QQ群:392633290 备注简书
只是简单的介绍,会用就行,这个方法也过时了,苹果已经推荐了新的API,我们下次一起研究一下新的API, CoreMotion 框架 ,到底还有多少东西,我们慢慢来学习。

总结:我的iOS开发生涯也不算太久,但是对于技术的钻研,比较喜欢算法,我对OC的整体感觉,只要你懂英文,其实看一下都不是很难,当你把一件事情熟练到自己无法想象的地步,你还能学不会么,古人不是有一句话么,书读百遍,其义自现,这句话我觉得很实在。有不足之处还望大牛看到指点一二,毕竟在某些方面喜欢了解,就会有不周到的地方,可以这么说,是程序就会有BUG,应该可以这么说吧,很多事情都是未知。对未知的事情探索永无止境。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容