一个简易的指南针
2015-11-06 20:42
477 查看
今天看了一下Android的传感器的使用,并做了一个简易的指南针。其界面如下:这个例子简单,非常适合初学者学习。 在使用传感器需要注意的地方是传感器的注册和注销,它们分别放在onResume和onPause中实现,如:
@Override protected void onResume() { super.onResume(); if (mOrientationSensor != null) { //Register sensor mSensorManager.registerListener( this, mOrientationSensor, SensorManager.SENSOR_DELAY_FASTEST); } else { Toast.makeText(this, R.string.cannot_get_sensor, Toast.LENGTH_SHORT) .show(); } } @Override protected void onPause() { super.onPause(); if (mOrientationSensor != null) { //Unregister sensor mSensorManager.unregisterListener(this); } }
除了传感器的使用,这个例子还有一个特点是罗盘的绘制。它充分展现了canvas在绘图过程中的灵活性。onDraw的代码如下:
@Override protected void onDraw(Canvas canvas) { int mMeasuredWidth = getMeasuredWidth(); int mMeasuredHeight = getMeasuredHeight(); int px = mMeasuredWidth / 2; int py = mMeasuredHeight / 2; int radius = Math.min(px, py); // Draw the background canvas.drawCircle(px, py, radius, circlePaint); // Rotate our perspective so that the top' is // facing the current bearing. canvas.save(); canvas.rotate(-bearing, px, py); int textWidth = (int) textPaint.measureText("W"); int cardinalX = px - textWidth / 2; int cardinalY = py - radius + textHeight; // Draw the marker every 15 degrees and text every 45. for (int i = 0; i < 24; i++) { // Draw a marker. canvas.drawLine(px, py - radius, px, py - radius + 10, markerPaint); canvas.save(); canvas.translate(0, textHeight); // Draw the cardinal points if (i % 6 == 0) { String dirString = ""; switch (i) { case (0): { dirString = northString; //Draw the compass pointer int arrowY0 = 2 * textHeight + py - radius; int arrowY1 = py + radius - 4 * textHeight; canvas.drawLine( px, arrowY0, px - 5, py, markerPaint ); canvas.drawLine( px, arrowY0, px + 5, py, markerPaint ); canvas.drawLine( px-5, py, px, arrowY1, markerPaint ); canvas.drawLine( px+5, py, px, arrowY1, markerPaint ); break; } case (6): dirString = eastString; break; case (12): dirString = southString; break; case (18): dirString = westString; break; } canvas.drawText(dirString, cardinalX, cardinalY, textPaint); } else if (i % 3 == 0) { // Draw the text every alternate 45deg String angle = String.valueOf(i * 15); float angleTextWidth = textPaint.measureText(angle); int angleTextX = (int) (px - angleTextWidth / 2); int angleTextY = py - radius + textHeight; canvas.drawText(angle, angleTextX, angleTextY, textPaint); } canvas.restore(); canvas.rotate(15, px, py); } canvas.restore(); }
源代码
相关文章推荐
- android 代码实现控件之间的间距
- [Android]在代码里运行另一个程序的方法
- 肯特·贝克:改变人生的代码整理魔法
- Canvas 在高清屏下绘制图片变模糊的解决方法
- 网页恶意代码的预防
- 高手写的Tracer-Flash代码调试类代码下载
- CSS代码缩写技巧
- 非主流Q-zOne代码代码搜集第1/2页
- CreateWeb.vbs 代码
- Lua中编译执行代码相关的函数详解
- 更有效率的css代码编写第1/3页
- 代码中到底应不应当写注释?
- SQL语言查询基础:连接查询 联合查询 代码
- winform异型不规则界面设计的实现方法
- 论坛头像随机变换代码
- .NET 常用功能和代码小结
- C#实现压缩HTML代码的方法
- asp编程中常用的javascript辅助代码第1/2页
- C#超实用代码段合集
- 使用canvas实现仿新浪微博头像截取上传功能