• Android开发学习之路--传感器之初体验


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

        新建工程emSensorStudy,布局如下:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:layout_margin="5dp"
        tools:context="com.jared.emsensorsstudy.MainActivity">
    
        <TextView
            android:text="Hello Sensors"
            android:layout_gravity="center"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="22dp"/>
    
        <Button
            android:id="@+id/startLightSensor"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="启动LightSensor"
            android:textAllCaps="false"/>
    
        <Button
            android:id="@+id/startAccelerSensor"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="启动AccelerSensor"
            android:textAllCaps="false"/>
    
        <Button
            android:id="@+id/startMagneticSensor"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="启动MagneticSensor"
            android:textAllCaps="false"/>
    </LinearLayout>
    

        添加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的功能,先修改布局如下:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="10dp"
        tools:context="com.jared.emsensorsstudy.LightSensor">
    
        <TextView
            android:id="@+id/light_level"
            android:layout_gravity="center"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="22dp"/>
    
    </LinearLayout>
    

        简单地实现了一个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方法,具体运行后,用手遮挡听筒附近的传感器,显示如下:

         

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

        修改布局如下:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:layout_margin="10dp"
        tools:context="com.jared.emsensorsstudy.AccelerSensor">
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="摇一摇获取更多哦!"
            android:layout_gravity=""
            android:textSize="22dp"/>
    
        <TextView
            android:id="@+id/shack"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:textSize="22dp"/>
    
    </LinearLayout>
    

        接着添加代码如下:

    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。首先就是提供一张图片了,修改布局如下:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="10dp"
        tools:context="com.jared.emsensorsstudy.MagneticSensor">
    
        <ImageView
            android:id="@+id/compass_img"
            android:layout_width="250dp"
            android:layout_height="250dp"
            android:layout_centerInParent="true"
            android:src="@drawable/compass" />
    
    </RelativeLayout>
    

        接着就是修改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) {
    
            }
        };
    }
    

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


        传感器就先学习这些了。


    附:参考《第一行代码》

  • 相关阅读:
    Masonry复杂ScrollView布局
    Masonry scrollview循环布局
    Masonry tableviewCell布局
    Masonry 比例(multipliedBy)
    Masonry自动布局:复合约束
    Masonry整体动画更新约束
    Masonry remake更新约束
    Masonry 动画更新约束
    Masonry基本用法
    Spring Quartz 和 Spring Task使用比较
  • 原文地址:https://www.cnblogs.com/wuyida/p/6299951.html
Copyright © 2020-2023  润新知