欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2023-11-12 09:18:16
本文实例讲述了android开发中方向传感器定义与用法。分享给大家供大家参考,具体如下: android中的方向传感器在生活中是一个很好的应用,典型的例子是指南针的使用,...

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

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

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

补充说明:图中的坐标轴x,y,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,y,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,animation.relative_to_self,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程序设计有所帮助。