携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第13天,点击查看活动详情
一、展示效果
本次实战项目,利用Android中的距离传感器,开发一个小猪睡觉的趣味应用,靠近小猪,它就睡觉;你一离开,它就作妖。可用于哄娃,效果如下:
二、源码放送
xml
布局中只有一个居中的ImageView
图片,用于显示小猪图片,此处就不再赘述了。
重点把Activity
里的代码,给大家展示一下。
public class MainActivity extends Activity {
private ImageView imageView;
private SensorManager manager;
private SensorListener listener = new SensorListener();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = findViewById(R.id.imageView);
// 获取管理器
manager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
}
@Override
protected void onResume() {
// 获取距离传感器
Sensor sensor = manager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
// 注册监听
manager.registerListener(listener, sensor, SensorManager.SENSOR_DELAY_NORMAL);
super.onResume();
}
private final class SensorListener implements SensorEventListener {
@Override
public void onSensorChanged(SensorEvent event) {
if (event.values[0] == 0.0) {
// 0 表示距离较近
imageView.setImageResource(R.mipmap.sleep);
} else {
// 距离不近
imageView.setImageResource(R.mipmap.active);
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {}
}
@Override
protected void onPause() {
manager.unregisterListener(listener);
super.onPause();
}
}
复制代码
能看明白的,抱好键盘,可以走了。看不明白的,听我下面进行解读。
三、原理解读
2.1 传感器 Sensor
距离传感器是一个小硬件,广泛应用于智能手机,一般位于听筒附近,当接通电话时,手机距离耳朵较近,此时容易出现误操作现象(如面部易挂断电话,脸大者的苦恼),因此就需要对距离进行关注,避免误操作的发生。
智能手机上使用的距离传感器大多是红外距离传感器。
当发射管发出的红外线被接收管接收到时,表明距离较近,而当接收管接收不到发射管发射的红外线时,表明距离较远。Android中距离传感器会返回距离的数据,当传感器被遮挡距离较近时数值为0。
2.2 调用方法
我们说过,传感器它是一个硬件。正常情况下,代码想要调用硬件,这是很困难的,需要各种桥梁和媒介。
但是,我们是做应用,不是搞研发,Android SDK早就为我们准备好了相应的API。
Android中关于传感器的类叫做Sensor
。我们要实现传感器数据的获取,需要两步:
第一步:从SensorManager得到Sensor传感器。
SensorManager manager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
Sensor oSensor = manager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
复制代码
先获取传感器的管理器,你看这多拗口,传感器的管理器。Android SDK很人性化,自己默默地把所有传感器都集成明白了,只需要一个管理类,你想要什么就跟它说,上面getDefaultSensor
的参数Sensor.TYPE_PROXIMITY
指的就是,我们要传感器类型为距离传感器。当然还有很多,比如明天我们讲方向传感器。
第二步:给Sensor传感器注册回调。
manager.registerListener(new SensorListener(), oSensor, SensorManager.SENSOR_DELAY_NORMAL);
class SensorListener implements SensorEventListener {
@Override
public void onSensorChanged(SensorEvent event) {
// event.values[0] 距离,数值为0表示距离较近
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
}
复制代码
- 第一个参数,表示我们的传感器有数据变化时,应该通知谁(这里是SensorListener,继承了SensorEventListener,实现了onSensorChanged方法)进行处理。
- 第二个参数,是给哪种传感器设置,我们上面构建的是一个
TYPE_PROXIMITY
类型,也就是距离传感器。 - 其中第三个参数
SensorManager.SENSOR_DELAY_NORMAL
是变化的灵敏度,设置你对传感器的要求,是需要极其敏锐,还是没有太高要求,此处我们取普通NORMAL
就行。
重点我们看一下SensorEventListener
里面的方法,一个叫onSensorChanged
,表示传感器数据变化。另一个叫onAccuracyChanged
,表示传感器精度变化。
我们只要数据变化就行。我们说过Android SDK给传感器搞了个大集成,所以此处的SensorEvent event
是一个通用的参数,对于距离传感器来说,event.values[0]
就是距离的数值。
所以,距离近时,就给图片设置小猪睡觉的图片,距离远时就给小猪设置作妖的图片。
if (event.values[0] == 0.0) {
// 0 表示距离较近
imageView.setImageResource(R.mipmap.sleep);
} else {
imageView.setImageResource(R.mipmap.active);
}
复制代码
唉,会技术就是这么的高雅和朴实!
最后
我是TF男孩,关注我的掘金专栏《Java转Android》。日读1000字,30天可入门安卓开发。
本文掘金社区独家发布,转载请注明出处。