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

 更新时间:2017年11月02日 09:58:01   作者:东风破  
这篇文章主要介绍了Android开发中方向传感器定义与用法,结合实例形式分析了Android方向传感器的功能、定义与使用方法,并附带基于方向传感器实现指南针功能的方法,需要的朋友可以参考下

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

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

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

相关文章

  • Android实现好看的微信聊天气泡效果

    Android实现好看的微信聊天气泡效果

    在聊天类应用中,通常用气泡作为聊天内容的背景色,比如微信的聊天背景,别人发过来的是白色的气泡,自己发的是绿色的气泡。本文将用Android实现好看的微信聊天气泡效果,感兴趣的可以了解一下
    2022-06-06
  • Android使用ExpandableListView实现三层嵌套折叠菜单

    Android使用ExpandableListView实现三层嵌套折叠菜单

    这篇文章主要介绍了Android使用ExpandableListView实现三层嵌套折叠菜单,对布局感兴趣的同学可以参考下
    2021-04-04
  • Android编程自定义title bar(标题栏)示例

    Android编程自定义title bar(标题栏)示例

    这篇文章主要介绍了Android编程自定义title bar(标题栏)的方法,结合实例形式分析了Android针对标题栏的设置与页面布局操作相关技巧,需要的朋友可以参考下
    2016-10-10
  • Android优质索尼滚动相册

    Android优质索尼滚动相册

    这篇文章主要介绍了Android优质索尼滚动相册,桌面小部件滚动相册,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • Android中activity跳转按钮事件的四种写法

    Android中activity跳转按钮事件的四种写法

    这篇文章主要介绍了Android中activity跳转按钮事件的四种写法,下文中包括四个activity的内容详解,非常不错具有参考借鉴价值,需要的朋友可以参考下
    2016-10-10
  • ffmpeg实现去水印以及切分视频demo

    ffmpeg实现去水印以及切分视频demo

    这篇文章主要为大家介绍了ffmpeg实现去水印以及切分视频demo,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • 分享五种Android常用布局方式

    分享五种Android常用布局方式

    Android布局是应用界面开发的重要一环,在Android中,共有五种布局方式,分别是:FrameLayout(框架布 局),LinearLayout (线性布局),AbsoluteLayout(绝对布局),RelativeLayout(相对布局),TableLayout(表格布局),小编通过本文逐一给大家详解
    2015-11-11
  • android 原生安全音量配置逻辑设计详解

    android 原生安全音量配置逻辑设计详解

    这篇文章主要为大家介绍了android 原生安全音量配置逻辑设计详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • Android Studio finish()方法的使用与解决app点击“返回”(直接退出)

    Android Studio finish()方法的使用与解决app点击“返回”(直接退出)

    这篇文章主要介绍了Android Studio finish()方法的使用与解决app点击“返回”(直接退出),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • Android 物理游戏之重力系统开发示例代码

    Android 物理游戏之重力系统开发示例代码

    介绍Android 物理游戏之重力系统,这里提供了详细的资料整理,并附示例代码和实现效果图,有兴趣的小伙伴可以参考下
    2016-08-08

最新评论