Android开发中方向传感器定义与用法详解【附指南针实现方法】

Android开发中方向传感器定义与用法详解【附指南针实现方法】,第1张

概述本文实例讲述了Android开发中方向传感器定义与用法。分享给大家供大家参考,具体如下:

本文实例讲述了AndroID开发中方向传感器定义与用法。分享给大家供大家参考,具体如下:

AndroID中的方向传感器在生活中是一个很好的应用,典型的例子是指南针的使用,我们先来简单介绍一下传感器中三个参数x,y,z的含义,以一幅图来说明。

补充说明:图中的坐标轴x,z和传感器中的X,Y,Z没有任何联系!

如上图所示,绿色部分表示一个手机,带有小圈那一头是手机头部

传感器中的X:如上图所示,规定X正半轴为北,手机头部指向OF方向,此时X的值为0,如果手机头部指向OG方向,此时X值为90,指向OH方向,X值为180,指向OE,X值为270

传感器中的Y:现在我们将手机沿着BC轴慢慢向上抬起,即手机头部不动,尾部慢慢向上翘起来,直到AD跑到BC右边并落在XOY平面上,Y的值将从0~180之间变动,如果手机沿着AD轴慢慢向上抬起,即手机尾部不懂,直到BC跑到AD左边并且落在XOY平面上,Y的值将从0~-180之间变动,这就是方向传感器中Y的含义。

传感器中的Z:现在我们将手机沿着AB轴慢慢向上抬起,即手机左边框不动,右边框慢慢向上翘起来,直到CD跑到AB右边并落在XOY平面上,Z的值将从0~180之间变动,如果手机沿着CD轴慢慢向上抬起,即手机右边框不动,直到AB跑到CD左边并且落在XOY平面上,Z的值将从0~-180之间变动,这就是方向传感器中发Z的含义。

了解了方向传感器中X,Y,Z的含义之后下面我们就开始学习如何使用

首先我们创建一个传感器管理器和一个传感器监听器,管理器用来管理传感器以及创建各种各样的传感器,监听器用来监视传感器的变化并且进行相应的 *** 作

private SensorManager sensorManager;private MySensorEventListener mySensorEventListener;mySensorEventListener= new MySensorEventListener();//这个监听器当然是我们自己定义的,在方向感应器感应到手机方向有变化的时候,我们可以采取相应的 *** 作,这里紧紧是将x,z的值打印出来private final class MySensorEventListener implements SensorEventListener{@OverrIDe//可以得到传感器实时测量出来的变化值public voID onSensorChanged(SensorEvent event) {//方向传感器if(event.sensor.getType()==Sensor.TYPE_ORIENTATION){//x表示手机指向的方位,0表示北,90表示东,180表示南,270表示西float x = event.values[SensorManager.DATA_X];float y = event.values[SensorManager.DATA_Y];float z = event.values[SensorManager.DATA_Z];//tv_orIEntation是界面上的一个TextVIEw标签,不再赘述tv_orIEntation.setText("OrIEntation:"+x+","+y+","+z);}}

我们在onResume方法中创建一个方向传感器,并向系统注册监听器

protected voID onResume() {  Sensor sensor_orIEntation=sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);  sensorManager.registerListener(mySensorEventListener,sensor_orIEntation,SensorManager.SENSOR_DELAY_UI);super.onResume();}

最后我们在onPause()中注销所有传感器的监听,释放方向感应器资源!

