博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android_(传感器)指南针
阅读量:5208 次
发布时间:2019-06-14

本文共 6771 字,大约阅读时间需要 22 分钟。

 

Android方向传感器

  

 

传感器中的X:如上图所示,规定X正半轴为北,手机头部指向OF方向,此时X的值为0,如果手机头部指向OG方向,此时X值为90,指向OH方向,X值为180,指向OE,X值为270传感器中的Y:现在我们将手机沿着BC轴慢慢向上抬起,即手机头部不动,尾部慢慢向上翘起来,直到AD跑到BC右边并落在XOY平面上,Y的值将从0~180之间变动,如果手机沿着AD轴慢慢向上抬起,即手机尾部不懂,直到BC跑到AD左边并且落在XOY平面上,Y的值将从0~-180之间变动,这就是方向传感器中Y的含义。传感器中的Z:现在我们将手机沿着AB轴慢慢向上抬起,即手机左边框不动,右边框慢慢向上翘起来,直到CD跑到AB右边并落在XOY平面上,Z的值将从0~180之间变动,如果手机沿着CD轴慢慢向上抬起,即手机右边框不动,直到AB跑到CD左边并且落在XOY平面上,Z的值将从0~-180之间变动,这就是方向传感器中发Z的含义。了解了方向传感器中X,Y,Z的含义之后下面我们就开始学习如何使用首先我们创建一个传感器管理器和一个传感器监听器,管理器用来管理传感器以及创建各种各样的传感器,监听器用来监视传感器的变化并且进行相应的操作private SensorManager sensorManager;private MySensorEventListener mySensorEventListener;mySensorEventListener= new MySensorEventListener();//这个监听器当然是我们自己定义的,在方向感应器感应到手机方向有变化的时候,我们可以采取相应的操作,这里紧紧是将x,y,z的值打印出来private final class MySensorEventListener implements  SensorEventListener{@Override//可以得到传感器实时测量出来的变化值public void onSensorChanged(SensorEvent event) {//方向传感器if(event.sensor.getType()==Sensor.TYPE_ORIENTATION){//x表示手机指向的方位,0表示北,90表示东,180表示南,270表示西float x = event.values[SensorManager.DATA_X];float y = event.values[SensorManager.DATA_Y];float z = event.values[SensorManager.DATA_Z];//tv_orientation是界面上的一个TextView标签,不再赘述tv_orientation.setText("Orientation:"+x+","+y+","+z);}}我们在onResume方法中创建一个方向传感器,并向系统注册监听器protected void onResume() {    Sensor sensor_orientation=sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);    sensorManager.registerListener(mySensorEventListener,sensor_orientation, SensorManager.SENSOR_DELAY_UI);super.onResume();}最后我们在onPause()中注销所有传感器的监听,释放方向感应器资源!protected void onPause() {//注销所有传感器的监听sensorManager.unregisterListener(mySensorEventListener);super.onPause();}到此,有关方向传感器的介绍完毕!
Android:方向传感器

 

感谢东风破的博客:

 

利用Android传感器传回来第一个参数值就是代表手机绕z轴旋转在角度,可以通过Android本身传感器开发出指南针

 

 

运行截图:

 

 

 

程序结构

 

package com.example.administrator.myapplication;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Path;import android.hardware.Sensor;import android.hardware.SensorListener;import android.hardware.SensorManager;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Config;import android.util.Log;import android.view.View;import java.util.List;public class MainActivity extends AppCompatActivity {    private static final String TAG ="指南针";    private SensorManager mSensorManager;    private SampleView mView;    private float[] mValues;    private final SensorListener mListener = new SensorListener() {        @Override        public void onSensorChanged(int i, float[] floats) {            if(Config.DEBUG)                Log.d("TAG","sensorChanged("+floats[0]+","+floats[1]+","+floats[2]+")");            mValues = floats;            if(mView!=null)            {                mView.invalidate();            }        }        @Override        public void onAccuracyChanged(int i, int i1) {        }    };    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);       mSensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);        List
sensors = mSensorManager.getSensorList(Sensor.TYPE_ALL); mView = new SampleView(this); setContentView(mView); } @Override protected void onResume() { super.onResume(); mSensorManager.registerListener(mListener,SensorManager.SENSOR_ORIENTATION,SensorManager.SENSOR_DELAY_GAME); } @Override protected void onStop() { mSensorManager.unregisterListener(mListener); super.onStop(); } private class SampleView extends View{ private Paint mPaint = new Paint(); private Path mPath = new Path(); private boolean mAnimate; private long mNextTime; public SampleView(Context context) { super(context); mPath.lineTo(-20,60); mPath.lineTo(0,50); mPath.lineTo(20,60); mPath.close(); } protected void onDraw(Canvas canvas) { Paint paint = mPaint; canvas.drawColor(Color.WHITE); paint.setAntiAlias(true); paint.setColor(Color.BLUE); paint.setStyle(Paint.Style.FILL); int w = canvas.getWidth(); int h = canvas.getHeight(); int cx = w/2; int cy = h/2; canvas.translate(cx,cy); if(mValues!=null) { canvas.rotate(-mValues[0]); } canvas.drawPath(mPath,mPaint); } @Override protected void onAttachedToWindow() { mAnimate = true; super.onAttachedToWindow(); } protected void onDetachedFromWindow() { mAnimate = false; super.onDetachedFromWindow(); } }}
MainActivity

 

