博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android开发学习之路--传感器之初体验
阅读量:4464 次
发布时间:2019-06-08

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

    说到传感器,还是有很多的,有加速度啊,光照啊,磁传感器等等。当然android手机之所以称为智能手机,少不了这几款传感器的功劳了。下面就学习下了,这里主要学习光照,加速度和磁。

    新建工程emSensorStudy,布局如下:

    添加LightSensor,AccelerSensor,MagnetiSensor的Activity,修改MainActivity代码如下:

package com.jared.emsensorsstudy;import android.content.Intent;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.Button;public class MainActivity extends AppCompatActivity {    private Button startLightSensorBtn;    private Button startAccelerSensorBtn;    private Button startMagneticSensorBtn;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        startLightSensorBtn = (Button)findViewById(R.id.startLightSensor);        startAccelerSensorBtn = (Button)findViewById(R.id.startAccelerSensor);        startMagneticSensorBtn = (Button)findViewById(R.id.startMagneticSensor);        startLightSensorBtn.setOnClickListener(new myOnClickListener());        startAccelerSensorBtn.setOnClickListener(new myOnClickListener());        startMagneticSensorBtn.setOnClickListener(new myOnClickListener());    }    private class myOnClickListener implements View.OnClickListener {        @Override        public void onClick(View view) {            switch (view.getId()) {                case R.id.startAccelerSensor:                    Intent intent1 = new Intent(getApplicationContext(), AccelerSensor.class);                    startActivity(intent1);                    break;                case R.id.startLightSensor:                    Intent intent2 = new Intent(getApplicationContext(), LightSensor.class);                    startActivity(intent2);                    break;                case R.id.startMagneticSensor:                    Intent intent3 = new Intent(getApplicationContext(), MagneticSensor.class);                    startActivity(intent3);                    break;                default:                    break;            }        }    }}
    先要实现Light的功能,先修改布局如下:

    简单地实现了一个textview用来显示光照强度。接着修改LightSensor代码如下:

package com.jared.emsensorsstudy;import android.content.Context;import android.hardware.Sensor;import android.hardware.SensorEvent;import android.hardware.SensorEventListener;import android.hardware.SensorManager;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.widget.TextView;public class LightSensor extends AppCompatActivity {    private SensorManager sensorManager;    private TextView lightLevel;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_light_sensor);        lightLevel = (TextView)findViewById(R.id.light_level);        initWithLight();    }    @Override    protected void onDestroy() {        super.onDestroy();        if(sensorManager != null) {            sensorManager.unregisterListener(listener);        }    }    public void initWithLight() {        sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);        Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);        sensorManager.registerListener(listener, sensor, SensorManager.SENSOR_DELAY_NORMAL);    }    private SensorEventListener listener = new SensorEventListener() {        @Override        public void onSensorChanged(SensorEvent sensorEvent) {            float value = sensorEvent.values[0];            lightLevel.setText("Currrent light level is "+value+"lx");        }        @Override        public void onAccuracyChanged(Sensor sensor, int i) {        }    };}
    这里先通过getSystemService获取sensor,然后通过注册一个listener来监听传感器的变化,当值有变化的时候会调用onSensorChanged方法,具体运行后,用手遮挡听筒附近的传感器,显示如下:

     

    从上可见光照的效果很明显了。接着我们来试下加速度传感器。这里实现微信摇一摇功能,并且成功了震动。

    修改布局如下:

    接着添加代码如下:

