1.android 的坐标系是如何定义x, y z 轴的。

x轴的方向是沿着屏幕的水平方向从左向右,如果手机不是正方形的话,较短的边需要水平放置,较长的边需要垂直放置。

Y轴的方向是从屏幕的左下角开始沿着屏幕的的垂直方向指向屏幕的顶端。

将手机放在桌子上,z轴的方向是从手机指向天空。

2.方向传感器
           在方向传感器中values变量的3个值都表示度数,它们的含义如下:
          values[0]:该值表示方位,也就是手机绕着Z轴旋转的角度。0表示北(North);90表示东(East);180表示南(South);270表示西(West)。如果values[0]的值正好是这4个值,并且手机是水平放置,表示手机的正前方就是这4个方向。可以利用这个特性来实现电子罗盘,实例76将详细介绍电子罗盘的实现过程。
      values[1]:该值表示倾斜度,或手机翘起的程度。当手机绕着X轴倾斜时该值发生变化。values[1]的取值范围是-180≤values[1]≤180。

假设将手机屏幕朝上水平放在桌子上,这时如果桌子是完全水平的,values[1]的值应该是0(由于很少有桌子是绝对水平的,因此,该值很可能不为0,但一般都是-5和5之间的某个值)。这时从手机顶部开始抬起,直到将手机沿X轴旋转180度(屏幕向下水平放在桌面上)。在这个旋转过程中,values[1]会在0到-180之间变化,也就是说,从手机顶部抬起时,values[1]的值会逐渐变小,直到等于-180。如果从手机底部开始抬起,直到将手机沿X轴旋转180度,这时values[1]会在0到180之间变化。也就是values[1]的值会逐渐增大,直到等于180。可以利用values[1]和下面要介绍的values[2]来测量桌子等物体的倾斜度。
          values[2]:表示手机沿着Y轴的滚动角度。取值范围是-90≤values[2]≤90。假设将手机屏幕朝上水平放在桌面上,这时如果桌面是平的,values[2]的值应为0。将手机左侧逐渐抬起时,values[2]的值逐渐变小,直到手机垂直于桌面放置,这时values[2]的值是-90。将手机右侧逐渐抬起时,values[2]的值逐渐增大,直到手机垂直于桌面放置,这时values[2]的值是90。在垂直位置时继续向右或向左滚动,values[2]的值会继续在-90至90之间变化。

下面以一个实例说明其应用方法

package com.example.sensortest;import java.util.List;import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;public class SensorTest extends Activity implements SensorEventListener{private SensorManager sensorManager = null;private Sensor gyroSensor = null;private TextView vX;private TextView vY;private TextView vZ;private TextView v;private Button button;private static final float NS2S = 1.0f / 1000000000.0f;private float timestamp;private float[] angle = new float[3];  @SuppressWarnings("deprecation")@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_sensor_test);vX = (TextView) findViewById(R.id.vx);vY = (TextView)findViewById(R.id.vy);vZ = (TextView)findViewById(R.id.vz);v = (TextView)findViewById(R.id.v); button = (Button)findViewById(R.id.button);sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);gyroSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);vX.setText("!!!!!!");button.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stub//声明可变字符串StringBuffer sb = new StringBuffer();//获取手机全部的传感器List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ALL);//迭代输出获得上的传感器for (Sensor sensor : sensors) {//System.out.println(sensor.getName().toString());sb.append(sensor.getName().toString());sb.append("\n");Log.i("Sensor", sensor.getName().toString());}//给文本控件赋值v.setText(sb.toString());}});}public SensorTest() {// TODO Auto-generated constructor stubangle[0] = 0;angle[1] = 0;angle[2] = 0;timestamp = 0;}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.activity_sensor_test, menu);return true;}@Overrideprotected void onPause() {// TODO Auto-generated method stubsuper.onPause();sensorManager.unregisterListener(this); // 解除监听器注册}@Overrideprotected void onResume() {// TODO Auto-generated method stubsuper.onResume();sensorManager.registerListener(this, gyroSensor,SensorManager.SENSOR_DELAY_NORMAL);  //为传感器注册监听器}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {// TODO Auto-generated method stub}@Overridepublic void onSensorChanged(SensorEvent event) {// TODO Auto-generated method stub
//      if (event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE)
//        {
//       return;
//        }//       if (timestamp != 0) {
//          final float dT = (event.timestamp - timestamp) * NS2S;
//          angle[0] += event.values[0] * dT * 100;
//          angle[1] += event.values[1] * dT * 100;
//          angle[2] += event.values[2] * dT * 100;
//         }
//         timestamp = event.timestamp;
//
//
//         vX.setText("X: " + Float.toString(angle[0]));
//         vY.setText("Y: " + Float.toString(angle[1]));
//         vZ.setText("Z: " + Float.toString(angle[2]));//       方向传感器提供三个数据,分别为azimuth、pitch和roll。
//
//      azimuth:方位,返回水平时磁北极和Y轴的夹角,范围为0°至360°。
//      0°=北,90°=东,180°=南,270°=西。
//
//      pitch:x轴和水平面的夹角,范围为-180°至180°。
//      当z轴向y轴转动时,角度为正值。
//
//      roll:y轴和水平面的夹角,由于历史原因,范围为-90°至90°。
//      当x轴向z轴移动时,角度为正值。vX.setText("Orientation X: " + event.values[0]);vY.setText("Orientation Y: " + event.values[1]);vZ.setText("Orientation Z: " + event.values[2]);}}

