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

Android 利用方向传感器实现指南针具体步骤

程序员文章站 2023-12-04 21:26:40
step1:新建一个项目compass,并将一张指南针图片导入到res/drawable-hdpi目录中  step2:设计应用的ui界面,main.xml 复制...
step1:新建一个项目compass,并将一张指南针图片导入到res/drawable-hdpi目录中
Android 利用方向传感器实现指南针具体步骤 
step2:设计应用的ui界面,main.xml
复制代码 代码如下:

<span style="font-size: 18px"><strong><?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></strong></span>

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
复制代码 代码如下:

<span style="font-size: 18px"><strong><?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></strong></span>