iOS - 加速计(重力感应)
先上效果图
小球根据重力感应 然后降落 并且有弹起效果
一、原理
重力感应的三维空间 xyz的坐标系如图 (注意:和frame的坐标的y不同)
- x
向左: 负数 向右:正数 - y
向上: 正数 向下:负数 - z
屏幕朝上:负数 屏幕朝下:正数
二、代码
注:以下代码只适用于iOS4.0之后
移动的方法都封装在了CoreMotion.framework 这个库中
在工程里加入库 并且在所需控制器中添加头文件CoreMotion/CoreMotion.h
1.引用库
CoreMotion/CoreMotion.h
2.创建运动管理者
@property (nonatomic,strong) CMMotionManager * mgr;
self.mgr = [[CMMotionManager alloc]init];
3.判断加速计是否可以用
if (!self.mgr.isAccelerometerAvailable) {
//表示不可以使用
NSLog(@”加速计不可用”);
return;
}
4.设置采样间隔 (push采样需要 pull采样不需要)
self.mgr.accelerometerUpdateInterval = 1.0/30.0; //一秒钟采样30次
注:push方式是系统主动推过来的 所以需要设置采样时间间隔,对于数据要求较高的app试用,此处的重力感应需要
pull方式是在有需要的时候,自己主动去拿数据,所以不需要设置时间间隔
5.开始采样
push方式
[self.mgr startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) {
}];
pull方式
[self.mgr startAccelerometerUpdates];
最后提上全部代码
//
// ViewController.m
// 160412重力加速
//
// Created by Momo on 16/4/12.
// Copyright © 2016年 Momo. All rights reserved.
//#import "ViewController.h"
#import <CoreMotion/CoreMotion.h>
@interface ViewController ()<UIAccelerometerDelegate>/** 小球*/
@property (weak, nonatomic) IBOutlet UIImageView *ball;/** 运动管理者*/
@property (nonatomic,strong) CMMotionManager * mgr;/** 小球运动速度*/
@property (nonatomic,assign) CGPoint velocity;
@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];// 1.创建运动管理对象self.mgr = [[CMMotionManager alloc]init];// 2.判断加速器是否可以使用(最好判断一下)if (!self.mgr.isAccelerometerAvailable) {//表示不可以使用NSLog(@"加速计不可用");return;}//push方式[self push];//pull方式//[self pull];}-(void)push{// 3.设置采样间隔 (push采样需要 pull采样不需要)self.mgr.accelerometerUpdateInterval = 1.0/30.0; //一秒钟采样30次// 4.1 开始采样 (push 时时采样)[self.mgr startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) {if (error) {return ;}// 5.获取加速计信息CMAcceleration acceleration = accelerometerData.acceleration;NSLog(@"x:%f y:%f z:%f",acceleration.x,acceleration.y,acceleration.z);// 处理小球// v = a * t = a1 + a2 + a3 + ... + at// 1.累加加速度 = 速度_velocity.x += acceleration.x;_velocity.y -= acceleration.y; //y的加速度是相反的 所以就是减// 2.累加速度 = 位移// s = v * t = v1 + v2 + v3 + ... + vtCGRect rect = self.ball.frame;rect.origin.x += _velocity.x;rect.origin.y += _velocity.y;self.ball.frame = rect;// 3.边界处理if (self.ball.frame.origin.x <= 0) {// x超出左边界rect.origin.x = 0;self.ball.frame = rect;//速度取反 削弱速度_velocity.x *= -0.5;}if (CGRectGetMaxX(self.ball.frame) >= self.view.frame.size.width) {// x超出右边界rect.origin.x = self.view.frame.size.width - self.ball.frame.size.width;self.ball.frame = rect;//速度取反 削弱速度_velocity.x *= -0.5;}if (self.ball.frame.origin.y <= 0) {// y超出上边界rect.origin.y = 0;self.ball.frame = rect;//速度取反 削弱速度_velocity.y *= -0.5;}if (CGRectGetMaxY(self.ball.frame) >= self.view.frame.size.height) {// y超出下边界rect.origin.y = self.view.frame.size.height - self.ball.frame.size.height;self.ball.frame = rect;//速度取反 削弱速度_velocity.y *= -0.5;}}];}-(void)pull{// 4.2 开始采样 (pull 有需要时采样)[self.mgr startAccelerometerUpdates];}// 4.2 开始采样 (pull 有需要时采样)//在需要时获取数据 此处为点击屏幕时需要采样
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{//获取加速计信息CMAcceleration acc = self.mgr.accelerometerData.acceleration;NSLog(@"%f,%f, %f", acc.x,acc.y,acc.z);
}@end
iOS - 加速计(重力感应)相关推荐
- iOS设备使用重力感应
首先在你需要检测重力感应的UIView或者UIViewController添加委托<UIAccelerometerDelegate> 然后自己定义一个 UIAccelerometer *a ...
- Windows Phone 7(accelerometer)重力感应编程
使用重力感应器accelerometer,需要引用类库Microsoft.Devices.Sensors ,所以需要在WMAppManifest.xml 加上 <Capability Name ...
- iOS 6.1锁屏音乐控制界面升级 玩转重力感应
苹果iOS升级中最有乐趣的部分之一就是发现设计者做出的微妙的小变动.在昨天刚刚升级的iOS 6.1里,有一个变化初看上去仅仅是表面上的美化,但是经过一段时间之后,你会不禁感叹为什么它没有早些推出.我们 ...
- iOS 重力感应 学习1 陀螺仪 水平仪 指南针
小球可以随着重力感应 四处乱撞. 放大了坐标位移 就可以看见小球动了. 然后规定小球的路径 当滑到中间时候 弹出一张图片 作为提示. 我做了一个小demo 效果不错哦 CMMotionManager ...
- ios加速计(可以用来检测摇动,自定义反应灵敏度)
ios加速计 标签: ios 编程 xcode开发 加速计 杂谈 分类: ios开发 内置加速计是iPhone和iPod Touch中最酷的特性之一,iPhone可以通过这个小设备知道用户握持手机 ...
- Unity3D 游戏引擎之平面小球重力感应详解【转】
http://blog.csdn.net/xys289187120/article/details/6969333 手机重力感应应该对大多数开发者并不陌生,在新一代智能手机Android ...
- 重力感应游戏可行性办法研究_完结
重力感应游戏可行性办法研究 一.手机中的重力感应组件 很多人都知道手机有重力感应这个功能,但是重力感应具体是什么,却并不是很了解.重力感应组件不是摄像头,人们知道有多少万像素,不是触摸屏,人们了解是电 ...
- html5 360全景 陀螺仪,HTML网页设置(开启重力感应/陀螺仪)
相比较"HTML网页设置",显然"开启重力感应"更有吸引力和侧重点. 这部分在基础的学习中没什么好说的,只有一个开启重力感应可以说. 窗口大小,是针对于输出Fl ...
- mui教程2——窗口管理、调用相册、调用摄像头、调用重力感应、微信朋友圈界面(仿制)分析
一.窗口管理 1,页面初始化 在app开发中,若要使用HTML5+扩展api,必须等plusready事件发生后才能正常使用,mui将该事件封装成了mui.plusReady()方法,涉及到HTML5 ...
最新文章
- pandas读取csv文件,变换文件格式,并转换成numpy数组,取出数据
- Java Review - 并发编程_DelayQueue原理源码剖析
- python后端开发工程师面试题
- druid.io mysql 配置_druid.io 使用mysql存储metadata overlord启动出错
- CodeForces - 432D Prefixes and Suffixes(KMP的next数组性质)
- 403禁止访问:访问被拒绝如何解决_死链接对网站有哪些危害?如何处理死链接?...
- Free tour II SPOJ - FTOUR2 点分治 + 树状数组
- C#中的复制在unity中使用
- Beta冲刺 第一天
- WCF服务编程 学习笔记(1)
- Java线程池—ThreadPoolExecutor
- uni-app项目的启动
- 计算机浏览记录删除,如何完全删除本地计算机上的浏览历史记录?如何从计算机中完全删除Internet访问...
- oracle回收DBA权限以及授权表空间
- 5年内在豫投资超30亿元 重点助力河南智慧城市运营
- 无限战争选择服务器,无限战争新手攻略 新手入门必看技巧
- Android内存管理(9)*MAT:Heap Dump,Shallow Heap,Retained Heap,Dominating Tree,GC Roots等的含义...
- 织梦免费网站模板手机端无法更新的原因及解决
- 电解电容和钽电容的区别是什么
- 面向对象三大特性(继承)