Android手机摇一摇的实现SensorEventListener
2015-12-29 11:54
633 查看
Android手机摇一摇的实现SensorEventListener
看实例
将上面的内容保存为ShakeActivity.java文件,在 MainActivity.java 使用以下方法
看实例
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"); } });
相关文章推荐
- Android应用中,去掉Activity标题栏以及状态栏
- Android新增Activity,并实现多Activity之间的切换
- Android 给按钮绑定事件
- 解决Android 启动模拟器是出现“Failed to allocate memory: 8”错误提示
- Android仿UC浏览器左右上下滚动功能
- Android 开源框架Universal-Image-Loader完全解析(二)--- 图片缓存策略详解
- Android获得文件的mimeType
- 【Android】获取要paint的文字的宽高 paint draw text get width
- android eclipse代码混淆
- Android6.0 init.rc中创建符号链接失败问题
- Android判断是否触发ellipsize="end"(即textview是否换行)
- 使用Gradle构建Android项目
- Android Camera 分析 1
- 基于Ubuntu 14.04 LTS编译Android4.4.2源代码
- android手机获取手机号
- Android Studio你不知道的调试技巧
- Android 应用测试总结
- 怎么样终止一个线程呢?
- Android仿Win8界面开发
- android log4使用