Android开发学习之路--传感器之初体验
2016-02-22 22:02
435 查看
说到传感器,还是有很多的,有加速度啊,光照啊,磁传感器等等。当然android手机之所以称为智能手机,少不了这几款传感器的功劳了。下面就学习下了,这里主要学习光照,加速度和磁。
新建工程emSensorStudy,布局如下:
添加LightSensor,AccelerSensor,MagnetiSensor的Activity,修改MainActivity代码如下:
先要实现Light的功能,先修改布局如下:
简单地实现了一个textview用来显示光照强度。接着修改LightSensor代码如下:
这里先通过getSystemService获取sensor,然后通过注册一个listener来监听传感器的变化,当值有变化的时候会调用onSensorChanged方法,具体运行后,用手遮挡听筒附近的传感器,显示如下:
从上可见光照的效果很明显了。接着我们来试下加速度传感器。这里实现微信摇一摇功能,并且成功了震动。
修改布局如下:
接着添加代码如下:
这里的代码和LightSensor的代码差不多,主要是当三个方向的加速度大于19的时候就表示在摇动了,然后震动下手机就ok了。效果如下:
最后来学习下magneticSensor了。这里实现个compass。首先就是提供一张图片了,修改布局如下:
接着就是修改MagneticSensor的代码了:
这里通过加速度和磁传感器来实现一个方向,因为方向传感器官方已经不提倡使用了。运行效果如下:
传感器就先学习这些了。
附:参考《第一行代码》
新建工程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) { } }; }
这里通过加速度和磁传感器来实现一个方向,因为方向传感器官方已经不提倡使用了。运行效果如下:
传感器就先学习这些了。
附:参考《第一行代码》
相关文章推荐
- android之service,你应该知道的一切
- Android.mk 简析
- 【一天搞定了,哈哈~】部署应用程序到android手机,adb命令
- android正式包点击Home键切出应用后再点击桌面图标返回导致应用重启问题
- Menu
- android开发加速
- 5个Android开发中比较常见的内存泄漏问题及解决办法
- android样式布局--->ListView(附上源代码)
- 【Android】自定义View -- 条形图(柱状图)
- android 解码出来的视频frame数据,是如何一步步的传递到显示端的(使用hwc composer online 合成)
- android读取联系人,短信,通话记录,IMSI
- Android获取Context(任意位置任意地方,全局上下文)
- Android群英传笔记——摘要,概述,新的出发点,温故而知新,可以为师矣!
- Android群英传笔记——摘要,概述,新的出发点,温故而知新,可以为师矣!
- Android Xpose Hook(一)
- [android] 创建模拟器遇到的常见错误
- Android util 整理篇(一)获取当前环境是否是中文
- Android学习-四大组件(ContentProvider)
- 自定义Android中EditText中的Hint文本的大小
- Android笔记之属性动画