Android 摇一摇终极解决方案


根据手机型号的不同,对于摇一摇灵敏度反应也不同,通过自己写的ShakeListener 可以完美控制灵敏度

注意 在aictivity中的onResume 和onPause 方法中需要调用帮顶和解绑方法


import android.content.Context;

import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.widget.Toast;


public class ShakeListener implements SensorEventListener {
private static final int FORCE_THRESHOLD = 1200;
private static final int TIME_THRESHOLD = 100;

private SensorManager mSensorMgr;
private float mLastX = -1.0f, mLastY = -1.0f, mLastZ = -1.0f;
private long mLastTime;
private OnShakeListener mShakeListener;
private Context mContext;


public interface OnShakeListener {
public void onShake();
}


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 = false;
try {
supported = mSensorMgr.registerListener(this,
mSensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_GAME);
} catch (Exception e) {
Toast.makeText(mContext, "Shaking not supported", Toast.LENGTH_LONG)
.show();
}


if ((!supported) && (mSensorMgr != null))
mSensorMgr.unregisterListener(this);
}


public void pause() {
if (mSensorMgr != null) {
mSensorMgr.unregisterListener(this);
mSensorMgr = null;
}
}


public void onAccuracyChanged(Sensor sensor, int accuracy) {
}


public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() != Sensor.TYPE_ACCELEROMETER)
return;
long now = System.currentTimeMillis();


if ((now - mLastTime) > TIME_THRESHOLD) {
long diff = now - mLastTime;
float speed = Math.abs(event.values[0] + event.values[1]
+ event.values[2] - mLastX - mLastY - mLastZ)
/ diff * 10000;


if (speed > FORCE_THRESHOLD) {
mShakeListener.onShake();
}
mLastTime = now;
mLastX = event.values[0];
mLastY = event.values[1];
mLastZ = event.values[2];
}
}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值