一、方位传感器

 

注册注册方位角传感器,获取其中的极方位角方(mValues)

private final SensorListener mListener = new SensorListener() {        @Override        public void onSensorChanged(int i, float[] floats) {                   mValues = floats;            if(mView!=null)            {                mView.invalidate();            }        }        @Override        public void onAccuracyChanged(int i, int i1) {        }    };

 

 

二、指南针

1、绘制指南针

public SampleView(Context context)       {           super(context);           mPath.lineTo(-20,60);           mPath.lineTo(0,50);           mPath.lineTo(20,60);           mPath.close();       }

canvas.translate(cx,cy)方法

  平移,将画布的坐标原点向左右方向移动cx,向上下方向移动cy.canvas的默认位置是在(0,0).

 

2、调整指南针方向

 

每当方位角度栽移动时,通过控制整个话不反方向移动同样在角度,来实现看起来椒整个指南针都在移动

canvas.rotate(x)方法

  旋转角度,以弧度计

private class SampleView extends View{       private Paint mPaint = new Paint();       private Path mPath = new Path();       private boolean mAnimate;       private long mNextTime;       public SampleView(Context context)       {           super(context);           mPath.lineTo(-20,60);           mPath.lineTo(0,50);           mPath.lineTo(20,60);           mPath.close();       }       protected void onDraw(Canvas canvas)       {           Paint paint = mPaint;           canvas.drawColor(Color.WHITE);           paint.setAntiAlias(true);           paint.setColor(Color.BLUE);           paint.setStyle(Paint.Style.FILL);           int w = canvas.getWidth();           int h = canvas.getHeight();           int cx = w/2;           int cy = h/2;           canvas.translate(cx,cy);           if(mValues!=null)           {               canvas.rotate(-mValues[0]);           }           canvas.drawPath(mPath,mPaint);       }       @Override       protected void onAttachedToWindow()       {           mAnimate = true;           super.onAttachedToWindow();       }       protected void onDetachedFromWindow()       {           mAnimate = false;           super.onDetachedFromWindow();       }   }

 

转载于:https://www.cnblogs.com/1138720556Gary/p/9333155.html

你可能感兴趣的文章
jquery之selectors
查看>>
.hive命令的3种调用方式 以及源码
查看>>
Codeforces 559A 第六周 O题
查看>>
谢宝友 LINUX 内核专家-----LINUX内核注释
查看>>
oracle io 等待图解
查看>>
高级Bash脚本编程指南
查看>>
MySQL索引原理及慢查询优化 美团
查看>>
叶金荣主页
查看>>
Part2 数据类型与流程控制
查看>>
java异常处理机制(try-catch-finally)
查看>>
JS移动端滑屏事件
查看>>
Linux Shell编程(19)——测试与分支
查看>>
SuSe11 inotify+rsync 实现文件实时同步
查看>>
轻松几句搞定【Javascript中的this指向】问题
查看>>
Linux下oracle数据库启动和关闭操作
查看>>
使用Vue2.X和Webpack2.X开发SPA应用 - 环境构建篇
查看>>
锋利的jQuery第四章:jQuery中的事件和动画
查看>>
网站结构优化的基本方法
查看>>
用CSS制作带图标的按钮
查看>>
1008.CTF 题目之 WEB Writeup 通关大全 – 2
查看>>