布局文件如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".SensorTest" android:orientation="vertical"><Button android:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="获取传感器"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/v"android:textSize="30px"
></TextView><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/vx"android:textSize="50px"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/vy"android:textSize="50px"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/vz"android:textSize="50px"/></LinearLayout>

Android 利用方向传感器获得手机的相对角度相关推荐

  1. Android利用方向传感器获得手机的相对角度实例说明

    1.android 的坐标系是如何定义x, y z 轴的 x轴的方向是沿着屏幕的水平方向从左向右,如果手机不是正方形的话,较短的边需要水平放置,较长的边需要垂直放置. Y轴的方向是从屏幕的左下角开始沿 ...

  2. Android 利用方向传感器实现 指南针

    step1:新建一个项目Compass,并将一张指南针图片导入到res/drawable-hdpi目录中 step2:设计应用的UI界面,main.xml <?xml version=" ...

  3. Android 利用方向传感器实现 指南针

    step1:新建一个项目Compass,并将一张指南针图片导入到res/drawable-hdpi目录中 step2:设计应用的UI界面,main.xml <?xml version=" ...

  4. 我的Android进阶之旅------Android利用Sensor(传感器)实现水平仪功能的小例

    这里介绍的水平仪,指的是比较传统的气泡水平仪,在一个透明圆盘内充满液体,液体中留有一个气泡,当一端翘起时,该气泡就会浮向翘起的一端.    利用方向传感器返回的第一个参数,实现了一个指南针小应用.   ...

  5. Android笔记 方向传感器

    1传感器概念 图片资源来自传智播客张泽华视频114集 demo 1布局一张图片 网上随便找一张指南针图片 <RelativeLayout xmlns:android="http://s ...

  6. android 通过加速度传感器实现手机来电时翻转静音

    实现思路 通过加速度传感器获取 X,Y,Z 三轴所受的重力 计算在指定的时间段内,手机在 X,Y,Z 矢量和的方向上的速度 如果速度大于指定的速度阀值,判定手机当前在剧烈抖动:并结束当前方法 通过Z轴 ...

  7. Android基于方向传感器实现指南针功能

    这里做了一个指南针,主要用到了Android里的加速度传感器和地磁传感器 Github源码 1.数据初始化 private USensor(Context context) {if (sorMgr = ...

  8. Android利用云盘实现手机上传功能

    http://blog.csdn.net/Tardis1/article/details/50966844,本人地址. 做毕业设计的时候,需要将抓取的tcp.udp报文上传到用户的网盘,不知道是我关键 ...

  9. android 横盘方向传感器,横盘震荡选择方向!

    2020.10.15日 上证指数: 大盘已经连续3天盘整了,而且这三天还是逐渐下行的态势. 今天冲高后又被打下来,显得有气无力.按理说上面的缺口不远了,很容易就能补上,不知道主力是怎么想的,这里到底是 ...

最新文章

  1. MPB:北大口腔陈峰、陈智滨等-口腔常见微生物的培养方法
  2. 日文 LaTeX 系统介绍 - 最简示例
  3. 黑马程序员的课程不如兄弟连兄弟会好
  4. eclipse中的WEB项目打包部署到tomcat .
  5. 系统测试集成测试单元测试_单元和集成测试的代码覆盖率
  6. 对眼睛有利的屏幕颜色
  7. UI设计干货素材|教你正确使用浮动按钮
  8. Python+tkinter实现任意多层级关系的组合框
  9. 小程序多端开源框架黑马!它是如何做到快应用小程序自由转译的?
  10. ActiveMQ RabbitMQ RokcetMQ Kafka实战 消息队列中间件视频教程
  11. orangepi自启动打开一个终端并且运行脚本
  12. spring启动quartz定时器
  13. 「创作之秋」| 参赛成员- 获奖名单(参与奖)
  14. 两相四线步进电机的驱动
  15. js锅打灰太狼小游戏
  16. 国内App推广N种方法,总有几种适合你
  17. 数字电路中几种基本门电路
  18. 在padavan运行wifidog
  19. HTTP请求状态码集合
  20. TinyXML2 学习

热门文章

  1. 博客作业01-抽象数据类型
  2. Android基础之一
  3. GDALWarp设置GDALWarpOptions::dfWarpMemoryLimit过大时处理失败
  4. 【转】python 字符编码与解码——unicode、str和中文:UnicodeDecodeError: 'ascii' codec can't decode...
  5. XHTML学习资料(四)—— 图像
  6. java on RHEL5
  7. 一个html的文件当中读取另一个html文件
  8. 邮件服务器轻松组建 友旺MG1200功能介绍
  9. 『中级篇』阿里云安装Docker企业版UCP和DTR(59)
  10. Python技巧之“is”对比“==”