当我们使用安卓设备 “上下或左右倾斜” 的时候,设备屏幕的 “焦点位置” 会有不同的变化。首先举个例子描述这种情况:

  玩过"越野摩托车游戏"的朋友应该都会知道,当手机向左或向右倾斜,摩托车也会向左或向右偏移一定的角度;当手机向上倾斜时,摩托车前轮胎抬起一定的角度,手机向下倾斜时,摩托车后轮胎也会抬起一定的角度。游戏的方向设定原理就是通过"陀螺仪感应器"提供的数据计算得出的结果。

陀螺仪常用模式分为下列几种:

 a)TYPE_ACCELEROMETER     b)TYPE_MAGNETIC_FIELD    c)TYPE_ORIENTATION           d)TYPE_GYROSCOPE

下面以 “TYPE_ACCELEROMETER” 作为示例,计算设备屏幕的当前 “焦点位置”:

  1. 引用指定包文件
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
  1. 增加类对象
private SensorManager LmSensorManager;
private Sensor LmSensor;//屏幕当前位置int Lwidth;int Lheight;float LPointX;float LPointY;
  1. 初始化对象/注册服务(可以写在onCreate函数内)
LmSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
LmSensor = LmSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
LmSensorManager.registerListener(this, LmSensor,SensorManager.SENSOR_DELAY_NORMAL);WindowManager Lwm = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics Ldm = new DisplayMetrics();Lwm.getDefaultDisplay().getMetrics(Ldm);
Lwidth = Ldm.widthPixels;         // 设备屏幕宽度
Lheight = Ldm.heightPixels;       // 设备屏幕高度
LPointX = Lwidth / 2;            //默认设置当前 "焦点位置"在屏幕的中心位置
LPointY = Lheight / 2;
  1. 感应器消息执行函数