package com.jared.emsensorsstudy;import android.content.Context;import android.hardware.Sensor;import android.hardware.SensorEvent;import android.hardware.SensorEventListener;import android.hardware.SensorManager;import android.os.Bundle;import android.os.Vibrator;import android.support.v7.app.AppCompatActivity;import android.widget.TextView;public class AccelerSensor extends AppCompatActivity {    private SensorManager sensorManager;    private TextView shackPhone;    private Vibrator vibrator;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_acceler_sensor);        shackPhone = (TextView)findViewById(R.id.shack);        initWithAcceler();    }    @Override    protected void onDestroy() {        super.onDestroy();        if(sensorManager != null) {            sensorManager.unregisterListener(listener);        }    }    private void initWithAcceler() {        sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);        Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);        sensorManager.registerListener(listener, sensor, SensorManager.SENSOR_DELAY_NORMAL);        vibrator = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE);    }    private SensorEventListener listener = new SensorEventListener() {        @Override        public void onSensorChanged(SensorEvent sensorEvent) {            float xValue = Math.abs(sensorEvent.values[0]);            float yValue = Math.abs(sensorEvent.values[1]);            float zValue = Math.abs(sensorEvent.values[2]);            int medumValue = 19;            if(xValue > medumValue || yValue > medumValue || zValue > medumValue) {                vibrator.vibrate(200);                shackPhone.setText("恭喜你摇一摇成功,新年快乐!");            } else {                //Toast.makeText(getApplicationContext(), "请使劲摇哦!", Toast.LENGTH_SHORT).show();            }        }        @Override        public void onAccuracyChanged(Sensor sensor, int i) {        }    };}
    这里的代码和LightSensor的代码差不多,主要是当三个方向的加速度大于19的时候就表示在摇动了,然后震动下手机就ok了。效果如下:

    

   最后来学习下magneticSensor了。这里实现个compass。首先就是提供一张图片了,修改布局如下:

    接着就是修改MagneticSensor的代码了:

package com.jared.emsensorsstudy;import android.content.Context;import android.hardware.Sensor;import android.hardware.SensorEvent;import android.hardware.SensorEventListener;import android.hardware.SensorManager;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.animation.Animation;import android.view.animation.RotateAnimation;import android.widget.ImageView;public class MagneticSensor extends AppCompatActivity {    private SensorManager sensorManager;    private ImageView compassImage;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_magnetic_sensor);        compassImage = (ImageView)findViewById(R.id.compass_img);        initWithCompass();    }    @Override    protected void onDestroy() {        super.onDestroy();        sensorManager.unregisterListener(listener);    }    private void initWithCompass() {        sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);        Sensor magneticSensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);        Sensor acclerSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);        sensorManager.registerListener(listener, magneticSensor, SensorManager.SENSOR_DELAY_GAME);        sensorManager.registerListener(listener, acclerSensor, SensorManager.SENSOR_DELAY_GAME);    }    private SensorEventListener listener = new SensorEventListener() {        float[] acclerValues = new float[3];        float[] magneticValues = new float[3];        private float lastRotateDegree;        @Override        public void onSensorChanged(SensorEvent sensorEvent) {            switch (sensorEvent.sensor.getType()) {                case Sensor.TYPE_ACCELEROMETER:                    acclerValues = sensorEvent.values.clone();                    break;                case Sensor.TYPE_MAGNETIC_FIELD:                    magneticValues = sensorEvent.values.clone();                    break;                default:                    break;            }            float[] values = new float[3];            float[] R = new float[9];            //调用getRotaionMatrix获得变换矩阵R[]              SensorManager.getRotationMatrix(R, null, acclerValues, magneticValues);            SensorManager.getOrientation(R, values);            //经过SensorManager.getOrientation(R, values);得到的values值为弧度            //转换为角度            float rotateDegree = -(float)Math.toDegrees(values[0]);            if(Math.abs(rotateDegree - lastRotateDegree) > 2) {                RotateAnimation animation = new RotateAnimation(                  lastRotateDegree, rotateDegree, Animation.RELATIVE_TO_SELF, 0.5f,                        Animation.RELATIVE_TO_SELF, 0.5f);                animation.setFillAfter(true);                compassImage.startAnimation(animation);                lastRotateDegree = rotateDegree;            }        }        @Override        public void onAccuracyChanged(Sensor sensor, int i) {        }    };}

    这里通过加速度和磁传感器来实现一个方向,因为方向传感器官方已经不提倡使用了。运行效果如下:

    传感器就先学习这些了。

附:参考《第一行代码》

转载于:https://www.cnblogs.com/wuyida/p/6299951.html

你可能感兴趣的文章
java annotation
查看>>
小程序获取当前页面路径
查看>>
ecos中断机制分析(1)
查看>>
shift:清除前一个参数
查看>>
学点编码知识又不会死:Unicode的流言终结者和编码大揭秘
查看>>
Oracle EBS 根据工作日历取工作日
查看>>
Android中通过typeface设置字体
查看>>
【Android】Android内存机制,了解Android堆和栈
查看>>
Java fail-fast 与 fail-safe 机制对比
查看>>
霍兰德- 职业兴趣测评
查看>>
html中返回上一页
查看>>
jQuery.extend函数详细用法
查看>>
20172311 2017-2018-2 《程序设计与数据结构》第五周学习总结
查看>>
zabbix 的学习应用之路
查看>>
Xcode使用技巧
查看>>
题目15:这么多作业,似乎压力很大啊! 请看TED 的演讲, 谈谈你对压力的看法,以及怎么和别人合作, 帮助别人,把压力转化为动力,在互相帮助的环境中成长。...
查看>>
linux上安装Laravel
查看>>
C语言进阶——有符号与无符号02
查看>>
高速收录之利用赶集、百姓、58同城网实现外链
查看>>
NetBeans 使用远程Git库
查看>>