Android_(传感器)指南针
Android 传感器
2023-09-14 08:57:05 时间
Android方向传感器
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
传感器中的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传感器传回来第一个参数值就是代表手机绕z轴旋转在角度,可以通过Android本身传感器开发出指南针
运行截图:
程序结构
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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<Sensor>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(); } } }
一、方位传感器
注册注册方位角传感器,获取其中的极方位角方(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(); } }
相关文章
- android scaleanimation动画,【Android动画九章】-RotateAnimation(旋转动画)和ScaleAnimation(尺寸动画)…[通俗易懂]
- android中的加密算法,Android中加密算法[通俗易懂]
- strictmode android,Android 应用性能优化-StrictMode(严格模式)
- android 混淆规则作用,Android代码混淆详解
- Android adb install 命令安装apk
- 2018年Unity结合Android SDK下载安装及配置教程
- Android面试每日一题(2): 一般什么情况下会导致内存泄漏问题?
- Android保存图片到相册(适配android 10以下及以上)
- android attrs获取_关于Android attrs 自定义属性的说明
- android跳转到相册需要权限,Android打开相册获取图片路径[通俗易懂]
- eclipse中android开发_Android开发教程
- Android传感器开发与智能设备案例实战_Android移动应用开发
- 3.Android-传感器开发-处理各种传感器配置[通俗易懂]
- android传感器开发与智能设备案例实战_传感器的选择
- android开发艺术探索学习 之 Activity的生命周期
- 【Android 内存优化】垃圾回收算法 ( 内存优化总结 | 常见的内存泄漏场景 | GC 算法 | 标记清除算法 | 复制算法 | 标记压缩算法 )
- 【Android 启动过程】Android 应用启动流程 | Activity 启动流程
- 【Android 逆向】Android 系统文件分析 ( cpuinfo 处理器信息文件 | self 当前进程信息文件 | meminfo 当前内存信息文件 )
- 【Android NDK 开发】CMake 中查找链接 Android 自带动态库位置说明 ( ndk-bundleplatformsandroid-29arch-armusrlib )
- 【Android Gradle 插件】将自定义 Gradle 插件上传到自建 Maven 仓库 ① ( Maven 仓库上传源码上传源码设置 | 自定义源码打包任务 | 自定义文档打包任务 )
- Android为何比iOS卡论1G内存的使用详解手机开发
- 谷歌向Android智能机用户推出Google One整机云备份服务
- 我查查下载 我查查 8.5.1 Android 去广告版下载
- Android自动判断是电话,网址,EMAIL方法之Linkify的使用
- android中处理各种触摸事件的方法浅谈
- android浏览器之多窗口方案详解
- ubuntu用wifi连接android调试程序的步骤