@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {}  @Overridepublic void onSensorChanged(SensorEvent event) {if (event.sensor == null) {return;}LPointX = LPointY = 0;if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {float x =  event.values[0];float y =  event.values[1];float z =  event.values[2];/*** 当设备在正前方90度时 ,X :10 Y:0 Z:0* 当设备在正前方90度时,左右抬起数据变化幅度很小* 当设备在正前下方0度时, 0 ,0 ,10* 当设备在正下方0度时,然后向左抬起90度,0,10,0  Z从10减到0* 当设备在正下方0度时,然后向右抬起90度,0,-10,0 Z从10减到0* 当设备在正前上方180度时,0,0,-10* 当设备在正前上方180度时,然后向左抬起90度,0,-10,0  Z从负数增加到0* 当设备在正前上方180度时,然后向右抬起90度,0,10,0 Z从负数增加到0*///通过1和3参数得到Y轴位置if (x >= 0.1 && (z >= 0.1 || z <= -0.1)){LPointY = Lheight / 2 + Lheight / 20 * z;}//通过2参数得到X轴坐标if ((y >= 0.1 || y <= -0.1) && z >= 0.1){LPointX = Lwidth / 2 + Lwidth / 20 * -y;}else  if ((y >= 0.1 || y <= -0.1) && z <= -0.1){LPointX = Lwidth / 2 + Lwidth / 20 * -y;}if (0 == LPointX) //这里做了保护措施,如果超过了设定范围自动回到X轴中心位置LPointX = Lwidth / 2;if (0 == LPointY)//如果超过了设定范围自动回到Y轴中心位置LPointY = Lheight / 2;SetScreenPoint(LPointX,LPointY);}}
  1. 自增函数(得到计算后的屏幕坐标)
/**
* 设置当前 "焦点位置"
*/
void SetScreenPoint(float x,float y)
{//这个函数用来记录计算后的屏幕坐标,可以用到不同的场景
}

安卓系统大部分应用场景采用这种坐标计算方式,经过优化(比如移动圆滑处理)应该可以作为实际功能使用。

本篇文章为原创文章,转载或引用请标明出处。

安卓系统通过陀螺仪计算当前坐标(焦点位置)相关推荐

  1. SLAM无人车计算地图坐标,ros中计算地图坐标,rosweb计算画布对应的坐标(含代码,含公式,超详细),开发跨系统地图导航必备算法【可实现qt,android,c#,mfc,html等地图开发】

    ros中计算地图坐标,rosweb计算画布对应的坐标 视频讲解: SLAM无人车计算地图坐标,图片像素坐标公式推导 1.订阅话题 /map nav_msgs::OccupancyGrid 这个消息中可 ...

  2. Leetcode——安卓系统手势解锁(九宫格)

    1. 安卓系统手势解锁 (1)回溯(模版方法) // 至少 需要经过 m 个点,但是 不超过 n 个点的.class Solution {int count = 0;public int number ...

  3. 华为android系统最新版,谷歌再放大招截胡鸿蒙系统!发布最新版安卓系统:国产手机抢先升级...

    原标题:谷歌再放大招截胡鸿蒙系统!发布最新版安卓系统:国产手机抢先升级 [5月21日讯]相信大家都知道,随着华为鸿蒙OS 2.0正式版系统推出旗舰确认,也让华为鸿蒙OS系统在近期越来越火热,受到的关注 ...

  4. 安卓系统分屏相关修改思路

    安卓系统应用在一些特殊设备时,屏幕显示也会有一些特殊要求:   分屏(一面屏幕内显示两个相同的画面),画面分割等,这里讲述一些基本修改思路和简单实例. OpenGLES相关修改 首先说下比较简单的修改 ...

  5. vivo手机系统android9,可能是最安全的安卓系统了,vivo Funtouch OS 9带来不一样

    原标题:可能是最安全的安卓系统了,vivo Funtouch OS 9带来不一样 或许,很多人在购买手机的时候,都会关注手机的硬件和拍照,当然了,因为系统关系到流畅性和人性化功能体验,对于这一点也是非 ...

  6. 安卓系统API的使用

    安卓系统给我提供很多API,现在我们就遇到一点写一点吧. 1.获取手机的内存大小以及SD卡的内存大小 /*** 初始化系统的数据*/private void initData() {//获取Rom内存 ...

  7. android代码获取deviceid,获取安卓系统的设备id用getDeviceId()函数

    来源:网络 | 2012-12-18 | (有12829人读过) 贴段具体例子代码,用来说明,安卓系统下,如何获取设备id的一段小例子供大家参考: 在计算机上,我们习惯用MAC地址来标志一台计算机.在 ...

  8. 小米10性能再进化!小米带来国内安卓系统GPU驱动首次更新——初阶GPU及其驱动升级认识

    去年12月,高通宣布率先开放 GPU 驱动更新,骁龙865.骁龙765等系列将在后期获得公开的 GPU 驱动更新,首批支持的机型有小米10/10Pro和 Redmi K30 Pro等.基于此点,前些时 ...

  9. 安卓系统网络服务器地址,安卓系统 云服务器地址

    安卓系统 云服务器地址 内容精选 换一换 您可以通过本节内容解决如下问题:用户在管理控制台执行弹性云服务器相关操作后出现异常,针对管理控制台提示的异常信息,应该如何处理?用户参见<弹性云服务器接 ...

最新文章

  1. TechTarget数据库Redis
  2. 中国科协、阿里云联合编纂云计算教材,为高校云计算人才培养注入强劲动力...
  3. 数学建模感悟:新的算法的学习
  4. 游戏美术干货:各大MOBA类游戏视觉包装设计解析
  5. JAVA之编译期和运行期区别
  6. Java中的垃圾回收器的类型概述 《对Java的分析总结》(六)
  7. Redmi Note 8 PRO真机谍照曝光:原谅色开始流行了
  8. 报告 | 73%的“落伍”开发者说:明年要学AI技术
  9. Unity单例模式+例子
  10. 金仓数据库KingbaseES中 数据库实例命令
  11. IDEA 错误: 找不到或无法加载主类 com.Main
  12. 继承viewgroup
  13. 【模型库】大卡车货车 集装箱 叉车 三维模型
  14. Android MVP 实践之路(理解篇)
  15. UVa10158 War
  16. 【最优化算法】基于【MATLAB】的拟牛顿法【Quasi Newton method】分析与推导
  17. 2022 ciscn 东北赛区分区赛 部分 wp
  18. matlab仿真直流电机,[转载]基于Matlab/Simulink的无刷直流电机控制仿真研究
  19. linux怎么运行dnf,dnf命令 - Linux命令大全 | linux教程
  20. Java实现导出内容为PDF格式

热门文章

  1. 6 个珍藏已久 IDEA 小技巧,这一波全部分享给你!
  2. maven--私服的搭建(Nexus的使用)
  3. 如何将maven项目打包成可执行的jar
  4. Mac配置炫酷终端以及直接预览Markdown和各类代码
  5. Linux IPC实践(12) --System V信号量(2)
  6. 【笔记】Linux的目录配置(a2)
  7. day028 Tcp和Udp协议
  8. Java多线程——重入锁ReentrantLock源码阅读
  9. Java线程同步(二)
  10. 将访问的文件夹变为磁盘盘符-摘自网络