1. 程式人生 > >Android手機搖一搖的實現SensorEventListener

Android手機搖一搖的實現SensorEventListener

fas exceptio change interface var cti com android手機 模式

Android手機搖一搖的實現SensorEventListener 看實例
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 說明
* Sensor.TYPE_ACCELEROMETER 加速度感應檢測
* Sensor.TYPE_MAGNETIC_FIELD 磁場感應檢測
* Sensor.TYPE_ORIENTATION 方位感應檢測
* Sensor.TYPE_GYROSCOPE 回轉儀感應檢測
* Sensor.TYPE_LIGHT 亮度感應檢測
* Sensor.TYPE_PRESSURE 壓力感應檢測
* Sensor.TYPE_TEMPERATURE 溫度感應檢測
* Sensor.TYPE_PROXIMITY 接近感應檢測

* SENSOR_DELAY_FASTEST 最低延遲。一般不是特別敏感的處理不推薦使用,該種模式可能造成手機電力大量消耗。因為傳遞的為原始數據,算法不處理好將會影響遊戲邏輯和UI的性能,所以不推薦使用。

* SENSOR_DELAY_GAME 遊戲延遲,一般絕大多數的實時性較高的遊戲都使用該級別 * SENSOR_DELAY_NORMAL 標準延遲,對於一般的益智類或EASY級別的遊戲能夠使用,但過低的採樣率可能對一些賽車類遊戲有跳幀現象。

* SENSOR_DELAY_UI 用戶界面延遲。一般對於屏幕方向自己主動旋轉使用,相對節省電能和邏輯處理,一般遊戲開發中我們不使用。 */ 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]; } } }

將上面的內容保存為ShakeActivity.java文件,在 MainActivity.java 使用下面方法
ShakeListener mShaker = new ShakeListener(this);
mShaker.setOnShakeListener(new ShakeListener.OnShakeListener() {
public void onShake() {
// action while shaking
setTextView("shaked");
}
});
‘).addClass(‘pre-numbering‘).hide(); $(this).addClass(‘has-numbering‘).parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($(‘
  • ‘).text(i)); }; $numbering.fadeIn(1700); }); });

    Android手機搖一搖的實現SensorEventListener