最近学习了下传感器的操作,但很多书籍都直接讲怎么取值,没有讲清楚怎么分辨不同类型传感器XYZ坐标方向的问题,小马这篇文章主要来说下方向的分辨及小工具实现模拟真机传感器的访问,因为小马在方向感上很YUN....所以写这篇文章来理下自己的脑瓜..希望对大家有帮助:先贴下效果图,后面再细讲:
一:小工具贴图,请详细看下改变方向时三个值的变化
![]()
二:手机中装入小工具APK贴图效果:
![]()
三:监听端口效果图:
![]()
四:设置手机连接小工具贴图:
![]()
五:模拟手机摆动
![]()
在此,小马讲下常用的传感器的XYZ轴,一定要搞清楚方向,不然晕....
1》:手机屏幕XY方向,因为手机屏幕没Z轴,随便哪只手拿着手机,那么左上角 为原点,X正方向向右,Y轴正方向向下....
2》:加速传感器方向,随便哪只手正常拿着手机时,右下角为原点,X轴沿屏幕 向右,Y轴沿屏幕向上,Z轴垂直屏幕向上....
3》:姿态传感器,上面动态图中的Yaw...Pitch...Roll三个轴就搞笑了,具体是 这样的:
3.1:Yaw轴,方向不变,一起是重力加速度g的反方向,也就是一起垂直向上
3.2:Pitch轴,并不是固定不变,随着Yaw的变化而变化,只有与Yaw轴成90度 角永远不变,无论手机怎么转,它是一起与Yaw垂直不变的哦....
3.3:Roll轴沿手机屏幕向上,无论手机怎样放置,Roll的方向都是沿屏幕向 上,可以说与手机绑定死了...
效果看完了,现在来看下具体的实现过程吧,吼吼,说难不难,说简单也不简单,使用的模拟器小工具小马因为过大,小马上传不上来,我会给出连接,需要的朋友可以自行访问下载下的,写下使用步骤(流水帐了....),看不懂使用步骤的可以在下载小工具的链接中找更为详细的使用方法哦,自己试着找下吧...
1.将下载的小工具libs包导入到我们工程中
2.再找到下载的小工具中Jar包,可直接点击运行,用来监听端口,实现模拟
3.再将小工具中的APK文件装到模拟器中,运行这个APK程序,设置下IP 端口
4.点击Conn...连接到小工具,端口要与模拟器配置的端口一致,否则无效
5.大体就是这样了,下面小马再贴下代码,不懂的朋友不用担心,看完就明白了
主控制代码:
- package com.xiaoma.sensor.demo;
-
- import org.openintents.sensorsimulator.hardware.SensorManagerSimulator;
-
- import android.app.Activity;
- import android.hardware.Sensor;
- import android.hardware.SensorEvent;
- import android.hardware.SensorEventListener;
- import android.hardware.SensorListener;
- import android.hardware.SensorManager;
- import android.os.Bundle;
- import android.util.Log;
- import android.widget.TextView;
-
-
-
-
-
-
-
- public class SensorDemoActivity extends Activity implements
- org.openintents.sensorsimulator.hardware.SensorEventListener {
-
- private TextView tView;
- private TextView tView2;
- private TextView tView3;
-
- private SensorManagerSimulator imulatorManager = null;
-
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- init();
- }
-
-
-
-
- private void init() {
-
- tView = (TextView) findViewById(R.id.textview);
- tView2 = (TextView) findViewById(R.id.textview2);
- tView3 = (TextView) findViewById(R.id.textview3);
-
-
-
-
-
-
-
-
-
-
-
-
- imulatorManager = SensorManagerSimulator.getSystemService(this,
- SENSOR_SERVICE);
-
- imulatorManager.connectSimulator();
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- }
-
-
- @Override
- protected void onResume() {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- imulatorManager.registerListener(this,
- imulatorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),
- SensorManager.SENSOR_DELAY_GAME);
- imulatorManager.registerListener(this,
- imulatorManager.getDefaultSensor(Sensor.TYPE_TEMPERATURE),
- SensorManager.SENSOR_DELAY_GAME);
- imulatorManager.registerListener(this,
- imulatorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
- SensorManager.SENSOR_DELAY_GAME);
- super.onResume();
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- @Override
- public void onAccuracyChanged(
- org.openintents.sensorsimulator.hardware.Sensor arg0, int arg1) {
- }
-
- @Override
- public void onSensorChanged(
- org.openintents.sensorsimulator.hardware.SensorEvent event) {
- Log.i("XiaoMa", "调用onSensorChanged()方法了");
- float x = event.values[SensorManager.DATA_X];
- float y = event.values[SensorManager.DATA_Y];
- float z = event.values[SensorManager.DATA_Z];
-
- if (SensorManager.SENSOR_ORIENTATION == event.sensor.TYPE_ORIENTATION) {
- tView.setText("方向传感器:" + "\n" + "X:" + x + "\n" + "Y:" + y + "\n"
- + "Z:" + z + "\n");
- }
- if (SensorManager.SENSOR_ACCELEROMETER == event.sensor.TYPE_ACCELEROMETER) {
- tView3.setText("加速传感器:" + "\n" + "X:" + x + "\n" + "Y:" + y + "\n"
- + "Z:" + z + "\n");
- }
-
-
-
-
-
- if (SensorManager.SENSOR_TEMPERATURE == event.sensor.TYPE_TEMPERATURE) {
- tView3.setText("温度传感器:" + "\n" + "X:" + x + "\n" + "Y:" + y + "\n"
- + "Z:" + z + "\n");
- }
-
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- @Override
- protected void onStop() {
-
- imulatorManager.unregisterListener(this);
- super.onStop();
- }
-
-
-
-
-
-
-
-
- }
全局配置文件:
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.xiaoma.sensor.demo"
- android:versionCode="1"
- android:versionName="1.0" >
-
- <uses-sdk android:minSdkVersion="7" />
-
- <uses-permission android:name="android.permission.INTERNET"/>
- <application
- android:icon="@drawable/ic_launcher"
- android:label="@string/app_name" >
- <activity
- android:name=".SensorDemoActivity"
- 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>
j最后,老规矩的,小DEMO源码放附件里,有需要的朋友可以下载下,学习交流,再讲下,在模拟取值的实现有可以模拟器中取不到值哦,其实还是取不到,而是模拟器不给力,再启下就可以了,吼吼....小工具的下载地址是:
http://code.google.com/p/androidjustice/downloads/detail?name=sensorsimulator-1.0.0-beta1.zip&can=2&q=
因为小马也在学习阶段,如有发现有什么不对的地方,可直接批评指出,小马跟大家一起交流进步,谢谢提出问题的朋友....谢谢