android 指南针

来源:互联网 发布:react native案例源码 编辑:程序博客网 时间:2024/04/28 14:47
@SuppressWarnings("deprecation")
public class CompassActivity extends Activity implements SensorListener {

    CompassView view;
    GLSurfaceView mSurfaceView;
    public int mWidth;
    public int mHeight;
    public String ViewO, ViewA, xViewO, yViewO, zViewO, xViewA, yViewA, zViewA,
            xD, yD, zD;
    SensorManager sm;
    public double jiao;
    public int jiaodu;
    String nan, dong;
    int bei;
    public String tmp;
    Bitmap background1, background2;
    int screenWidth = 0;
    int screenHeight = 0;
    private int x, y, z;
    Sensor sensor;
    SensorEventListener lsn;
    public boolean runTo;
    /** 感应器 */
    static float degree0 = 0;
    float degree1 = 0;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        sm = (SensorManager) getSystemService(SENSOR_SERVICE);
        WindowManager windowManager = getWindowManager();
        Display display = windowManager.getDefaultDisplay();

        int screenWidth = display.getWidth();
        int screenHeight = display.getHeight();
        view = new CompassView(this, screenWidth, screenHeight);
        setContentView(view);
        if (sm != null) {
            sensor = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        }
        // 注册listener,第三个参数是检测的精确度
        lsn = new SensorEventListener() {
            public void onSensorChanged(SensorEvent e) {
                synchronized (this) {
                    x = (int) e.values[SensorManager.DATA_X];
                    y = (int) e.values[SensorManager.DATA_Y];
                    z = (int) e.values[SensorManager.DATA_Z];
                    onStarts();
                }
            }

            public void onAccuracyChanged(Sensor s, int accuracy) {
            }
        };
        sm.registerListener(lsn, sensor, SensorManager.SENSOR_DELAY_GAME);
    }

    /** 重力感应 */
    private boolean getGrivity() {
        if (x >= y && y >= 0) {
            return true;
        } else {
            return false;
        }
    }

    protected void onDestroy() {
        super.onDestroy();
        // 关闭感应器
        view.removeSensorListener();
    }

    public void onSensorChanged(int sensor, float[] values) {
        if (Math.abs(values[0] - degree0) > 16
                || Math.abs(values[0] - degree1) > 10) {// 1)感应器的改变, 灵敏度,视野范围
            synchronized (this) {
                if (sensor == SensorManager.SENSOR_ORIENTATION) {
                    xViewO = "   X:" + (int) values[0];
                    yViewO = "   Y: " + (int) values[1];
                    zViewO = "   Z: " + (int) values[2];
                    degree0 = (int) values[0];
                    degree1 = (int) values[1];
                    ViewO = xViewO + yViewO + zViewO;
                }
            }
        }
    }

    public void onAccuracyChanged(int sensor, int accuracy) {
    }

    @Override
    protected void onResume() {
        super.onResume();
        sm.registerListener(this, SensorManager.SENSOR_ORIENTATION
                | Sensor.TYPE_ACCELEROMETER, SensorManager.SENSOR_DELAY_GAME);
    }

    private Handler checkHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case 0:
                runTo = true;
                break;
            case 1:
                runTo = false;
                break;
            }
        }
    };

    @Override
    protected void onStop() {
        sm.unregisterListener(this);
        super.onStop();
    }

    /** 指南针绘图类 */
    class CompassView extends SurfaceView implements SurfaceHolder.Callback,
            SensorEventListener {
        SurfaceHolder mholder;
        Bitmap background1;
        SensorManager sensorManager;
        Sensor orieSensor;
        int screenWidth = 0;
        int screenHeight = 0;
        float degree = 0;
        private final Object LOCK = new Object();
        Sensor sensor;

        public CompassView(Context context, int screenWidth, int screenHeight) {
            super(context);
            background1 = BitmapFactory.decodeResource(this.getResources(),
                    R.drawable.needle);
            getHolder().addCallback(this);
            this.screenWidth = screenWidth; // this.getWidth();
            this.screenHeight = screenHeight; // this.getHeight();

            sensorManager = (SensorManager) context
                    .getSystemService(Context.SENSOR_SERVICE);
            orieSensor = sensorManager
                    .getDefaultSensor(Sensor.TYPE_ORIENTATION);
            if (orieSensor != null) {
                sensorManager.registerListener(this, orieSensor,
                        SensorManager.SENSOR_DELAY_NORMAL);
            }
        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width,
                int height) {
        }

        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            synchronized (LOCK) {
                mholder = holder;
            }
        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            synchronized (LOCK) {
                mholder = null;
            }
        }

        public void removeSensorListener() {
            sensorManager.unregisterListener(this);
        }

        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {

        }

        // 画指针
        @Override
        public void onSensorChanged(SensorEvent event) {
            Log.i("wop", "" + runTo);
            if (!runTo) {
                return;
            }
            if (Math.abs(event.values[1]) > 32 || // 围绕x轴的偏转(-180 to 180)
                    Math.abs(event.values[2]) > 20) { // 围绕y轴的偏转 (-90 to
                                                        // 90),
                synchronized (LOCK) {
                    if (mholder != null) {
                        Canvas can = mholder.lockCanvas();
                        if (can == null)
                            return;
                        can.drawRGB(0, 0, 0);
                        Paint paint = new Paint();
                        paint.setFlags(Paint.ANTI_ALIAS_FLAG);
                        paint.setColor(Color.GREEN);
                        can.drawText("指南针(立体)", 470, 30, paint);
                        can.drawText("东", 370, 162, paint);
                        can.drawText("西", 186, 162, paint);
                        can.drawText("北", 280, 74, paint);
                        can.drawText("南", 280, 254, paint);
                        can.drawText("(" + "角度:" + getJiaodu() + ")", 30, 30,
                                paint);
                        can.save();
                        can.rotate(event.values[0] + 90, screenWidth / 2,
                                screenHeight / 2);
                        can.drawBitmap(background1, screenWidth / 2
                                - background1.getWidth() / 2, screenHeight / 2
                                - background1.getHeight() / 2, null);
                        can.restore();
                        mholder.unlockCanvasAndPost(can);
                    }
                }
            } else {
                synchronized (LOCK) {
                    if (mholder != null
                            && (Math.abs(event.values[0] - degree) > 0.4)) { // 避免屏幕不动时重复绘制
                        degree = event.values[0];
                        Canvas can = mholder.lockCanvas();
                        if (can == null)
                            return;
                        can.drawRGB(0, 0, 0);
                        Paint paint = new Paint();
                        paint.setFlags(Paint.ANTI_ALIAS_FLAG);
                        paint.setColor(Color.GREEN);
                        can.drawText("指南针(平面)", 470, 30, paint);
                        can.drawText("东", 370, 162, paint);
                        can.drawText("西", 186, 162, paint);
                        can.drawText("北", 280, 74, paint);
                        can.drawText("南", 280, 254, paint);
                        can.drawText("(" + "角度:" + getJiaodu() + ")", 30, 30,
                                paint);
                        can.save();
                        can.rotate(event.values[0] + 90, screenWidth / 2,
                                screenHeight / 2);
                        can.drawBitmap(background1, screenWidth / 2
                                - background1.getWidth() / 2, screenHeight / 2
                                - background1.getHeight() / 2, null);
                        can.restore();
                        mholder.unlockCanvasAndPost(can);

                    }
                }

            }
        }
    }

    // 得到方向角
    private String getJiaodu() {
        // TODO
        jiaodu = (int) CompassActivity.degree0;
        if (jiaodu < 0) {
            return "";
        }
        if (jiaodu == 0 || jiaodu == 360) {
            dong = "正北";
        }
        if (jiaodu > 0 && jiaodu < 90) {
            dong = "东北";
        }
        if (jiaodu == 90) {
            dong = "正东";
        }
        if (jiaodu > 90 && jiaodu < 180) {
            dong = "东南";
        }
        if (jiaodu == 180) {
            dong = "正南";
        }
        if (jiaodu > 180 && jiaodu < 270) {
            dong = "西南";
        }
        if (jiaodu == 270) {
            dong = "正西";
        }
        if (jiaodu > 270 && jiaodu < 359) {
            dong = "西北";
        }
        tmp = dong + jiaodu;
        return tmp;
    }

    protected void onStarts() {
        // TODO
        if (getGrivity()) {
            checkHandler.sendEmptyMessage(0);
        } else {
            checkHandler.sendEmptyMessage(1);
        }
    }

}


权限:<uses-permission android:name="android.permission.ACCESS_LOCATION" />

原创粉丝点击