标题 | 安卓内置方向传感器应用 |
范文 | 王丽华
摘 要:基于安卓平台设计一款主要用安卓内置的方向传感器的指南针来让用户可以随时辨别方向的应用软件。 关键词:安卓平台;内置方向传感器;指南针 1 项目开发环境及工具 硬件环境:安卓4.0以上平台+PC机 软件环境:Eclipse Android编辑器+SDK集成环境 2 总体设计 项目所用到的传感器主要用到的两个继承类:Activity和View,两个接口:Runnable和SensorEventListener。 SensorManager是传感器的一个统一管理类,包括传感器的种类、接受的频率、精准度等。 SensorEventListener类是传感器的核心部分,想要在传感器改变时做处理,当前的Activity必须实现这个类,实现它的两个方法如下: public void onAccuracyChanged(Sensor sensor,int accuracy):当传感器的精度发生改变时,调用这个方法,里面有传感器Sensor和精度accuracy。 public void onSensorChanged(SensorEvent event):当传感器被改变时调用这个方法,这个方法包含一个参数SensorEvent对象,该对象主要包括float的数组。把一些图片画在Canvas上,诸如指南针用到罗盘、方向指针和背景等等。这里要注意的是要写一个类CompassView继承View类,通过画笔把文字和图片画上去。根据传感器精度的改变来改变指南针的指向。 在Activity类中实现SensorEventListener接口,获取与传感器有关的类。进一步完善代码,添加各种方向精确到45°角的时候,具体指向时的度数显示等等。将编译好的软件置入安卓机中进行测试并记录测试结果,收集各种环境下所产生的Bug。调试程序并完善。 3 详细设计代码如下 项目所用到的包: import java.util.List; import android.app.Activity; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Bundle; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Paint; import android.os.Message; import android.view.View; 注册传感器以及编写传感器监听类: public class SensorDemoActivity extends Activity implements SensorEventListener{ 初始化各项参数设置并注册传感器: private CompassView compassView; private boolean isRegisterSensor; private SensorManager sManager; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); compassView=new CompassView(this); setContentView(compassView); isRegisterSensor=false; 获取SensorManager实例: sManager = (SensorManager) getSystemService(SENSOR_SERVICE); 重写avtivity的onResume方法: protected void onResume() { super.onResume(); 获得方向传感器: TYPE_ORIENTATION List 注册传感器,参数表示当前的传感器时间、传感器及接收的频率: if(sensorList.size()>0){ Sensor sensor = sensorList.get(0); isRegisterSensor = sManager.registerListener(this, sensor,SensorManager.SENSOR_DELAY_FASTEST); } } 重写onPause方法: protected void onPause() { if (isRegisterSensor) { sManager.unregisterListener(this);//注销传感器 isRegisterSensor = false; } super.onPause(); } 精度发生改变时使用此方法: public void onAccuracyChanged(Sensor sensor, int accuracy) { } 传感器被改变时触发: 注册与注销传感器 public void onSensorChanged(SensorEvent event) { if (event.sensor.getType() == Sensor.TYPE_ORIENTATION)//接收方向感应器的类型 { float x = event.values[SensorManager.DATA_X]; compassView.updateDegree(x); } } } 绘制指南针图形类并创建精度调整与启动: public class CompassView extends View implements Runnable{ private Paint paint = new Paint();//paint private String word = "正北 0°";//word private float degree = 0; private Bitmap compassBm;//设置指南针图形 private Bitmap arrowBm;//设置箭头 加载图片: public CompassView(Context context) { super(context); compassBm = BitmapFactory.decodeResource(getResources(), R.drawable.compass); arrowBm = BitmapFactory.decodeResource(getResources(), R.drawable.arrow); new Thread(this).start(); } 重写onDraw方法: 设置画笔画布 protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawColor(Color.WHITE);//设置画布为白色 paint.setColor(Color.BLACK);//设置画笔为黑色 paint.setTextSize(30);//设置字体大小 paint.setFlags(Paint.FAKE_BOLD_TEXT_FLAG);//画出文字 canvas.drawText(word, 105, 50, paint);//设置文字位置 利用Matrix实现对图像的旋转: Matrix matrix = new Matrix();//新建Matrix matrix.reset(); matrix.setTranslate(60, 100);//设置位置 matrix.preRotate(degree, 145, 145);//设置旋转 canvas.drawBitmap(compassBm, matrix, paint);//在Matrix中绘制指南针 canvas.drawBitmap(arrowBm, 152, 73, null);//在Matrix中绘制箭头 } 编写run方法: public void run() { while (!Thread.currentThread().isInterrupted()) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); Thread.currentThread().interrupt(); } postInvalidate(); } } 更新指南针的角度: 增加指南针灵敏度与指向范围 public void updateDegree(float d){ //设置灵敏度 if(Math.abs(degree-d)>=2){ degree = d; String degreeStr = String.valueOf(degree); int range = 22; // 指向正北 if(degree > 360 - range && degree < 360 + range) { word = "正北 " + degreeStr + "°"; } // 指向正东 if(degree > 90 - range && degree < 90 + range) { word = "正东 " + degreeStr + "°"; } // 指向正南 if(degree > 180 - range && degree < 180 + range) { word = "正南 " + degreeStr + "°"; } // 指向正西 if(degree > 270 - range && degree < 270 + range) { word = "正西 " + degreeStr + "°"; } // 指向东北 if(degree > 45 - range && degree < 45 + range) { word = "东北 " + degreeStr + "°"; } // 指向东南 if(degree > 135 - range && degree < 135 + range) { word = "东南 " + degreeStr + "°"; } // 指向西南 if(degree > 225 - range && degree < 225 + range) { word = "西南 " + degreeStr + "°"; } // 指向西北 if(degree > 315 - range && degree < 315 + range) { word = "西北 " + degreeStr + "°"; } } } public String getWord() { return word; } 设置更新信息: 当指南针位置发生改变时界面发生变化 public void setWord(String word) { this.word = word; } } 4 运行界面如下 5 结语 此指南针的设计实现了简单的应用安卓系统内置的方向传感器来辨别方向,但仍然存在诸如不能在不同安卓版本下自动调节界面的功能、在调节下位机方向时指南针灵敏度不够、界面不能很好的保持在界面当中等等,这是有待着重完善的地方。 经过这次设计,我们对java语言和在java下Android编程有了更深一步的认识,对Activity类和View类初步的了解,通过对代码的编写,我们学到了一些知识的用法和功能,提高了自身的动手能力。同时我们也认识到自己相关知识的匮乏以及动手能力的不足,作为初学者,这是我们今后学习过程中所要特别重视和培养的能力。 参考文献: [1]谭思亮.监听与隐藏——网络侦听揭密与数据保护技术[M].北京:人民邮电出版社,2002. [2]陈兵,王力松,等.网络安全与电子商务[M].北京:北京大学出版社,2002. [3]Hent Beck.Implementation Patterns.Pearson Education,Inc,2008. [4]ACTPACT.Monitoring and Control Center (MCC) of the enterprise.http://www.paper.edu.cn,2005. |
随便看 |
|
科学优质学术资源、百科知识分享平台,免费提供知识科普、生活经验分享、中外学术论文、各类范文、学术文献、教学资料、学术期刊、会议、报纸、杂志、工具书等各类资源检索、在线阅读和软件app下载服务。