实战第13篇:Sensor距离传感器实现小猪睡觉趣味App

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第13天,点击查看活动详情


一、展示效果

本次实战项目,利用Android中的距离传感器,开发一个小猪睡觉的趣味应用,靠近小猪,它就睡觉;你一离开,它就作妖。可用于哄娃,效果如下:

视频21.gif

二、源码放送

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

距离传感器是一个小硬件,广泛应用于智能手机,一般位于听筒附近,当接通电话时,手机距离耳朵较近,此时容易出现误操作现象(如面部易挂断电话,脸大者的苦恼),因此就需要对距离进行关注,避免误操作的发生。

智能手机上使用的距离传感器大多是红外距离传感器。

image.png

当发射管发出的红外线被接收管接收到时,表明距离较近,而当接收管接收不到发射管发射的红外线时,表明距离较远。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);
}
复制代码

唉,会技术就是这么的高雅和朴实!

视频21.gif

最后

我是TF男孩,关注我的掘金专栏《Java转Android》。日读1000字,30天可入门安卓开发。

本文掘金社区独家发布,转载请注明出处。

猜你喜欢

转载自juejin.im/post/7131152469802876941