【Android开发小记--8】传感器 以及 指南针的实现
2016-02-05 00:07
816 查看
传感器
注:这里都是用的真机调试根据生命周期,在onResume()中启用传感器,在onPause()中注销注册,
先设置传感器管理器 SensorManager,再在 onResume() 其中添加各个传感器 sensor 并监听,然后在onSensorChanged(SensorEvent event)方法中读取数据,最后还要在 onPause()(onStop())中注销注册。
MainActivity.java
public class MainActivity extends AppCompatActivity implements SensorEventListener { private SensorManager sensorManager; private Sensor sensor; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //传感器管理器 sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); } @Override public void onSensorChanged(SensorEvent event) { switch (event.sensor.getType()) { case Sensor.TYPE_PROXIMITY: System.out.println(event.values[0]); break; case Sensor.TYPE_ACCELEROMETER: System.out.format("x=%f,y=%f,z=%f\n", event.values[0], event.values[1], event.values[2]); break; case Sensor.TYPE_ORIENTATION: System.out.format("value:%f\n", event.values[0]); break; } } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } @Override protected void onResume() { super.onResume(); //距离传感器 sensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY); //传感器监听器 sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_NORMAL); //加速度传感器 sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_NORMAL); //指南针传感器 sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION); sensorManager.registerListener(this, sensor, sensorManager.SENSOR_DELAY_NORMAL); } @Override protected void onPause() { super.onPause(); //注销注册 sensorManager.unregisterListener(this); } }
具体代码点击
指南针的实现
效果图
这里就是添加了一张图片,使用 RotateAnimation 来根据传感器数据来做相应的旋转,
MainActivity.java
public class MainActivity extends AppCompatActivity implements SensorEventListener { private ImageView imageView; private SensorManager sensorManager; private Sensor sensor; private float degrees, preDegree = 0f; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //传感器管理器 sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); imageView = (ImageView) findViewById(R.id.imageView); } @Override protected void onResume() { super.onResume(); //指南针传感器 sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION); sensorManager.registerListener(this, sensor, sensorManager.SENSOR_DELAY_NORMAL); } @Override public void onSensorChanged(SensorEvent event) { switch (event.sensor.getType()) { case Sensor.TYPE_ORIENTATION: degrees = -event.values[0];//读取度数 //在屏幕上显示,若变化大于5度就显示变化 if (Math.abs(degrees - preDegree) > 5) { RotateAnimation ra = new RotateAnimation(preDegree, degrees, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); ra.setDuration(200); ra.setFillAfter(true);//保持在这里 imageView.startAnimation(ra); preDegree = degrees;//下次的初始数据 } break; } } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } @Override protected void onPause() { super.onPause(); //注销注册 sensorManager.unregisterListener(this); } }
具体代码点击
相关文章推荐
- android 常见分辨率(mdpi、hdpi 、xhdpi、xxhdpi )及屏幕适配注意事项
- 【Android开发小记--7】动画--简单的button移动和图片3D翻转
- android service学习总结
- TextView设置selector后,没有点击效果
- Android_Studio快捷键和使用技巧
- Android Material Design I-基础知识
- Android开发设计模式之——单例模式
- Android隐藏状态栏、导航栏
- 解决 Android Studio 乱码问题
- 写一个Android输入法02——候选窗、转换
- Android虚拟机打不开解决方法
- Android开发学习之路--Activity之四种启动模式
- Android开发学习之路--Activity之四种启动模式
- Android 百度地图 SDK v3.0.0 (二) 定位与结合方向传感器
- android 支持分组和联系人展示的一个小样例
- Android性能优化之缓存的代码实现
- Android 沉浸式状态栏
- Android广播Broadcast的学习(附demo)
- Android性能优化之三级缓存
- Android 简单实现ListView指定ITEM滑到到顶停靠