Android手机摇一摇的实现SensorEventListener
生活随笔
收集整理的這篇文章主要介紹了
Android手机摇一摇的实现SensorEventListener
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Android手機(jī)搖一搖的實(shí)現(xiàn)SensorEventListener 看實(shí)例
package com.example.shakeactivity;import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;public class ShakeListener implements SensorEventListener {/* Sensor 說(shuō)明
* Sensor.TYPE_ACCELEROMETER 加速度感應(yīng)檢測(cè)
* Sensor.TYPE_MAGNETIC_FIELD 磁場(chǎng)感應(yīng)檢測(cè)
* Sensor.TYPE_ORIENTATION 方位感應(yīng)檢測(cè)
* Sensor.TYPE_GYROSCOPE 回轉(zhuǎn)儀感應(yīng)檢測(cè)
* Sensor.TYPE_LIGHT 亮度感應(yīng)檢測(cè)
* Sensor.TYPE_PRESSURE 壓力感應(yīng)檢測(cè)
* Sensor.TYPE_TEMPERATURE 溫度感應(yīng)檢測(cè)
* Sensor.TYPE_PROXIMITY 接近感應(yīng)檢測(cè)* SENSOR_DELAY_FASTEST 最低延遲,一般不是特別敏感的處理不推薦使用,該種模式可能造成手機(jī)電力大量消耗,由于傳遞的為原始數(shù)據(jù),算法不處理好將會(huì)影響游戲邏輯和UI的性能,所以不推薦使用。
* SENSOR_DELAY_GAME 游戲延遲,一般絕大多數(shù)的實(shí)時(shí)性較高的游戲都使用該級(jí)別
* SENSOR_DELAY_NORMAL 標(biāo)準(zhǔn)延遲,對(duì)于一般的益智類(lèi)或EASY級(jí)別的游戲可以使用,但過(guò)低的采樣率可能對(duì)一些賽車(chē)類(lèi)游戲有跳幀現(xiàn)象。
* SENSOR_DELAY_UI 用戶(hù)界面延遲,一般對(duì)于屏幕方向自動(dòng)旋轉(zhuǎn)使用,相對(duì)節(jié)省電能和邏輯處理,一般游戲開(kāi)發(fā)中我們不使用。
*/
private static final int FORCE_THRESHOLD = 350;
private static final int TIME_THRESHOLD = 100;
private static final int SHAKE_TIMEOUT = 500;
private static final int SHAKE_DURATION = 1000;
private static final int SHAKE_COUNT = 6;private SensorManager mSensorMgr;
private float mLastX = -1.0f, mLastY = -1.0f, mLastZ = -1.0f;
private long mLastTime;
private OnShakeListener mShakeListener;
private Context mContext;
private int mShakeCount = 0;
private long mLastShake;
private long mLastForce;public interface OnShakeListener {
public void onShake();
//public void onShakeHorizontal();
//public void onShakeVertical();
}public ShakeListener(Context context) {
mContext = context;
resume();
}public void setOnShakeListener(OnShakeListener listener) {
mShakeListener = listener;
}public void resume() {
mSensorMgr = (SensorManager) mContext
.getSystemService(Context.SENSOR_SERVICE);
if (mSensorMgr == null) {
throw new UnsupportedOperationException("Sensors not supported");
}boolean supported = mSensorMgr.registerListener(this, mSensorMgr
.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_UI);
if (!supported) {
mSensorMgr.unregisterListener(this);
throw new UnsupportedOperationException(
"Accelerometer not supported");
}
}public void pause() {
if (mSensorMgr != null) {
mSensorMgr.unregisterListener(this);
mSensorMgr = null;
}
}@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {}@SuppressWarnings("deprecation")
@Override
public void onSensorChanged(SensorEvent event) {if (event.sensor.getType() != Sensor.TYPE_ACCELEROMETER) {
return;
}long now = System.currentTimeMillis();if ((now - mLastForce) > SHAKE_TIMEOUT) {
mShakeCount = 0;
}if ((now - mLastTime) > TIME_THRESHOLD) {
long diff = now - mLastTime;
float speed = Math.abs(event.values[SensorManager.DATA_X]
+ event.values[SensorManager.DATA_Y]
+ event.values[SensorManager.DATA_Z] - mLastX - mLastY - mLastZ)
/ diff * 10000;
if (speed > FORCE_THRESHOLD) {
if ((++mShakeCount >= SHAKE_COUNT)
&& (now - mLastShake > SHAKE_DURATION)) {
mLastShake = now;
mShakeCount = 0;
if (mShakeListener != null) {
mShakeListener.onShake();
}
}
mLastForce = now;
}
mLastTime = now;
mLastX = event.values[SensorManager.DATA_X];
mLastY = event.values[SensorManager.DATA_Y];
mLastZ = event.values[SensorManager.DATA_Z];
}
}
} 將上面的內(nèi)容保存為ShakeActivity.java文件,在 MainActivity.java 使用以下方法
ShakeListener mShaker = new ShakeListener(this);
mShaker.setOnShakeListener(new ShakeListener.OnShakeListener() {
public void onShake() {
// action while shaking
setTextView("shaked");
}
});
總結(jié)
以上是生活随笔為你收集整理的Android手机摇一摇的实现SensorEventListener的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Android应用中,去掉Activit
- 下一篇: 使用border-collapse:co