Created
March 11, 2013 12:05
-
-
Save oa414/5133791 to your computer and use it in GitHub Desktop.
侦测Android加速度传感器
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| package com.example.AdmobTest; | |
| import android.content.Context; | |
| import android.hardware.Sensor; | |
| import android.hardware.SensorEvent; | |
| import android.hardware.SensorEventListener; | |
| import android.hardware.SensorManager; | |
| import android.util.Log; | |
| import android.widget.TextView; | |
| import java.util.Random; | |
| /** | |
| * Created with IntelliJ IDEA. | |
| * User: linxiangyu | |
| * Date: 13-3-11 | |
| * Time: 下午7:24 | |
| * To change this template use File | Settings | File Templates. | |
| */ | |
| public abstract class ShakeListener implements SensorEventListener { | |
| /** | |
| * | |
| * Usage: | |
| * new ShakeListener(this){ | |
| * @Override | |
| * void update() { | |
| * Toast.makeText(MyActivity.this, "shake detected w/ speed: " + mSpeed, Toast.LENGTH_SHORT).show(); | |
| * } | |
| * }.init(); | |
| * | |
| */ | |
| SensorManager mSensorMgr ; | |
| Context context; | |
| private int SHAKE_THRESHOLD = 6000; //摇动力度 | |
| private int LISTENER_TIME_GAP = 50; // 检测时间间隔,单位ms | |
| long lastUpdate,lastShakeTime = 0; | |
| float x,y,z, last_x = 0,last_y, last_z = 0; | |
| float mSpeed; | |
| protected ShakeListener(Context context) { | |
| this.context = context; | |
| } | |
| public void init(){ | |
| //初始化SensorManager | |
| mSensorMgr = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE); | |
| mSensorMgr.registerListener(this, mSensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_GAME); | |
| } | |
| public void init(int SENSOR_DELAY_TYPE){ | |
| /** | |
| * in SensorMananger class: | |
| * | |
| * int SENSOR_DELAY_FASTEST get sensor data as fast as possible | |
| * int SENSOR_DELAY_GAME rate suitable for games | |
| * int SENSOR_DELAY_NORMAL rate (default) suitable for screen orientation changes | |
| * int SENSOR_DELAY_UI rate suitable for the user interface | |
| */ | |
| mSensorMgr = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE); | |
| mSensorMgr.registerListener(this, mSensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SENSOR_DELAY_TYPE); | |
| } | |
| @Override | |
| public void onSensorChanged(SensorEvent event) { | |
| float[] values = event.values; | |
| if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { | |
| long curTime = System.currentTimeMillis(); | |
| if ((curTime - lastUpdate) > LISTENER_TIME_GAP) { | |
| long diffTime = (curTime - lastUpdate); | |
| lastUpdate = curTime; | |
| x = values[SensorManager.DATA_X]; | |
| y = values[SensorManager.DATA_Y]; | |
| z = values[SensorManager.DATA_Z]; | |
| //计算摇动的速度 | |
| float speed = Math.abs(x+y+z - last_x - last_y - last_z) / diffTime * 10000; | |
| mSpeed = speed; | |
| if (speed > SHAKE_THRESHOLD) { | |
| Log.d("sensor", "shake detected w/ speed: " + speed); | |
| // Toast.makeText(this, "shake detected w/ speed: " + speed, Toast.LENGTH_SHORT).show(); | |
| update(); | |
| } | |
| last_x = x; | |
| last_y = y; | |
| last_z = z; | |
| } | |
| } | |
| } | |
| @Override | |
| public void onAccuracyChanged(Sensor sensor, int accuracy) { | |
| } | |
| abstract void update(); | |
| public void setListenTimeGap(int LISTENER_TIME_GAP) { | |
| this.LISTENER_TIME_GAP = LISTENER_TIME_GAP; | |
| } | |
| public void setShakeThreshold(int SHAKE_THRESHOLD) { | |
| this.SHAKE_THRESHOLD = SHAKE_THRESHOLD; | |
| } | |
| public SensorManager getmSensorManager() { | |
| return mSensorMgr; | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment