Compass-指南针(主要用到RotateAnimation和SensorEventListener)

本文介绍如何在Android平台上开发一个使用真实设备方向传感器的指南针应用,通过注册监听器并处理SensorEvent来实现指南针功能。
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:background="#fff"  
  6.     >  
  7. <ImageView  
  8.     android:id="@+id/znzImage"  
  9.     android:layout_width="150dip"  
  10.     android:layout_height="150dip"  
  11.     android:scaleType="fitCenter"  
  12.     android:src="@drawable/znz"/>  
  13. </LinearLayout>  

  1. package org.crazyit.sensor;  
  2.   
  3. //import org.openintents.sensorsimulator.hardware.Sensor;  
  4. //import org.openintents.sensorsimulator.hardware.SensorEvent;  
  5. //import org.openintents.sensorsimulator.hardware.SensorEventListener;  
  6. //import org.openintents.sensorsimulator.hardware.SensorManagerSimulator;  
  7.   
  8. import android.app.Activity;  
  9. import android.hardware.Sensor;  
  10. import android.hardware.SensorEvent;  
  11. import android.hardware.SensorEventListener;  
  12. import android.hardware.SensorManager;  
  13. import android.os.Bundle;  
  14. import android.util.Log;  
  15. import android.view.animation.Animation;  
  16. import android.view.animation.RotateAnimation;  
  17. import android.widget.ImageView;  
  18.   
  19. /** 
  20.  * Description: 
  21.  * <br/>site: <a href="http://www.crazyit.org">crazyit.org</a>  
  22.  * <br/>Copyright (C), 2001-2012, Yeeku.H.Lee0 
  23.  * <br/>This program is protected by copyright laws. 
  24.  * <br/>Program Name: 
  25.  * <br/>Date: 
  26.  * @author  Yeeku.H.Lee kongyeeku@163.com 
  27.  * @version  1.0 
  28.  */  
  29. public class Compass extends Activity  
  30.     implements SensorEventListener  
  31. {  
  32.     // 定义显示指南针的图片  
  33.     ImageView znzImage;  
  34.     // 记录指南针图片转过的角度  
  35.     float currentDegree = 0f;  
  36.     // 定义模拟器的Sensor管理器  
  37. //  private SensorManagerSimulator mSensorManager;  
  38.   
  39.      // 定义真机的Sensor管理器  
  40.     SensorManager mSensorManager;  
  41.     @Override  
  42.     public void onCreate(Bundle savedInstanceState)  
  43.     {  
  44.         Log.i("hyz""Compass->onCreate()");  
  45.         super.onCreate(savedInstanceState);  
  46.         setContentView(R.layout.main);  
  47.         // 获取界面中显示指南针的图片  
  48.         znzImage = (ImageView) findViewById(R.id.znzImage);  
  49.   
  50.          // 获取真机的传感器管理服务  
  51.          mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);  
  52. //      // 获取传感器模拟器的传感器管理服务  
  53. //      mSensorManager = SensorManagerSimulator.getSystemService(this,  
  54. //          SENSOR_SERVICE);  
  55. //      // 连接传感器模拟器  
  56. //      mSensorManager.connectSimulator();  
  57.     }  
  58.   
  59.     @Override  
  60.     protected void onResume()  
  61.     {  
  62.         Log.i("hyz""Compass->onResume()");  
  63.         super.onResume();  
  64.         // 为系统的方向传感器注册监听器  
  65.         mSensorManager.registerListener(this,  
  66.             mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),  
  67.             SensorManager.SENSOR_DELAY_GAME);  
  68.     }  
  69.   
  70.     @Override  
  71.     protected void onPause()  
  72.     {  
  73.         Log.i("hyz""Compass->onPause()");  
  74.         // 取消注册  
  75.         mSensorManager.unregisterListener(this);  
  76.         super.onPause();  
  77.     }  
  78.   
  79.     @Override  
  80.     protected void onStop()  
  81.     {  
  82.         Log.i("hyz""Compass->onStop()");  
  83.         // 取消注册  
  84.         mSensorManager.unregisterListener(this);  
  85.         super.onStop();  
  86.     }  
  87.   
  88.     @Override  
  89.     public void onSensorChanged(SensorEvent event)  
  90.     {  
  91.         //Log.i("hyz", "Compass->onSensorChanged()");  
  92.         // 真机上获取触发event的传感器类型  
  93.         int sensorType = event.sensor.getType();  
  94. //      // 模拟器上获取触发event的传感器类型  
  95. //      int sensorType = event.type;  
  96.         switch (sensorType)  
  97.         {  
  98.             case Sensor.TYPE_ORIENTATION:  
  99.                 // 获取绕Z轴转过的角度。  
  100.                 float degree = event.values[0];  
  101.                 // 创建旋转动画(反向转过degree度)  
  102.                 RotateAnimation ra = new RotateAnimation(  
  103.                         currentDegree,  -degree, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);  
  104.                 // 设置动画的持续时间  
  105.                 ra.setDuration(0);  
  106.                 // 运行动画  
  107.                 znzImage.startAnimation(ra);  
  108.                 currentDegree = -degree;  
  109.                 break;  
  110.         }  
  111.     }  
  112.   
  113.     @Override  
  114.     public void onAccuracyChanged(Sensor sensor, int accuracy)  
  115.     {  
  116.         Log.i("hyz""Compass->onAccuracyChanged()");  
  117.     }  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值