protected voID onPause() {//注销所有传感器的监听sensorManager.unregisterListener(mySensorEventListener);super.onPause();}

到此,有关方向传感器的介绍完毕!

完整实例代码点击此处本站下载

附:AndroID基于方向传感器实现指南针功能

step1:新建一个项目Compass,并将一张指南针图片导入到res/drawable-hdpi目录中

step2:设计应用的UI界面,main.xml

<?xml version="1.0" enCoding="utf-8"?><linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID"  androID:orIEntation="vertical"  androID:layout_wIDth="fill_parent"  androID:layout_height="fill_parent"  androID:gravity="center"  ><ImageVIEw  androID:layout_wIDth="wrap_content"  androID:layout_height="wrap_content"  androID:src="@drawable/compass"  androID:ID="@+ID/imageVIEw"  /></linearLayout>

step3:MainActivity.java

import androID.app.Activity;import androID.content.Context;import androID.harDWare.Sensor;import androID.harDWare.SensorEvent;import androID.harDWare.SensorEventListener;import androID.harDWare.SensorManager;import androID.os.Bundle;import androID.vIEw.animation.Animation;import androID.vIEw.animation.RotateAnimation;import androID.Widget.ImageVIEw;public class MainActivity extends Activity {  private ImageVIEw imageVIEw;  /** 传感器管理器 */  private SensorManager manager;  private SensorListener Listener = new SensorListener();  @OverrIDe  public voID onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentVIEw(R.layout.main);    imageVIEw = (ImageVIEw) this.findVIEwByID(R.ID.imageVIEw);    imageVIEw.setKeepScreenOn(true);//屏幕高亮    //获取系统服务(SENSOR_SERVICE)返回一个SensorManager 对象    manager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);  }  @OverrIDe  protected voID onResume() {    /**     * 获取方向传感器     * 通过SensorManager对象获取相应的Sensor类型的对象     */    Sensor sensor = manager.getDefaultSensor(Sensor.TYPE_ORIENTATION);    //应用在前台时候注册监听器    manager.registerListener(Listener,sensor,SensorManager.SENSOR_DELAY_GAME);    super.onResume();  }  @OverrIDe  protected voID onPause() {    //应用不在前台时候销毁掉监听器    manager.unregisterListener(Listener);    super.onPause();  }  private final class SensorListener implements SensorEventListener {    private float predegree = 0;    @OverrIDe    public voID onSensorChanged(SensorEvent event) {      /**       * values[0]: x-axis 方向加速度         values[1]: y-axis 方向加速度         values[2]: z-axis 方向加速度       */      float degree = event.values[0];// 存放了方向值      /**动画效果*/      RotateAnimation animation = new RotateAnimation(predegree,degree,Animation.relative_TO_SELF,0.5f,0.5f);      animation.setDuration(200);      imageVIEw.startAnimation(animation);      predegree=-degree;      /**      float x=event.values[SensorManager.DATA_X];      float y=event.values[SensorManager.DATA_Y];      float z=event.values[SensorManager.DATA_Z];      Log.i("XYZ","x="+(int)x+",y="+(int)y+",z="+(int)z);      */    }    @OverrIDe    public voID onAccuracyChanged(Sensor sensor,int accuracy) {    }  }}

step4:AndroIDManifest.xml

<?xml version="1.0" enCoding="utf-8"?><manifest xmlns:androID="http://schemas.androID.com/apk/res/androID"   package="cn.roco.sensor"   androID:versionCode="1"   androID:versionname="1.0">  <uses-sdk androID:minSdkVersion="8" />  <application androID:icon="@drawable/icon" androID:label="@string/app_name">    <activity androID:name="MainActivity"         androID:label="@string/app_name">      <intent-filter>        <action androID:name="androID.intent.action.MAIN" />        <category androID:name="androID.intent.category.LAUNCHER" />      </intent-filter>    </activity>  </application></manifest>

更多关于AndroID相关内容感兴趣的读者可查看本站专题:《Android开发入门与进阶教程》、《Android视图View技巧总结》、《Android编程之activity *** 作技巧总结》、《Android *** 作SQLite数据库技巧总结》、《Android *** 作json格式数据技巧总结》、《Android资源 *** 作技巧汇总》及《Android控件用法总结》

希望本文所述对大家AndroID程序设计有所帮助。

总结

以上是内存溢出为你收集整理的Android开发中方向传感器定义与用法详解【附指南针实现方法】全部内容,希望文章能够帮你解决Android开发中方向传感器定义与用法详解【附指南针实现方法】所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1143892.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存