本节的实例是一个倾斜角度测量应用,它可以准确的测量出你手机与水平面的倾斜角度,使用的是android传感器里面的加速传感器。巧妙的运用了加速度传感器各个值所代表的物理意义,加上一个很简单的算法,就能测出倾斜角度。

角度值会随着手机的倾斜而准确显示,效果如图:

       


废话不多说直接上代码,上面有清楚的说明

package sina.CreAmazing.angle_view;import android.app.Activity;import android.content.Context;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.hardware.Sensor;import android.hardware.SensorEvent;import android.hardware.SensorEventListener;import android.hardware.SensorManager;import android.os.Bundle;import android.util.DisplayMetrics;import android.util.Log;import android.view.View;public class AngleViewActivity extends Activity {/** Called when the activity is first created. *///声明一个SensorManager管理传感器,一个自定义的类MyView,在myView中绘制自己想要的图像private SensorManager sensorManager;private MyView myView;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//实例化SensorManagersensorManager = (SensorManager) this.getSystemService(SENSOR_SERVICE);//DisplayMetrics用于获取屏幕大小,再传递给myView方便绘制图形界面;DisplayMetrics display = new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(display);//构造一个MyView,display.widthPixels是当前屏幕的宽度,display.heightPixels是当前屏幕的高度myView = new MyView(this, display.widthPixels, display.heightPixels);//这里就不是在layout文件夹里面的布局文件了,直接就是我们的myView。setContentView(myView);}//在onResume(),onPause()中注册和解除监听器@Overrideprotected void onResume() {super.onResume();sensorManager.registerListener(myView,sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.SENSOR_DELAY_NORMAL);}@Overrideprotected void onPause() {sensorManager.unregisterListener(myView);Log.i("unregister", "ok");super.onStop();}}//自定义的类MyView 因为要感应传感器所以实现SensorEventListener。class MyView extends View implements SensorEventListener {//float x = 0;//float y = 0;//z轴上的值是我们所需要的,z轴就是垂直于水平面的方向,当你水平放置手机是它的数值为10,当你垂直放置时它就为0.float z = 0;private float width;private float height;Paint p ;public MyView(Context context) {super(context);// TODO Auto-generated constructor stub}public MyView(Context context, float width, float height) {super(context);this.width = width;this.height = height;//得到一支画笔,设置基本属性p =  new Paint();p.setStyle(Paint.Style.STROKE);}//在onDraw()方法中才是我们真正要画的东西,也就是真正显示在屏幕上的图像@Overrideprotected void onDraw(Canvas canvas) {//首先绘制一张背景图片,图片是事先PS好的一张背景图。canvas就是画布的意思,我们需要用画笔 p 在画布canvas上画画。 canvas.drawBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.circle),0, 0, p);//画背景后还要画文字,再对画笔进行设置。p.setTextSize(50);//所画的文字就是实际测得的角度,在这之前需要对z值进行转化也就是todegree()方法。canvas.drawText(todegree(z) + "°", width / 2 - 20, height / 2, p);//画完后再画一个圆圈,这个圆圈随着角度变化而变大变小。p.setColor(Color.RED);p.setStrokeWidth(2);canvas.drawCircle(width / 2, height / 2, 20 * z, p);}//如何把当前加速度的值转化为当前角度值呢?这需要一定的硬件基础才能明白其中的原理,不懂得同学可以看一些加速度传感器方面的书,关于加速度//传感器还有很多应用,比如速度的测量,位移的测量,这就需要更加复杂的算法了,这里就不再介绍private String todegree(float zz) {//首先判断加速度的值是否大于10,小于-10,这是因为在运动过程中加速是不稳定的,而我们要测的是在静止状态下的稳定值。if (zz > 10) {zz = 10;} else if (zz < -10) {zz = -10;}//acos(zz / 10)就能求出倾斜角度的弧度值。double r = Math.acos(zz / 10);//然后将弧度值转化为角度值int degree = (int) (r * 180 / Math.PI);//最后返回一个Stringreturn String.valueOf(degree);}@Overridepublic void onSensorChanged(SensorEvent event) {// TODO Auto-generated method stub// x = event.values[0];// y = event.values[1];if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){//获得z轴的加速度值z = event.values[2];}//调用此方法进行重绘invalidate();}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {// TODO Auto-generated method stub}}

项目源码:

http://115.com/file/an9mk3ya#AngleView.rar



更多相关文章

  1. Android(安卓)2.3 NDK的新特性
  2. Android-显示传感器的值
  3. Android(安卓)绘制图形时消除锯齿
  4. Android的传感器
  5. android传感器sensor
  6. android传感器Gsensor和Psensor的使用举例
  7. Android传感器各种解释
  8. Android传感器之陀螺仪传感器
  9. Android传感器之磁场传感器

随机推荐

  1. AndroidStudio使用ViewPagerIndicator
  2. Android(安卓)ROM的创建和烧录
  3. android和j2me之清屏(clearScreen)
  4. TabHost页卡
  5. Debug with android ndk-gdb
  6. Android(安卓)SDK 和 杂7杂8
  7. Android(安卓)初识Retrofit
  8. Android(安卓)Activity界面切换添加动画
  9. Android(安卓)编译NDK
  10. android 命令(adb shell)进入指定模拟器