磁场传感器——指北针

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"  />

 

posted on 2013-06-20 00:01  大米稀饭  阅读(355)  评论(0编辑  收藏  举报