安卓系统通过陀螺仪计算当前坐标(焦点位置)
当我们使用安卓设备 “上下或左右倾斜” 的时候,设备屏幕的 “焦点位置” 会有不同的变化。首先举个例子描述这种情况:
玩过"越野摩托车游戏"的朋友应该都会知道,当手机向左或向右倾斜,摩托车也会向左或向右偏移一定的角度;当手机向上倾斜时,摩托车前轮胎抬起一定的角度,手机向下倾斜时,摩托车后轮胎也会抬起一定的角度。游戏的方向设定原理就是通过"陀螺仪感应器"提供的数据计算得出的结果。
陀螺仪常用模式分为下列几种:
a)TYPE_ACCELEROMETER b)TYPE_MAGNETIC_FIELD c)TYPE_ORIENTATION d)TYPE_GYROSCOPE
下面以 “TYPE_ACCELEROMETER” 作为示例,计算设备屏幕的当前 “焦点位置”:
- 引用指定包文件
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
- 增加类对象
private SensorManager LmSensorManager;
private Sensor LmSensor;//屏幕当前位置int Lwidth;int Lheight;float LPointX;float LPointY;
- 初始化对象/注册服务(可以写在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;
- 感应器消息执行函数
@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);}}
- 自增函数(得到计算后的屏幕坐标)
/**
* 设置当前 "焦点位置"
*/
void SetScreenPoint(float x,float y)
{//这个函数用来记录计算后的屏幕坐标,可以用到不同的场景
}
安卓系统大部分应用场景采用这种坐标计算方式,经过优化(比如移动圆滑处理)应该可以作为实际功能使用。
本篇文章为原创文章,转载或引用请标明出处。
安卓系统通过陀螺仪计算当前坐标(焦点位置)相关推荐
- SLAM无人车计算地图坐标,ros中计算地图坐标,rosweb计算画布对应的坐标(含代码,含公式,超详细),开发跨系统地图导航必备算法【可实现qt,android,c#,mfc,html等地图开发】
ros中计算地图坐标,rosweb计算画布对应的坐标 视频讲解: SLAM无人车计算地图坐标,图片像素坐标公式推导 1.订阅话题 /map nav_msgs::OccupancyGrid 这个消息中可 ...
- Leetcode——安卓系统手势解锁(九宫格)
1. 安卓系统手势解锁 (1)回溯(模版方法) // 至少 需要经过 m 个点,但是 不超过 n 个点的.class Solution {int count = 0;public int number ...
- 华为android系统最新版,谷歌再放大招截胡鸿蒙系统!发布最新版安卓系统:国产手机抢先升级...
原标题:谷歌再放大招截胡鸿蒙系统!发布最新版安卓系统:国产手机抢先升级 [5月21日讯]相信大家都知道,随着华为鸿蒙OS 2.0正式版系统推出旗舰确认,也让华为鸿蒙OS系统在近期越来越火热,受到的关注 ...
- 安卓系统分屏相关修改思路
安卓系统应用在一些特殊设备时,屏幕显示也会有一些特殊要求: 分屏(一面屏幕内显示两个相同的画面),画面分割等,这里讲述一些基本修改思路和简单实例. OpenGLES相关修改 首先说下比较简单的修改 ...
- vivo手机系统android9,可能是最安全的安卓系统了,vivo Funtouch OS 9带来不一样
原标题:可能是最安全的安卓系统了,vivo Funtouch OS 9带来不一样 或许,很多人在购买手机的时候,都会关注手机的硬件和拍照,当然了,因为系统关系到流畅性和人性化功能体验,对于这一点也是非 ...
- 安卓系统API的使用
安卓系统给我提供很多API,现在我们就遇到一点写一点吧. 1.获取手机的内存大小以及SD卡的内存大小 /*** 初始化系统的数据*/private void initData() {//获取Rom内存 ...
- android代码获取deviceid,获取安卓系统的设备id用getDeviceId()函数
来源:网络 | 2012-12-18 | (有12829人读过) 贴段具体例子代码,用来说明,安卓系统下,如何获取设备id的一段小例子供大家参考: 在计算机上,我们习惯用MAC地址来标志一台计算机.在 ...
- 小米10性能再进化!小米带来国内安卓系统GPU驱动首次更新——初阶GPU及其驱动升级认识
去年12月,高通宣布率先开放 GPU 驱动更新,骁龙865.骁龙765等系列将在后期获得公开的 GPU 驱动更新,首批支持的机型有小米10/10Pro和 Redmi K30 Pro等.基于此点,前些时 ...
- 安卓系统网络服务器地址,安卓系统 云服务器地址
安卓系统 云服务器地址 内容精选 换一换 您可以通过本节内容解决如下问题:用户在管理控制台执行弹性云服务器相关操作后出现异常,针对管理控制台提示的异常信息,应该如何处理?用户参见<弹性云服务器接 ...
最新文章
- TechTarget数据库Redis
- 中国科协、阿里云联合编纂云计算教材,为高校云计算人才培养注入强劲动力...
- 数学建模感悟:新的算法的学习
- 游戏美术干货:各大MOBA类游戏视觉包装设计解析
- JAVA之编译期和运行期区别
- Java中的垃圾回收器的类型概述 《对Java的分析总结》(六)
- Redmi Note 8 PRO真机谍照曝光:原谅色开始流行了
- 报告 | 73%的“落伍”开发者说:明年要学AI技术
- Unity单例模式+例子
- 金仓数据库KingbaseES中 数据库实例命令
- IDEA 错误: 找不到或无法加载主类 com.Main
- 继承viewgroup
- 【模型库】大卡车货车 集装箱 叉车 三维模型
- Android MVP 实践之路(理解篇)
- UVa10158 War
- 【最优化算法】基于【MATLAB】的拟牛顿法【Quasi Newton method】分析与推导
- 2022 ciscn 东北赛区分区赛 部分 wp
- matlab仿真直流电机,[转载]基于Matlab/Simulink的无刷直流电机控制仿真研究
- linux怎么运行dnf,dnf命令 - Linux命令大全 | linux教程
- Java实现导出内容为PDF格式