磁场传感器——指北针

package org.lxh.demo;



import android.content.Context;

import android.graphics.Bitmap;

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.util.AttributeSet;

import android.view.View;



public class ArrowView extends View implements SensorEventListener {

    private Bitmap comp = null;

    private float[] allValue;



    public ArrowView(Context context, AttributeSet attrs) {

        super(context, attrs);

        // 底色为白色

        super.setBackgroundColor(Color.WHITE); 

        this.comp = BitmapFactory.decodeResource(super.getResources(),

                R.drawable.arrow);

        // 现在只是找到了一个传感器,但是没有定义类型

        SensorManager manager = (SensorManager) context

                .getSystemService(Context.SENSOR_SERVICE); 

        manager.registerListener(this,

                // 创建了一个适合于游戏操作的磁场传感器

                manager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),

                SensorManager.SENSOR_DELAY_GAME); 

    }

    @Override

    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }

    @Override  // 传感器方位改变

    public void onSensorChanged(SensorEvent event) { 

        // 现在是方位传感器

        if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) { 

            float value[] = event.values; // 取得所有的偏离数据

            ArrowView.this.allValue = value; // 取得三个轴的值

            super.postInvalidate(); // 主线程的现实需要重绘

        }

    }

    @Override

    protected void onDraw(Canvas canvas) {

        super.onDraw(canvas);

        Paint p = new Paint(); // 根据传感器的数值来改变球的速度

        if (this.allValue != null) { // 已经取得了数据

            float x = this.allValue[0] ;

            float y = this.allValue[1] ;

            canvas.restore(); // 重置绘图对象

            // 设置以屏幕中心点作为旋转中心

            canvas.translate(super.getWidth() / 2, super.getHeight() / 2) ;

            // 判断y轴是否为0的旋转角度

            if (y == 0 && x > 0) {

                canvas.rotate(90) ;    // 旋转角度为90度

            } else if (y == 0 && x < 0) {

                canvas.rotate(270) ;    // 旋转角度为270度

            } else {    // 根据x和y的值计算旋转角度,而这个角度就是依靠tan()值来计算

                if(y >= 0) {

                    canvas.rotate((float) Math.tanh(x / y) * 90);

                } else {

                    canvas.rotate(180 + (float) Math.tanh(x / y) * 90);

                }

            }

        }

        canvas.drawBitmap(this.comp, -this.comp.getWidth() / 2,

                -this.comp.getHeight() / 2, p);

    }



}
<org.lxh.demo.ArrowView 

       android:layout_width="fill_parent"

       android:layout_height="wrap_content"  />

 

你可能感兴趣的:(传感器)